【拯救趙明】網絡安全解決方案

在家上51cto時隨意點了一個連接,然後看到“拯救趙明”的帖子,發現趙明此時公司的網絡拓撲圖中存在很多
問題:

1、負責均衡器存在單點故障
2、缺少收集日誌系統
3、缺少專業的IPS系統
4、數據庫沒有主從之分,不存在負載
5、缺少Webserver健康檢查系統

經分析調整後的架構圖如下:


此架構說明:
1、使用兩臺nginx實現負載均衡器,解決了單點故障、高併發問題,
2、數據庫採用負載均衡,通過開發語言調用memcached緩存數據,從而大大降低了數據庫的壓力
3、增加了一臺多功能服務器,作用:
   (1)、用來檢查Webserver服務器的80狀態和首頁的狀態
   (2)、用來存放Webserver的數據文件,Webserver的網頁文件是多功能服務器通過推送方式
        傳到兩臺Webserver服務器相同目錄下的,推送方式用的是開源軟件rsync+intify,可
        以實時同步兩地數據,從而保證了原始數據的安全性;
   (3)、用來存放各個系統的日誌信息,監控故障通知功能

一、使用兩臺nginx做負載均衡服務器
    本來一開始是考慮用lvs+keepalived做負載均衡,可是一想它現在有很多缺點不能跟nginx
    相比,選用nginx的原因有以下幾點:
 
1、支持高併發連接:經官方測試可以跑到5w併發,在生產環境可以跑2w~3w的併發連接數
2、內存消耗少:nginx+PHP(fastcgi)服務在3w併發的連接下,開始10個nginx進程消耗150MB內
   存(15MB×10),開啓64個php-fgi的進程消耗1280MB內存(20MB×64),加上系統自身消耗的內存,
   總共消耗不到2GB。
3、成本低廉:nginx是遵循BSD開源協議,是一款免費開源的軟件。
4、其他理由:
   (1)、配置文件非常簡單易懂
   (2)、支持rewrite重寫規則
   (3)、內置了健康檢查功能
   (4)、支持GZIP壓縮,可以大大節省帶寬資源
   (5)、穩定性高
   (6)、支持熱部署,重啓服務不需要中斷服務
   (7)、高版本支持緩存功能,加上第三方的模塊,可以像squid一樣清除指定的url緩存

用兩臺nginx服務器做負載均衡,兩臺同時在線運行接受外部用戶的訪問,而不是一臺運行另一臺處於
空閒狀態,兩臺服務器的故障切換通過腳本切換。此種方案已經有人(張宴)用在生產環境中測試了,說
很穩定,現在寫出來和大家一起分享一下。

此腳本出自張宴之手,在此引用:
每臺負載均衡器各自綁定一個公網虛擬vip,

負載均衡器1vip:61.1.1.2
負載均衡器2vip:61.1.1.3
負載均衡器1真實ip:61.1.1.4
負載均衡器1真實ip:61.1.1.5
IDC公網網關:61.1.1.1

服務器1
/sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.2 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1

服務器2
/sbin/ifconfig eth0:1 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up
/sbin/route add -host 61.1.1.3 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1

兩個shell腳本 來實現自動故障轉移

nginx_ha1.sh,放在nginx負載均衡器1上:
#!/bin/bash
LANG=C
date=$(date -d "today" + "%Y-%m-%d %H:%M:%S")

function_bind_vip1()
{
    /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.2  dev eth0:ha1
}

function_bind_vip2()
{
    /sbin/ifconfig eth0:ha2 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.3  dev eth0:ha2
}

function_restart_nginx()
{
    kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
}

function_remove_vip1()
{
    /sbin/ifconfig eth0:ha1 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 down
}

function_remove_vip2()
{
    /sbin/ifconfig eth0:ha2 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 down
}

function_vip_arping1()
{
    /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 > /dev/null 2>&1
}

function_vip_arping2()
{
    /sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1 > /dev/null 2>&1
}

bind_time_vip1="N";
bind_time_vip2="N";

while true
do
    httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://61.1.1.4`
    httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://61.1.1.5`
    if [ x$httpcode_rip1 == "x200" ];
    then
        if [ $bind_time_vip1 == "N" ];
        then
        function_bind_vip1
        function_vip_arping1
        function_restart_nginx
        bind_time_vip1="Y"
        fi
        function_vip_arping1
    else
        if [ $bind_time_vip1 == "Y" ];
        then
        function_remove_vip1
        bind_time_vip1="N"
        fi
    fi
    if [ x$httpcode_rip2 == "x200" ];
    then
        if [ $bind_time_rip2 == "Y" ];
        then
        function_remove_vip2
        bind_time_vip2="N"
        fi

    else
        if [ $bind_time_vip2 == "N" ];
        then
        function_bind_vip2
        function_vip_arping2
        function_restart_nginx
        bind_time_vip2="Y"
        fi
        function_vip_arping2
    fi
    sleep 5
done
在nginx負載均衡器1將腳本駐留後臺運行:
nohup /bin/bash ./nginx_ha1.sh 2>&1 > /dev/null &

服務器2腳本 nginx_ha2.sh,部署在nginx負載均衡器上:

#!/bin/bash
LANG=C
date=$(date -d "today" + "%Y-%m-%d %H:%M:%S")

function_bind_vip1()
{
    /sbin/ifconfig eth0:ha1 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.3  dev eth0:ha1
}

function_bind_vip2()
{
    /sbin/ifconfig eth0:ha2 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up
    /sbin/route add -host 61.1.1.2  dev eth0:ha2
}

function_restart_nginx()
{
    kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
}

function_remove_vip1()
{
    /sbin/ifconfig eth0:ha1 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 down
}

function_remove_vip2()
{
    /sbin/ifconfig eth0:ha2 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 down
}

function_vip_arping1()
{
    /sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1 > /dev/null 2>&1
}

function_vip_arping2()
{
    /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1 > /dev/null 2>&1
}

bind_time_vip1="N";
bind_time_vip2="N";

while true
do
    httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://61.1.1.5`
    httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://61.1.1.4`
    if [ x$httpcode_rip1 == "x200" ];
    then
        if [ $bind_time_vip1 == "N" ];
        then
        function_bind_vip1
        function_vip_arping1
        function_restart_nginx
        bind_time_vip1="Y"
        fi
        function_vip_arping1
    else
        if [ $bind_time_vip1 == "Y" ];
        then
        function_remove_vip1
        bind_time_vip1="N"
        fi
    fi
    if [ x$httpcode_rip2 == "x200" ];
    then
        if [ $bind_time_rip2 == "Y" ];
        then
        function_remove_vip2
        bind_time_vip2="N"
        fi

    else
        if [ $bind_time_vip2 == "N" ];
        then
        function_bind_vip2
        function_vip_arping2
        function_restart_nginx
        bind_time_vip2="Y"
        fi
        function_vip_arping2
    fi
    sleep 5
done

在nginx負載均衡器2將腳本駐留後臺運行:
nohup /bin/bash ./nginx_ha2.sh 2>&1 > /dev/null &


關於web服務器用nginx而不用apache,請google一下就知道了,這裏就掠過了。

nginx負載均衡的配置請參考張宴的博客:http://blog.s135.com/post/306/

mysql負載均衡的配置請參考張宴的博客:http://blog.s135.com/post/379/ 和守住每一天的博客
http://liuyu.blog.51cto.com/183345/305145

關於多功能服務器所需的腳本,還在編寫測試中,等測試沒有問題了會貼出來與大家一起分享

【拯救趙明】安全方案:http://liuyu.blog.51cto.com/183345/305145 守住每一天 寫的已經很不錯了
它所用的軟件都是開源軟件。這樣可以爲企業可以節省很大的成本。我寫出來只是想在它的基礎上再加點
自己的見解。

熱愛技術,熱愛開源軟件。

可能在寫的過程中,有些地方敘述錯誤,請看的同仁指出來。在這感謝張宴,感謝守住每一天,謝謝!

分享技術快樂自我
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章