Nginx會話保持的具體實現(xiàn)
1. 基于ip_hash的會話保持
- 在做Nginx的負載均衡時,可以在upstream里設置
ip_hash
,每個請求按訪問ip的hash結(jié)果分配,映射到固定某一臺的服務器 - 當后端服務器宕機后,session會丟失,再次發(fā)起請求時,會重新固定訪問另一臺正常的服務器并實現(xiàn)會話保持。
- 缺點就是由于同一個IP客戶端都固定訪問一個后端服務器,這就可能會導致負載不均衡。下面是 ip_hash 的會話保持格式。
- ip_hash 源地址哈希算法,將同一客戶端的請求總是發(fā)往同一個后端服務器,除非該服務器不可用。
- url_hash 目標地址哈希算法
#ip_hash語法: upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; }
2. 基于cookie的會話保持
- 這種方式就是將用戶的cookie存入session里,當用戶分配到不同的服務器時,先判斷服務器是否存在該用戶的session,如果沒有就先把cookie里面的sessoin存入該服務器,實現(xiàn)session會話保持。
- 缺點是存入cookie有安全隱患,比如黑客可能會獲取你的cookie從而獲取你相關(guān)信息。
- 使用這種方式實現(xiàn)會話保持保持,需要添加sticky_cookie_insert模塊,與 ip_hash 不同之處在于,它不是基于IP來判斷客戶端的,而是基于cookie來判斷。
//編譯安裝sticky模塊 //給yum安裝的nginx添加模塊(1.24最新的版本重新編譯安裝會報錯,1.18的不會報錯,版本兼容性的問題) ? //安裝編譯環(huán)境 [root@nginx-server ~]# yum install -y pcre* openssl* gcc gcc-c++ make [root@nginx-server ~]# wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip //下載sticky模塊 [root@nginx-server ~]# nginx -v nginx version: nginx/1.18.0 [root@nginx-server ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz #下載yum安裝nginx對應版本的源碼包 [root@nginx-server ~]# yum install -y unzip //安裝解壓工具 [root@nginx-server ~]# unzip 08a395c66e42.zip //解壓模塊包 [root@nginx-server ~]# mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng/ [root@nginx-server ~]# tar xzvf nginx-1.18.0.tar.gz -C /usr/local/ //解壓nginx的源碼包 [root@nginx-server ~]# cd /usr/local/nginx-1.18.0/ ? [root@nginx-server nginx-1.18.0]# nginx -V //查看yum安裝nginx所有模塊 [root@nginx-server nginx-1.18.0]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/root/nginx-sticky-module-ng [root@nginx-server nginx-1.18.0]# make && make install ? //配置基于cookie會話保持 [root@nginx-server conf.d]# vim upstream.conf upstream jianglt { server 192.168.221.136; server 192.168.221.138; sticky; } server { listen 80; server_name www.test.com; charset utf-8; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://jianglt; } } [root@nginx-server conf.d]# nginx -t [root@nginx-server conf.d]# nginx -s reload ? //或者: upstream jianglt { server 192.168.221.136; server 192.168.221.138; sticky expires=1h domain=testpm.com path=/; }
說明:
expires
:設置瀏覽器中保持cookie的時間domain
:定義cookie的域path
:為cookie定義路徑
瀏覽器測試訪問;記得在windows本地hosts文件中添加解析
瀏覽器具體的體現(xiàn):
1、訪問www.test.com,會隨機訪問到一個頁面,可能是136,也可能是138
2、按下F12,打開瀏覽器的控制臺工具,找到請求頭下面的Cookie(例如:Cookie:route=19c3afb04a79d36869450dfe7dca8512),并將Cookie復制粘貼到記事本中
3、停掉當前訪問的服務器,crtl + F5強制刷新,再次查看瀏覽器中請求頭的Cookie,觀察是否跟前一次的Cookie一樣(如果第一次訪問的是136的頁面,則停掉136,反之,停掉138)
- 注意:使用后端服務器可以自身通過相關(guān)機制保持session同步,如:使用數(shù)據(jù)庫、redis、memcached 等做session復制
3. 會話保持的作用
會話保持在Web應用中具有重要的作用,主要體現(xiàn)在以下幾個方面:
- 用戶登錄狀態(tài)維護: 通過會話保持,Web應用能夠跟蹤用戶的登錄狀態(tài),確保用戶在多次請求之間保持登錄狀態(tài)。這對于需要用戶身份驗證的應用來說尤為重要,以便提供個性化的服務和訪問控制。
- 購物車和交易狀態(tài): 在電子商務網(wǎng)站中,用戶可能會添加商品到購物車并進行結(jié)算。通過會話保持,系統(tǒng)可以跟蹤用戶的購物車狀態(tài),確保用戶在購物過程中的信息不會丟失,同時保護交易過程的一致性。
- 個性化用戶體驗: 對于一些需要根據(jù)用戶個性化設置或歷史記錄提供服務的應用,會話保持可以確保用戶在訪問過程中保持一致的體驗。例如,用戶在一個新聞應用中的閱讀歷史、個性化推薦等。
- 減少重復認證: 在一些分布式系統(tǒng)中,用戶可能會訪問多個服務。通過會話保持,用戶只需要在登錄時進行一次身份驗證,然后在整個會話期間,其他服務可以通過會話標識來確認用戶身份,避免重復的身份驗證過程。
- 保持用戶上下文: 有些應用需要在用戶多次請求之間保持特定的上下文信息,例如在多步驟的表單提交中,確保用戶在不同步驟之間的數(shù)據(jù)保持一致。
- 提高系統(tǒng)性能: 通過將用戶請求路由到同一臺后端服務器,會話保持可以減少后端服務器之間的數(shù)據(jù)同步和共享的需求,從而提高系統(tǒng)的性能和效率。
到此這篇關(guān)于Nginx會話保持的具體實現(xiàn)的文章就介紹到這了,更多相關(guān)Nginx會話保持內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx?80端口配置多個location無效訪問404問題
這篇文章主要介紹了nginx?80端口配置多個location無效訪問404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Nginx中l(wèi)ocation proxy_pass加與不加/的區(qū)別說明
本文總結(jié)了Nginx配置中的location匹配規(guī)則和proxy_pass用法,包括前綴匹配、精確匹配、正則表達式匹配、通配符匹配以及proxy_pass的配置細節(jié)2024-12-12