NGINX:sticky模塊實現基於cookie的負載均衡


Sticky模塊

簡述:

之前公司部署了一套網站及時發布系統,架構如下圖所示;Nginx做前端代理,發布系統用tomcat運行,一台共享存儲,一台數據庫服務器;由於網站及時發布系統涉及到了用戶登錄操作,要保障客戶端的會話完整,用nginx自帶的ip_hash進行分發,但實際生產環境下出現了問題;系統大多是公司內部編輯人員進行編輯網頁時訪問,出口IP都一致,Nginx會把請求分發到一台服務器上,兩台服務器並沒有合理分配請求資源;所以這種情況下得用到sticky模塊

sticky應用場景

在多台后台服務器的環境下,我們為了確保一個客戶只和一台服務器通信,我們勢必使用長連接。使用什么方式來實現這種連接呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個局域網的客戶同時訪問服務器,導致出現服務器分配不均衡,以及不能保證每次訪問都粘滯在同一台服務器。如果基於cookie會是一種什么情形,想想看, 每台電腦都會有不同的cookie,在保持長連接的同時還保證了服務器的壓力均衡,nginx sticky值得推薦

注:如果瀏覽器不支持cookie,那么sticky不生效,畢竟整個模塊是給予cookie實現的

編譯安裝

[root@wcmweb1 ~]# tar zxvf nginx-1.7.0.tar.gz     ###解壓nginx源代碼包
[root@wcmweb1 ~]# tar zxvf nginx-sticky-module-1.1.tar.gz  ###然后解壓sticky模塊
[root@wcmweb1 ~]# mv nginx-sticky-module-1.1 nginx-1.7.0  ###拷貝模塊到nginx安裝目錄下
[root@wcmweb1 ~]# ./configure --prefix=/data/nginx --with-http_stub_status_module --add-module=nginx-sticky-module-1.1 ###進入安裝目錄編譯
[root@wcmweb1 ~]# make &&  make install   編譯安裝

注:nginx-1.8版本不知為何,sticky模式啟用后,瀏覽器刷新后經常出現不穩定狀況,會讓用戶重新登錄

下載地址-》》https://pan.baidu.com/s/1hskFPDM

注意事項

nginx-1.5.x和nginx-sticky-module-1.1編譯會有點問題,應該是nginx新版本沒有相應的nginx-sticky-module

解決辦法是把nginx-sticky-module-1.1/ngx_http_sticky_misc.c的281行修改為: 

digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in), digest->data, len, 1);

由於編譯需要,編譯安裝Nginx之前,要先安裝openssl  yum -y install openssl-devel

Nginx配置文件

省略.....................

upstream backserver {
	sticky;
	server 192.168.x.xx:8080;
	server 192.168.x.xx:8080;
}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        access_log  logs/host.access.log  main;
         location ~* ^(.*)$ {
             #limit_req zone=allips burst=1 nodelay;
 
             proxy_pass  http://backserver;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	     client_max_body_size 8m;
             }

省略................
}

重新啟動nginx服務  nginx-sticky-module的cookie過期時間,默認瀏覽器關閉就過期,也就是會話方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM