Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務

使用Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
大致架構如上圖所示
1、設置Windows服務端
公司使用好多IIS作爲web服務,其中在session共享哪裏浪費了好長時間。
剛開始打算使用Sqlserver數據庫共享,後來發現IIS自帶session共享。
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
如上圖所示 在會話狀態中 連接字符串使用另外一臺服務器IIS服務的session即可,當然3臺4臺服務器也照樣可以設置,個人理解爲只要能圍成一個圓它們就會互相共享,互相匯聚。設置方法,運行regedit → 打開註冊表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters節點 → 將 AllowRemoteConnection 的鍵值設置成“1”(1 爲允許遠程電腦的連接,0 代表禁止)
親測有效
還有一個就是設置站點的時候,因爲我們是一個iis上面有多個站點,平時使用就是下圖這樣的
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務

新建一個站點,使用的是80端口,然後站點下面有好多的虛擬目錄或者是應用程序(在此必須設置爲應用程序),因爲我們是在磁盤中新建一個目錄然後在目錄下面放了好多的站點,因爲程序寫的時候必須要在一級目錄,所以只能轉化爲程序才能正常訪問。
回到正題題,因爲現在用nginx做負載均衡,所以就涉及到Nginx的後端檢測模塊,在此建議一個站點就是一個網站,站點多了可以使用不同的端口,且不可像以上那樣,具體原因後面有詳細介紹。
以上就是windows系統設置的過程。
2、開始搭建Linux服務
首先是設置Nginx 這裏用到了Nginx的反向代理模塊和後端server的健康狀態檢查模塊
1)、搭建nginx,關閉防火牆,關閉selinux重啓服務器
2)、因爲需要用到後端檢測模塊是第三方模塊,所以需要編譯安裝Nginx
使用的Nginx版本爲nginx-1.14.0.tar.gz,第三方模塊爲nginx_upstream_check_module-master.zip
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
爲什麼使用nginx-1.14.0.tar.gz,因爲第三方模塊裏面check_1.14.0+.patch只看到了1.14的(最高的),如果使用新版本的話 怕是不支持
3)、先給Nginx打補丁
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
因爲我的已經打過了。所有會這樣提示,而正常的提示是下圖:
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
出現如圖所示則表示打補丁成功
4)、編譯Nginx
首先直接安裝開發工具包組,後期編譯的時候出錯少
yum groupinstall Development-tools -y 這個等待時間較長
另外安裝:yum -y install perl-devel perl-ExtUtils-Embed 這個包平時沒用過,但是如果不安裝的話 編譯第三方模塊的時候會報錯,直接安裝了吧
Nginx編譯參數:
./configure --prefix=/usr/local/nginx1.14 --conf-path=/usr/local/nginx1.14/nginx.conf --error-log-path=/usr/local/nginx1.14/logs/error.log --http-log-path=/usr/local/nginx1.14/logs/access.log --with-http_stub_status_module --add-module=/home/nginx_upstream_check_module-master --with-http_gunzip_module --with-http_gzip_static_module --with-http_ssl_module --with-http_v2_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_auth_request_module --with-http_sub_module --with-http_perl_module --with-perl_modules_path=/usr/local/nginx1.14/modules/
以上是nginx編譯參數,按照上面編譯夠了,具體不知道編譯安裝流程的可以百度或google下這裏不再贅述
如果順利通過的話 則會在/usr/local/下面看到ngnx1.14的文件夾了
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
如圖所示
下面開始配置nginx,配置文件nginx.conf 建議先行備份nginx.conf.back
5)、配置nginx.conf
user www; 啓動nginx的時候用的用戶
worker_processes auto; 限制可支持auto,不用再寫cpu個數了

#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

#access_log  logs/access.log  main;
sendfile        on;
#tcp_nopush     on;
keepalive_timeout  65; 設置超時時間

gzip  on;
upstream ERP {  這裏定義了後端服務器 一共兩臺,但是這都是使用的80端口(默認),後面需要修改
    ip_hash;
    server 192.168.3.100;
    server 192.168.0.229;
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;  這裏就使用到了剛打的補丁了,後端健康狀態檢查,在此建議設置爲

Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
一秒一次成功一次則成功,失敗一次則失敗,對於要求比較高的,建議可以再縮小都行,這裏是可一個坑,如果設置的時間過長的話,刷新的時候會刷出錯誤頁面出來。因爲本來已經停止的IIS在Nginx中還沒有給剔除掉,所以Nginx還會在這個時間段內,把請求調度給後端已經停止的Server
”簡單介紹下後端健康檢查這個模塊。這個模塊nginx_upstream_check_module-master.zip應該是淘寶做的,淘寶的tengine默認就支持此模塊,在其官網中有說明
Tengine是由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
從2011年12月開始,Tengine成爲一個開源項目,Tengine團隊在積極地開發和維護着它。Tengine團隊的核心成員來自於淘寶、搜狗等互聯網企業。Tengine是社區合作的成果,我們歡迎大家參與其中,貢獻自己的力量。“
參數的含義是:
interval:檢查請求的間隔時間。
fall(fall_count):在fall_count失敗檢查後,服務器被標記爲關閉。
rise(rise_count):在rise_count成功檢查後,服務器被標記。
timeout:檢查請求的超時。
default_down:指定後端服務器的初始狀態,默認爲關閉。
type:檢查協議類型:
tcp:一個簡單的TCP套接字連接並查看一個字節。
ssl_hello:發送客戶端SSL hello數據包並接收服務器SSL hello數據包。
http:發送http請求數據包,接收並解析http響應,以診斷上游服務器是否處於活動狀態。
mysql:連接到mysql服務器,接收問候響應以診斷上游服務器是否處於活動狀態。
ajp:發送AJP Cping數據包,接收並解析AJP Cpong響應,以診斷上游服務器是否處於活動狀態。
port:在後端服務器中指定檢查端口。它可以與原始服務器端口不同。默認端口爲0,表示與原始後端服務器相同。在tengine-1.4.0之後添加此選項。

check_http_send "GET / HTTP/1.0\r\n\r\n";
而我沒有使用tengine,因爲我弄了半個多小時就配置一個模塊命令,總是報錯,所以不得已只有開頭那裏給nginx打補丁了....
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
location /nginxcon {
stub_status;
}
#access_log logs/host.access.log main;
location ^~ /XQZC {
proxy_pass http://ERP/XQZC;
}
location ^~ /BJ_CS {
proxy_pass http://ERP/BJ_CS;
}
location /status {
check_status;
access_log off;

allow SOME.IP.ADD.RESS;

       # deny all;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

還有兩項值得說明的
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
如下圖所示:
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
當然它會一直在檢查的
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
所以上面設置的 check interval=1000 rise=1 fall=1 timeout=1000 type=http; 時間間隔完全沒有問題呢
在此以上就是Nginx的完整配置,但是其中有一個非常大的問題,就是在檢查後端服務器的時候,因爲這裏只設置了80端口的http的健康檢查,而我們在一個網站裏面又添加了好多的應用程序
那麼問題來了:如果我們修改其中一個應用程序的時候(一下簡稱小網站),例如更新,勢必要停止此iis才能替換其中的一個小網站,如果停止了IIS則所有的session都會轉發到另外一臺服務器,而我們只是維護其中的一個小網站,加入說有10個小網站,那麼剩下的9個是完全沒有問題的
這樣就造成了資源浪費
所有要修改爲,一個小網站建立一個站點,使用不同的款口號
那麼這樣的話 在維護一個小網站的時候只需要停止其中一個而不影響其他的,在定義Upstream的時候必須要按照端口號分開定義即可,那就變成下面這個樣子的
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務

如圖所示,這樣就好多了,它也只檢測一個就好,這樣就成了下圖所示的
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
那個不能用 咱就停止那個................... 如此最好啊 呵呵...............
最後配置keepalived
這個就比較簡單了,直接yum安裝keepalived
layer 3層檢測:進行ICMP ping包檢測,確認主機是否存活,如果異常,則會該主機從服務器集羣中剔除;
layer 4層檢測:進行端口檢測,例如80、3306等,端口不通時,將服務器從集羣中剔除;
layer 7層檢測:這個就是基於應用的了,如http返回碼是否爲200,確認主機是否正常。
在此我們使用第三個..
先說一下遇到的坑吧
1)、Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務

此處剛開始一直直接使用的命令,網上所有的教程都讓直接使用命令,
但是新版本的在此配置段好像不支持直接使用命令檢查了,也不知道是我設置的不對 還是真的不能了,所以在此使用腳本檢查,腳本內容還待優化,暫且內容如下:
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
keepalived健康檢查降權規則,默認檢查結果失敗,失敗就會降權,當然我們也可以修改配置文件爲成功則降權的,暫且使用默認。如下圖:
Nginx+Keepalived+iis+Memcached搭建高可用的集羣服務
如果兩個服務器都有vip的話 請繼續清空防火牆關閉selinux 就是他們引起的
備用keepalived直接複製過去主配置文件,修改 state和prioriy兩項即可

寫的有點着急了,不好的地方歡迎大家留言指正,謝謝!!

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