Nginx + Tomcat

Nginx负载均衡与Session共享
本文介绍如何使用Nginx进行负载均衡,并通过添加jvmroute模块实现Tomcat集群间的Session共享。涵盖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; 

      ... 
}

当访问根路径时,会轮播路由到两台服务器上,至于后端服务器是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源码目录下,执行: 
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集群配置(Tomcat6、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共享成功,非粘性实现。   
### 配置 NginxTomcat 实现集成部署 #### 一、准备阶段 确保已经正确安装并启动了 NginxTomcat。通过访问 `http://localhost:8080` 能够查看到 Tomcat 的默认欢迎页面,这表明 Tomcat 安装成功[^2]。 #### 二、调整 Tomcat 配置 编辑 Tomcat 的配置文件 `/usr/local/tomcat/conf/server.xml` 来指定应用监听的具体端口号以及其他必要的参数设置。此操作允许为不同应用程序分配独立的工作端口,从而支持多实例运行[^3]。 ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ``` 上述 XML 片段展示了如何定义一个 HTTP 连接器来处理来自客户端的请求,默认情况下会监听 8080 端口上的流量。 #### 三、配置 Nginx 反向代理 为了使 Nginx 成功转发请求给后端的 Tomcat 服务器,在 Nginx 中创建一个新的 server 块或者修改现有的配置文件以包含反向代理指令: ```nginx upstream tomcat_backend { server localhost:8080; } server { listen 80; server_name example.com; location / { proxy_pass http://tomcat_backend/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 这段配置实现了当用户访问域名 `example.com` 时,Nginx 将自动把请求转交给位于同一主机上并通过 8080 端口提供服务的 Tomcat 应用程序[^1]。 #### 四、静态资源与动态内容分离 为了让 Nginx 更高效地处理静态文件(如图片、CSS 文件),可以在其配置中加入特定位置路径用于直接返回这些类型的资产而不经过 Tomcat 处理: ```nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { root /path/to/static/files; expires 7d; # 设置缓存时间 } ``` 这样做的好处是可以减轻 Tomcat 的负载压力,并提高整体性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值