[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不會覺得莫名其妙。
但單憑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
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
Netwatch 只能做 ping 如果www.ntex.tw 網頁掛了 ?
用 torch 抓網頁其中一個內容比對比較恰當
這是比較嚴謹的方式,不過目前導向的WEBSERVER死掉的機率”比較”小
但其VM若重開做更新或者HOST重開時,整台ICMP沒回應的機率比較大
後來才發現有fetch可以做,應該會比torch來的單純些
謝謝提供意見~~~