[RouterOS + Raspberry Pi]_使用ROS Netwatch Scrpit + Raspberry Pi 達成站台Failover備援功效

外面的網站往往可以看到要站台維護或者下線更新時,會有一個提示使用者畫面,

 

但會納悶…一定是有一台機器專門接管連線才會吐維護畫面才對吧?

 

如果好一點的網站,則會用VM HA無縫轉移,提供不斷線的服務

可是今天自己硬體設備沒辦法做到無縫轉移持續上線的網站,那總得呈現一個優雅的畫面給USER…

 

假如今天我的BLOG也就是www.ntex.tw對應的ip,進來80 port,會是直接到我的Server上的一台VM處理並回傳網頁給CLIENT

但今天若那台Server下線維護,在VM轉移到另一台機器過程中,勢必此時80 port網頁會直接丟404或者time out連線不到任何東西

 

所以要解決這個辦法,這裡用的就是Raspberry Pi當作這台”優雅”顯示斷線的Server,當主要的Server離線了

他可以立刻接上80port提供一個”優雅”的404網頁…讓user不會覺得莫名其妙。

failover2

 

但單憑RPi 2是做不到這件事的…

還得靠區域網路內的gateway也就是RouterOS(我這是RB450G擔任這個腳色),來做Network Failover detection才行。

 

上01問了一下高手們,得到的解法是使用Netwatch配上Script

晚上試了一下,有成功work~,筆記分享一下

 

=========RouterOS的部分=========

1.打開Winbox,Tool->Netwatch

新增一個Netwatch,會看到

Host:填入妳的主要Server,

Interval:偵測時間,盡量短一點,我是設定5秒

Timeout:5秒一到,做偵測(應該是ping?),預設1秒timeout,down時會立即執行down頁面所寫的script

2015-03-01_23-42-11

 

2.分別填入up跟down的script,我這裡提供我自己的範例,請依照自己的需求作修改

 

首先先是down的動作,也就是Server斷線要by-pass到raspberry pi的動作:

/ip firewall mangle set [find connection-mark="TEST_conn" && src-address="192.168.1.51" && chain="prerouting"] src-address=192.168.1.81

/ip firewall nat set [find in-interface="NTL PPPoE" && dst-port="80"  && chain="dstnat"] to-addresses=192.168.1.81

 

一般人應該只需要nat那一條(第二條),我會有mangle是因為我有dual wan,要轉封包到同一個區域網路才做,這裡不解釋

只解釋第二行,找到firewall裡面nat頁面的規則,輸入interface來自名稱NTL PPPoE(請自行改),且port為80,把這條規則的address從192.168.1.51轉到.81去

 

若Server上線了,他則會跑up的動作:

/ip firewall mangle set [find connection-mark="TEST_conn" && src-address="192.168.1.81" && chain="prerouting"] src-address=192.168.1.51

/ip firewall nat set [find in-interface="NTL PPPoE" && dst-port="3000"  && chain="dstnat"] to-addresses=192.168.1.51

 

其實跟down的動作一樣,只是把ip全部互換…讓規則恢復原來的樣子,讓網頁又重新由主要的Server負責。

 

這樣RouterOS就告一段落了。

 

 

=========RPi的部分=========

 

RPi既然只是負責顯示404的頁面,自然不要裝一些有的沒的搞得太複雜會比較好一點

這裡用apache2當web server

 

1.安裝apache2

sudo apt-get install apache2

 

2.編輯/etc/apache2/apache2.conf,加入404頁面的轉向畫面在最後一行加入(你可以先搜尋啦…但我這邊預設裝是沒有這行的):

ErrorDocument 404 /default_404_page.html

 

 

要呈現404畫面的page名子隨便你,路徑呢?放在/var/www/default_404_page.html就可以了

這邊直接用default站台,建議這個404page其實可以改名為index.html(上面apache2.conf的ErrorDocument 404 記得也要改成index.html)

why?…妳的內容可以填網站維護中,請稍後在試之類的字眼或內容

 

但為甚麼要變成index.html其實是有原因的

 

當user是直接進入www.ntex.tw,這時如果Server掛點,導入RPi的連線會讀取/var/www/index.html的內容。

而如果有個user很開心地看著你的網站中的其中一個頁面,www.ntex.tw/page/123好了,這時Server噴了,RPi接手,user這時想看www.ntex.tw/page/124的時候

這時其實會被轉到RPi設定的404頁面中。

 

所以如果你的404頁面並沒有設定跟/var/www/index.html一樣,這樣會出現兩種版本

一種是瀏覽www.ntex.tw這個網址顯示index.html

而瀏覽www.ntex.tw/xxxxxx/xxxx…下面目錄的則會讀取妳的404page。

 

除非你index page想要幹嘛啦,要不然這裡我都設為index.html,統一讓user redirect到同個page.

 

另外要注意的是,如果你的404 page必須要大於512個字元,否則IE預設看到內容SOURCE CODE少於512字元,會被判斷成不友善的404 PAGE…

直接吐給你他預設的,這點要注意,因為我只打了短短幾個,測了一下子測不出來才發現有這回事XD

 

所以你如果要直接指向/var/www/index.html,這時index.html的內容也需要注意長度。

 

3.重啟apache

sudo service apache2 restart

 

 

這時你就可開關Server網路做一下測試~,當Server斷線,5秒被偵測到之後則會執行ROS上面NETWATCH 所寫的DOWN腳本

而若Server連線,比較有趣的是ROS是會立即的偵測到,並且執行UP腳本,將規則改回

 

如此一來就達到Network forwarding failover的功效啦!

 

 

 

thx for:

http://www.mobile01.com/topicdetail.php?f=110&t=3205444&p=325#54666821

http://wiki.mikrotik.com/wiki/Manual:Tools/Netwatch

http://downager.blogspot.tw/2013/09/routeros-netwatch.html

http://www.ahlinux.com/apache/1299.html

http://harryvic.pixnet.net/blog/post/27518824-apache-%E7%9B%AE%E9%8C%84%E7%80%8F%E8%A6%BD%E7%A6%81%E6%AD%A2-%26-404%E9%A0%81%E9%9D%A2%E8%A8%AD%E5%AE%9A

2 Comments

  1. Netwatch 只能做 ping 如果www.ntex.tw 網頁掛了 ?
    用 torch 抓網頁其中一個內容比對比較恰當

    • 這是比較嚴謹的方式,不過目前導向的WEBSERVER死掉的機率”比較”小
      但其VM若重開做更新或者HOST重開時,整台ICMP沒回應的機率比較大

      後來才發現有fetch可以做,應該會比torch來的單純些

      謝謝提供意見~~~

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料