Nginx + Tomcat

Nginx負載均衡,其實主要就是用upstream、server指令,再配以權重等等參數。若是爲了讓nginx支持session共享,還須要額外增長一個模塊。

1、Nginx負載均衡
在http{...}中配置一個upstream{...},參考以下:
引用

    upstream tomcat {
        server 10.11.155.26:8080;
        server 10.11.155.41:8080;
    }

接着修改location節點,配置代理:
引用
location / {
      ...
            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;
    }

後者分得的請求數就會較高。

2、Nginx+Tomcat+Session共享
爲了讓Nginx支持Tomcat的Session共享,須要對其升級,增長jvmroute模塊。

1.下載nginx-upstream-jvm-route組件、對nginx源碼作補丁。
我把nginx-upstream-jvm-route下載到了/opt/software路徑下。
先切換到nginx源碼目錄下,執行:
Shell代碼   收藏代碼
  1. 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).

說明補丁作好了!

2.升級nginx
先別急着折騰nginx-upstream-jvm-route,先看看nginx當時安裝時的參數:
Shell代碼   收藏代碼
  1. 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

記得先備份nginx.conf!
使用追加參數(--add-module),增設nginx-upstream-jvm-route模塊, --add-module=/opt/software/nginx_upstream_jvm_route,編譯安裝。
Shell代碼   收藏代碼
  1. ./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集羣配置(Tomcat六、7通用)
該配置參考 征服 Apache + Tomcat,如下僅做簡要說明。
a.修改server.xml
找到 Engine節點,並設置 jvmRoute,這裏指定 tomcat1
Xml代碼   收藏代碼
  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">  

能夠直接粘貼如下代碼,並對應修改 Receiver節點中的 address屬性,指向本機:
Xml代碼   收藏代碼
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  2.           channelSendOptions="8">  
  3.     <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  4.              expireSessionsOnShutdown="false"  
  5.              notifyListenersOnReplication="true"/>  
  6.     <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
  7.        <Membership className="org.apache.catalina.tribes.membership.McastService"  
  8.                address="224.0.0.0"  
  9.                port="45564"  
  10.                frequency="500"  
  11.                dropTime="3000"/>  
  12.        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  13.                 address="10.11.155.26"  
  14.                 port="4000"  
  15.                 autoBind="100"  
  16.                 selectorTimeout="5000"  
  17.                 maxThreads="6"/>  
  18.        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
  19.            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
  20.        </Sender>  
  21.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
  22.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
  23.     </Channel>  
  24.     <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  25.            filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  
  26.     <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
  27.     <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
  28.     <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  29.   </Cluster>  

注:若是本機上有多個tomcat並存,Receiver節點中的port屬性,使其綁定在不一樣的端口上。
Membership節點 address屬性配置多播地址,可以使用 route命令將其打開,參考以下:
Shell代碼   收藏代碼
  1. route add -net 224.0.0.0/8 dev eth0   

b.修改應用的 web.xml
在web.xml末尾增長 <distributable />
Xml代碼   收藏代碼
  1. <web-app>  
  2. ...  
  3.         <distributable />   
  4. </web-app>  


至此,已完成全部配置,重啓tomcat、nginx,訪問服務測試頁面(見附件),強行關閉其中一臺tomcat,令請求轉向另外一個臺tomcat,測試session是否同步:

session共享成功,非粘性實現。
相關文章
相關標籤/搜索