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源碼目錄下,執行:
- 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當時安裝時的參數:
引用
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,編譯安裝。
- ./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。
- <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共享成功,非粘性實現。