下文給大家?guī)碓黾觭ticky session模塊支持解決問題答疑,希望能夠給大家在實際運用中帶來一定的幫助,負載均衡涉及的東西比較多,理論也不多,網(wǎng)上有很多書籍,今天我們就用創(chuàng)新互聯(lián)在行業(yè)內累計的經(jīng)驗來做一個解答。
創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡營銷推廣、網(wǎng)站重做改版、鹽城網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5、商城建設、集團公司官網(wǎng)建設、成都外貿網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為鹽城等各大城市提供網(wǎng)站開發(fā)制作服務。
大家的網(wǎng)站都難免會遇到驗證碼的議題,前臺后臺的登入,都需要有驗證碼來做登入校驗。
因為有些應用的驗證碼是在系統(tǒng)緩存中產(chǎn)生的,如果你使用的是負載均衡,那可能就會出現(xiàn)和我一樣的情況:在驗證驗證碼時,負載均衡在起著作用,用戶訪問的頁面因在兩臺云服務器間承接跳轉的,會導致用戶一直無法驗證成功,所以在負載均衡上需要做sticky session支持,才能解決此問題。
所以我就要著手去處理這個問題。
安裝環(huán)境及軟件版本:
操作系統(tǒng)版本:CentOS 7.2 64bit
負載均衡層:nginx-1.10.1
服務層:Tomcat 7.0.72
nginx-sticky-module版本:1.1
因為我之前在負載均衡層nginx已經(jīng)編譯完成并使用,所以要增加sticky session的話,就需要在Nginx上再安裝支持粘性會話的插件即可
在官網(wǎng)上有看到Nginx plus對于應用模塊的支持,但是對于開源免費版的nginx貌似卻還沒有,所以我們先去下載第三方支持的插件
1.下載地址:
https://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
發(fā)現(xiàn)在nginx-sticky-module中最新的也是2012年出的nginx-sticky-module-1.1.tar.gz,之后就沒有再出過新版了,所以就選擇最新版本就好了,nginx-sticky-module-1.0.tar.gz好像不在支持使用了,而且1.1版本增加了權重的參數(shù).
2.把下載好的安裝包放到你想要放置的位置去解壓:
我就把它放在經(jīng)常放置的位置/data0/soft/,然后解壓:
[root@soft]# tar -xf nginx-sticky-module-1.1.tar.gz
在/data0/soft/nginx-sticky-module-1.1里需要做些準備工作,否則在后續(xù)編譯nginx時會報錯
為了明確了解看到錯誤提示,直接進行編譯nginx查看,后續(xù)再處理也可以。所以為了方便了解錯誤,我就直接編譯了。
3.在nginx上安裝sticky模塊
如果你和我一樣之前也安裝過nginx,又不記得曾經(jīng)安裝過哪些模塊,但又不想影響原有的模塊,有個指令可以幫到你。
就是到你現(xiàn)系統(tǒng)在跑的nginx目錄的sbin里用./nginx -V查看曾經(jīng)編譯時所用的歷史指令
[root@~]# /data0/work/nginx/sbin/nginx -V
nginx version: nginx/1.10.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments:
--prefix=/data0/work/nginx
--pid-path=/data0/work/nginx/logs/nginx.pid
--lock-path=/var/lock/nginx.lock
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_flv_module
--with-http_stub_status_module
--with-http_gzip_static_module
--http-client-body-temp-path=/var/tmp/nginx/client/
--http-proxy-temp-path=/var/tmp/nginx/proxy/
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--http-scgi-temp-path=/var/tmp/nginx/scgi
--with-pcre
--add-module=/data0/soft/nginx_upstream_check_module-master/
然后到你需要安裝的nginx源碼包當中去,編譯語句參照原先的,只要末尾添加sticky session模塊--add-module=/data0/soft/nginx-sticky-module-1.1/即可
[root@~]# cd /data0/work/nginx-1.10.1
[root@nginx-1.10.1 ]# ./configure --prefix=/data0/work/nginx
--pid-path=/data0/work/nginx/logs/nginx.pid
--lock-path=/var/lock/nginx.lock
--user=nginx --group=nginx
--with-http_ssl_module --with-http_flv_module
--with-http_stub_status_module
--with-http_gzip_static_module
--http-client-body-temp-path=/var/tmp/nginx/client/
--http-proxy-temp-path=/var/tmp/nginx/proxy/
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--http-scgi-temp-path=/var/tmp/nginx/scgi
--with-pcre
--add-module=/data0/soft/nginx_upstream_check_module-master/
--add-module=/data0/soft/nginx-sticky-module-1.1/
接著進行make編譯
[root@nginx-1.10.1 ]# make && make install
發(fā)現(xiàn)報錯了:
cc1: all warnings being treated as errors
make[1]: *** [objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_module.o] Error 1
make[1]: Leaving directory `/data0/work/nginx-1.10.1'
make: *** [build] Error 2
處理辦法:
a.根據(jù)資料把ngx_http_sticky_misc.c 的281行修改如下即可解決問題
[root@~ ]vim /data0/soft/nginx-sticky-module-1.1/ngx_http_sticky_misc.c
281 digest->len = ngx_sock_ntop(in, digest->data, len, 1);
原digest->len = ngx_sock_ntop(in,digest
->data, len, 1);
改后digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in),digest
->data, len, 1);
b.還要把ngx_http_sticky_module.c 的322行修改如下可解決問題
[root@~ ]vim /data0/soft/nginx-sticky-module-1.1/ngx_http_sticky_module.c
332 #if defined(nginx_version) && nginx_version >= 1009000 ---加
333 iphp->rrp.current = peer; --加
334 #else --加
335 iphp->rrp.current = iphp->selected_peer; --原有內容
336 #endif --加
備注:其實就是找到iphp->rrp.current = iphp->selected_peer;在其前后添加內容
接著繼續(xù)進行make&& make install編譯即可
[root@nginx-1.10.1 ]# make && make install
4.在nginx的配置文檔里配置啟用sticky模塊功能
因為我是在原有的基礎上進行編譯安裝,且沒有更換版本升級,直接安裝,所以原有的nginx.conf配置文件不會被覆蓋,只是nginx的執(zhí)行檔會重新生成一個
那nginx的upstream如何使用sticky呢,很簡單,方法如下:
[root@~]# vim /data0/work/nginx/conf/nginx.conf
找到upstream模塊添加sticky;
upstream information{
sticky;
server 172.16.22.3:80 max_fails=2 ;
server 172.16.22.4:80 max_fails=2 ;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
}
注: sticky; 是針對--sticky模塊的設定
check interval=3000 rise=2 fall=5 timeout=1000 type=http; 是針對upstream后臺健康檢查使用,增加模塊是nginx_upstream_check_module-master
當然你還沒有安裝nginx_upstream_check_module-master模塊,可以先注釋掉這個設定。等到后續(xù)有需求再進行開啟。
5.nginx sticky其他語法使用說明
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以為任何的string字符,默認是route
domain:哪些域名下可以使用這個cookie
path:哪些路徑對啟用sticky,例如path/test,那么只有test這個目錄才會使用sticky做負載均衡
expires:cookie過期時間,默認瀏覽器關閉就過期,也就是會話方式。
no_fallbackup:如果設置了這個,cookie對應的服務器掛了,那么將會返回502(bad gateway 或者 proxy error),不建議啟用
nginx sticky expires用法:
upstream information {
sticky expires=1h;
server 172.16.22.3:80 max_fails=2 ;
server 172.16.22.4:80 max_fails=2 ;
}
啟用了過期,cookie 1個小時才過期
6.經(jīng)過上述的相關設定后,便可查看stitcky session的問題是否成功解決
#注:下列談及的tomcat服務器是在做了集群(即session共享的前提下)
a.重啟nginx服務
先測試配置文件是否準確無誤
[root@~ ]# /data0/work/nginx/sbin/nginx -t
nginx: the configuration file /data0/work/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data0/work/nginx/conf/nginx.conf test is successful
#如果有問題,請按照它給的提示進行查找和修改即可
重啟nginx服務
[root@~ ]# /data0/work/nginx/sbin/nginx -s reload
b.為了方便查看,我們就在后端的那兩臺tomcat服務上設定下
因為我后端是兩臺tomcat服務器,每臺服務器的JESSIONED值都有特殊的標志。
所以在我的兩臺后端Tomcat服務器上,我都做了些準備工作來方便我辨別,并通過瀏覽器訪問負載均衡層來查看實際是哪一臺機器在提供服務。
請到你的tomcat服務器上進行下列操作:
[root@~ ]# vim /data0/work/tomcat01/conf/server.xml
找到里面的第103行
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
取消掉注釋,并修改成如下內容:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat01">
#注:為了好辨別,我就把jvmRoute改成Tomcat01,同樣Tomcat02的服務器也做同樣的上述操作,不同的是把jvmRoute設置成Tomcat02
在tomcat服務器的發(fā)布文檔里的編寫放置一個index.jsp頁面,內容如下:
[root@~ ]# vim /data0/work/tomcat01/webapps/ROOT/jsp/index.jsp
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat01</title>
</head>
<body>
<h3><font color="red">Session serviced by tomcat </font></h3>
<table aligh="center" border="1">
<tr>
<td>Session ID </td>
<td><%=session.getId() %></td>
<% session.setAttribute("abc","adc");%>
</tr>
<tr>
<td>Created on</td>
<td><%=session.getCreationTime() %></td>
</tr>
</table>
</body>
<html>
然而tomcat02服務器做同樣的動作,只是把index.jsp頁面中tomcat01替換成tomcat02
c.比如172.16.22.3這臺是tomcat01,172.16.22.4這臺是tomcat02.當你訪問http://172.16.22.2/index.jsp頁面時,在為開啟sticky session模塊前,不管怎么刷新訪問頁面,JESSIONED值都是不變的,但是承載的tomcat會交替變化.
如下圖所示:
在tomcat01上承接服務:
刷新頁面后,發(fā)現(xiàn)是tomcat02上承接服務,且session ID不變
但是如果Nginx配置檔開啟了sticky模塊,我們可以看到JESSIONED值也不會發(fā)生變化.但無論你怎么刷新,它都死死的粘滯在其中一臺tomcat服務器上.
看了以上關于增加sticky session模塊支持解決問題答疑,如果大家還有什么地方需要了解的可以在創(chuàng)新互聯(lián)行業(yè)資訊里查找自己感興趣的或者找我們的專業(yè)技術工程師解答的,創(chuàng)新互聯(lián)技術工程師在行業(yè)內擁有十幾年的經(jīng)驗了。
網(wǎng)站標題:增加stickysession模塊支持解決問題答疑
網(wǎng)站鏈接:http://bm7419.com/article20/jcisjo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供虛擬主機、Google、建站公司、網(wǎng)站設計、標簽優(yōu)化、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)