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過期時間,默認瀏覽器關閉就過期,也就是會話方式
