2年前一直折騰Apache,現如今更習慣Nginx。
?搭建網站又遇到2年前遇到的問題——Session同步。
?(參考我以前的帖子——
征服 Apache + Tomcat
)只不過現今擔當負載均衡的Apache換成了Nginx!
?
今天簡要說明一下Nginx+Tomcat負載均衡實現, 重點介紹Nginx+Tomcat+Session共享實現 。?
相關內容:?
征服 Apache + SSL ?
征服 Apache + SVN ?
征服 Apache + SVN +? LDAP ?
征服 Apache + Tomcat ?
征服 Nginx ?
征服 Nginx + Tomcat ?
Nginx負載均衡,其實主要就是用upstream、server指令,再配以權重等等參數。如果為了讓nginx支持session共享,還需要額外增加一個模塊。?
一、Nginx負載均衡 ?
在http{...}中配置一個upstream{...},參考如下:?
??? upstream tomcat {?
??????? server 10.11.155.26:8080;?
??????? server 10.11.155.41:8080;?
??? }?
接著修改location節點,配置代理:?
當訪問根路徑時,會輪播路由到兩臺服務器上,至于后端服務器是tomcat還是jetty之類的,都無所謂,照葫蘆畫瓢就是了。
?
當然,有的機器性能好,或者負載低,可以承擔高負荷訪問量,可以通過權重(weight),提升訪問頻率。數值越高,被分配到的請求數越多。?
server指令參數如下:?
例如,可以這樣配置:?
??? upstream tomcat {?
??????? server 10.11.155.26:8080 weight=5;?
??????? server 10.11.155.41:8080 weight=10;?
??? }?
后者分得的請求數就會較高。?
二、Nginx+Tomcat+Session共享 ?
為了讓Nginx支持Tomcat的Session共享,需要對其升級,增加jvmroute模塊。?
1.下載 nginx-upstream-jvm-route 組件、對nginx源碼做補丁。 ?
我把nginx-upstream-jvm-route下載到了/opt/software路徑下。?
先切換到nginx源碼目錄下,執行:?
說明補丁做好了!
?
2.升級nginx ?
先別急著折騰nginx-upstream-jvm-route,先看看nginx當時安裝時的參數:?
記得先備份nginx.conf!
?
使用追加參數(--add-module),增設nginx-upstream-jvm-route模塊, --add-module=/opt/software/nginx_upstream_jvm_route ,編譯安裝。?
如果沒有錯誤提示,nginx就成功升級了!
?
3.修改upstream配置 ?
要讓Nginx支持Tomcat的jvmRoute,并共享session,在upstream下作如下修改:?
??? upstream tomcat {?
??????? server 10.11.155.26:8080 srun_id=tomcat1;?
??????? server 10.11.155.41:8080 srun_id=tomcat2;?
??????? jvm_route $cookie_JSESSIONID|sessionid reverse;?
??? }?
srun_id 跟tomcat配置有關。?
4.Tomcat集群配置(Tomcat6、7通用) ?
該配置參考 征服 Apache + Tomcat ,以下僅作簡要說明。?
a.修改server.xml?
找到 Engine 節點,并設置 jvmRoute ,這里指定 tomcat1 。?
可以直接粘貼以下代碼,并對應修改 Receiver 節點中的 address 屬性,指向本機:?
注:如果本機上有多個tomcat并存, Receiver 節點中的 port 屬性,使其綁定在不同的端口上。?
Membership 節點 address 屬性配置多播地址,可使用 route 命令將其打開,參考如下:?
b.修改應用的 web.xml ?
在web.xml末尾增加 <distributable /> ?
至此,已完成所有配置,重啟tomcat、nginx,訪問服務測試頁面(見附件),強行關閉其中一臺tomcat,令請求轉向另一個臺tomcat,測試session是否同步:?
?
session共享成功,非粘性實現。
?
相關內容:?
征服 Apache + SSL ?
征服 Apache + SVN ?
征服 Apache + SVN +? LDAP ?
征服 Apache + Tomcat ?
征服 Nginx ?
征服 Nginx + Tomcat ?



今天簡要說明一下Nginx+Tomcat負載均衡實現, 重點介紹Nginx+Tomcat+Session共享實現 。?
相關內容:?
征服 Apache + SSL ?
征服 Apache + SVN ?
征服 Apache + SVN +? LDAP ?
征服 Apache + Tomcat ?
征服 Nginx ?
征服 Nginx + Tomcat ?
Nginx負載均衡,其實主要就是用upstream、server指令,再配以權重等等參數。如果為了讓nginx支持session共享,還需要額外增加一個模塊。?
一、Nginx負載均衡 ?
在http{...}中配置一個upstream{...},參考如下:?
引用
??? upstream tomcat {?
??????? server 10.11.155.26:8080;?
??????? server 10.11.155.41:8080;?
??? }?
接著修改location節點,配置代理:?
引用
location / {?
????? ...?
??????????? proxy_pass http://tomcat;?
????? ...?
}
????? ...?
??????????? proxy_pass http://tomcat;?
????? ...?
}
當訪問根路徑時,會輪播路由到兩臺服務器上,至于后端服務器是tomcat還是jetty之類的,都無所謂,照葫蘆畫瓢就是了。

當然,有的機器性能好,或者負載低,可以承擔高負荷訪問量,可以通過權重(weight),提升訪問頻率。數值越高,被分配到的請求數越多。?
server指令參數如下:?
- weight——權重,數值越大,分得的請求數就越多,默認值為1。
- max_fails——對訪問失敗的后端服務器嘗試訪問的次數。默認值為1,當設置為0時將關閉檢查。
- fail_timeout——失效超時時間,當多次訪問失敗后,對該節點暫停訪問。
- down——標記服務器為永久離線狀態,用于ip_hash指令。
- backup——僅當非backup服務器全部宕機或繁忙時啟用。
例如,可以這樣配置:?
引用
??? upstream tomcat {?
??????? server 10.11.155.26:8080 weight=5;?
??????? server 10.11.155.41:8080 weight=10;?
??? }?
后者分得的請求數就會較高。?
二、Nginx+Tomcat+Session共享 ?
為了讓Nginx支持Tomcat的Session共享,需要對其升級,增加jvmroute模塊。?
1.下載 nginx-upstream-jvm-route 組件、對nginx源碼做補丁。 ?
我把nginx-upstream-jvm-route下載到了/opt/software路徑下。?
先切換到nginx源碼目錄下,執行:?
- patch?-p0?<?/opt/software/nginx_upstream_jvm_route/jvm_route.patch??
引用
patching file src/http/ngx_http_upstream.c?
Hunk #1 succeeded at 4095 (offset 358 lines).?
Hunk #3 succeeded at 4227 (offset 358 lines).?
Hunk #5 succeeded at 4326 (offset 358 lines).?
patching file src/http/ngx_http_upstream.h?
Hunk #1 succeeded at 90 (offset 5 lines).?
Hunk #3 succeeded at 118 (offset 5 lines).
Hunk #1 succeeded at 4095 (offset 358 lines).?
Hunk #3 succeeded at 4227 (offset 358 lines).?
Hunk #5 succeeded at 4326 (offset 358 lines).?
patching file src/http/ngx_http_upstream.h?
Hunk #1 succeeded at 90 (offset 5 lines).?
Hunk #3 succeeded at 118 (offset 5 lines).
說明補丁做好了!

2.升級nginx ?
先別急著折騰nginx-upstream-jvm-route,先看看nginx當時安裝時的參數:?
- nginx?-V??
引用
nginx version: nginx/1.2.0?
configure arguments: --prefix=/opt/servers/nginx --user=nginx --group=www --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre=/opt/software/pcre-8.10 --with-zlib=/opt/software/zlib-1.2.5 --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module
configure arguments: --prefix=/opt/servers/nginx --user=nginx --group=www --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre=/opt/software/pcre-8.10 --with-zlib=/opt/software/zlib-1.2.5 --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module
記得先備份nginx.conf!

使用追加參數(--add-module),增設nginx-upstream-jvm-route模塊, --add-module=/opt/software/nginx_upstream_jvm_route ,編譯安裝。?
- ./configure?--prefix=/opt/servers/nginx?--user=nginx?--group=www?--pid-path=/var/run/nginx.pid?--error-log-path=/var/log/nginx/error.log?--http-log-path=/var/log/nginx/access.log?--with-pcre=/opt/software/pcre- 8.10?--with-zlib=/opt/software/zlib- 1.2. 5?--with-http_stub_status_module?--with-http_realip_module?--with-http_gzip_static_module?--add-module=/opt/software/nginx_upstream_jvm_route?&&?make?&&?make?insatll??
如果沒有錯誤提示,nginx就成功升級了!

3.修改upstream配置 ?
要讓Nginx支持Tomcat的jvmRoute,并共享session,在upstream下作如下修改:?
引用
??? upstream tomcat {?
??????? server 10.11.155.26:8080 srun_id=tomcat1;?
??????? server 10.11.155.41:8080 srun_id=tomcat2;?
??????? jvm_route $cookie_JSESSIONID|sessionid reverse;?
??? }?
srun_id 跟tomcat配置有關。?
4.Tomcat集群配置(Tomcat6、7通用) ?
該配置參考 征服 Apache + Tomcat ,以下僅作簡要說明。?
a.修改server.xml?
找到 Engine 節點,并設置 jvmRoute ,這里指定 tomcat1 。?
- < Engine? name= "Catalina"? defaultHost= "localhost"? jvmRoute= "tomcat1" >??
可以直接粘貼以下代碼,并對應修改 Receiver 節點中的 address 屬性,指向本機:?
- < Cluster? className= "org.apache.catalina.ha.tcp.SimpleTcpCluster"??
- ?????????? channelSendOptions= "8" >??
- ???? < Manager? className= "org.apache.catalina.ha.session.DeltaManager"??
- ????????????? expireSessionsOnShutdown= "false"??
- ????????????? notifyListenersOnReplication= "true" />??
- ???? < Channel? className= "org.apache.catalina.tribes.group.GroupChannel" >??
- ??????? < Membership? className= "org.apache.catalina.tribes.membership.McastService"??
- ??????????????? address= "224.0.0.0"??
- ??????????????? port= "45564"??
- ??????????????? frequency= "500"??
- ??????????????? dropTime= "3000" />??
- ??????? < Receiver? className= "org.apache.catalina.tribes.transport.nio.NioReceiver"??
- ???????????????? address= "10.11.155.26"??
- ???????????????? port= "4000"??
- ???????????????? autoBind= "100"??
- ???????????????? selectorTimeout= "5000"??
- ???????????????? maxThreads= "6" />??
- ??????? < Sender? className= "org.apache.catalina.tribes.transport.ReplicationTransmitter" >??
- ??????????? < Transport? className= "org.apache.catalina.tribes.transport.nio.PooledParallelSender" />??
- ??????? </ Sender >??
- ??????? < Interceptor? className= "org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />??
- ??????? < Interceptor? className= "org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />??
- ???? </ Channel >??
- ???? < Valve? className= "org.apache.catalina.ha.tcp.ReplicationValve"??
- ??????????? filter= ".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;" />??
- ???? < Valve? className= "org.apache.catalina.ha.session.JvmRouteBinderValve" />??
- ???? < ClusterListener? className= "org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />??
- ???? < ClusterListener? className= "org.apache.catalina.ha.session.ClusterSessionListener" />??
- ?? </ Cluster >??
注:如果本機上有多個tomcat并存, Receiver 節點中的 port 屬性,使其綁定在不同的端口上。?
Membership 節點 address 屬性配置多播地址,可使用 route 命令將其打開,參考如下:?
- route?add?-net? 224.0. 0.0/ 8?dev?eth0???
b.修改應用的 web.xml ?
在web.xml末尾增加 <distributable /> ?
- < web-app >??
- ...??
- ???????? < distributable? />???
- </ web-app >??
至此,已完成所有配置,重啟tomcat、nginx,訪問服務測試頁面(見附件),強行關閉其中一臺tomcat,令請求轉向另一個臺tomcat,測試session是否同步:?

session共享成功,非粘性實現。

相關內容:?
征服 Apache + SSL ?
征服 Apache + SVN ?
征服 Apache + SVN +? LDAP ?
征服 Apache + Tomcat ?
征服 Nginx ?
征服 Nginx + Tomcat ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
