tomcat集群负载均衡配置
-
参考:
- Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog.51cto.com/2677571/1058579
- Tomcat与Apache或Nginx连接和集群配置: http://toplchx.iteye.com/blog/1928390
系统环境设置
-
准备三台redhat linux 5或 centos服务器:
- 负载均衡服务器:Apache安装自带的web发布服务(httpd服务) IP地址:192.168.0.100
- Tomcat发布服务器1:安装有两个发布服务tomcat1和tomcat2 IP地址:192.168.0.101
- Tomcat发布服务器2:安装有两个发布服务tomcat3和tomcat4 IP地址:192.168.0.102
- 统一对外部发布的地址是:http://192.168.0.100 (即负载均衡地址)
-
在设定完成IP以后,最好先设置主机名和IP的对应关系:
cat /etc/hosts 192.168.0.100 web.example.com web #add 127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
Tomcat发布器的安装
JDK安装
-
JDK软件最新版下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 点击排列的最左边一个大图标的“JDK”进入,
- 接下来选择服务器的版本(如linux),在“I agree”前面方框中打勾选中,再按“continue”下一步
- 选择下面一个版本进行下载,如jdk-6u24-linux-i586.bin
- 下载完成后上传到web服务器上的“/tools”目录下(自己建的目录)
-
JDK软件的安装
# 先查看当前JDK的版本是多少 java –version # 进入下载目录,授权JDK文件的可执行权限 cd /tools/ chmod a+x jdk-6u24-linux-i586.bin # 执行JDK的安装解压缩,完成后按回车结束 ./jdk-6u24-linux-i586.bin # 把解压出来的目录移动到/usr/local下面 mv jdk1.6.0_24 /usr/local/
-
配置JAVA的环境变量
-
新建环境变量文件java.sh
cat > /etc/profile.d/java.sh <<EOF # set java environment export JAVA_HOME=/usr/local/jdk1.6.0_24 export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar export PATH=\$JAVA_HOME/bin:\$PATH EOF chmod a+x /etc/profile.d/java.sh
-
重新登录终端,再次查询java的版本号是否升级了:
java -version
-
新建环境变量文件java.sh
- Tomcat软件最新版下载:http://tomcat.apache.org/
(1)先选择Download下面的tomcat版本(如tomcat 7.0) (2)再点击“Core”下面的“tar.gz”进行下载,如apache-tomcat-7.0.12.tar.gz (3)下载完成后上传到web服务器上的“/tools”目录下(自己建的目录)
Tomcat安装
-
安装tomcat
# 进入下载目录,进行解压缩: cd /tools tar zxvf apache-tomcat-7.0.12.tar.gz # 复制并重命名目录到/usr/lcoal下面 ls -l cp apache-tomcat-7.0.12 /usr/local/tomcat1 #(web1服务器) cp apache-tomcat-7.0.12 /usr/local/tomcat2 #(web1服务器) cp apache-tomcat-7.0.12 /usr/local/tomcat3 #(web2服务器) cp apache-tomcat-7.0.12 /usr/local/tomcat4 #(web2服务器)
-
配置tomcat发布器的端口
-
web1服务器tomcat1:vi tomcat1/conf/server.xml(修改如下四个地方:)
<Server port="8005" shutdown="SHUTDOWN"> <!--'8005'改为'8001'端口--> <Connector port="8080" protocol="HTTP/1.1"> <!--'8080'发布端口改为'81'端口--> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <!--改为'8011'端口--> <!--Engine name="Catalina" defaultHost="localhost"--> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
- web1服务器tomcat2:port:8002, http:82, ajp:8012, jvmRote:tomcat2
- web1服务器tomcat3:port:8003, http:83, ajp:8013, jvmRote:tomcat3
- web1服务器tomcat4:port:8004, http:84, ajp:8014, jvmRote:tomcat4
-
web1服务器tomcat1:vi tomcat1/conf/server.xml(修改如下四个地方:)
-
在tomcat的server.xml配置参数据中增加session同步复制的设置
-
vi server.xml (增加下列代码,增加Engine后面的cluster中去)
<!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!--下面的代码是实现session复制功能--> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" mapSendOptions="6"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.100.63" <!—这里填写本机IP地址--> port="5000" selectorTimeout="100" /> <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"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </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"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
-
vi server.xml (增加下列代码,增加Engine后面的cluster中去)
-
同时需要修改tomcat的web.xml配置参数才能真正实现session同步复制的设置
-
web.xml
<!--....--!> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <distributable /> <!--在倒数第二行增加这个代码才能实现session同步复制功能--> </web-app>
-
web.xml
-
设置Tomcat发布服务开机自启动
-
复制tomcat启动文件到开机目录下:
cp tomcat1/bin/catalina.sh /etc/rc.d/init.d/tomcat1
-
修改上面的tomcat1启动文件:vim /etc/rc.d/init.d/tomcat1(在文件的最顶上添加下列几行)
#chkconfig:35 85 15 #description:tomcat1 server CATALINA_HOME=/usr/local/tomcat1 JRE_HOME=/usr/local/jdk1.6.0_24
-
添加tomcat1到开机启动服务
chkconfig --add tomcat1 chkconfig --list tomcat1 chkconfig tomcat1 on service tomcat1 start
-
复制tomcat启动文件到开机目录下:
- 其它三个tomcat2 、tomcat3 、tomcat4 也都按上面三步来做
-
如何查看tomcat的启动过程
-
方法一:用catalina.sh来启动:
./catalina.sh run
-
方法二:如果用
./startup.sh
启动的话,查看启动日志tail –f /usr/local/tomcat4/logs/catalina.out
-
方法一:用catalina.sh来启动:
Apache Proxy负载均衡
- Apache发布器使用系统自带的httpd服务,在安装操作系统的时候先选择好服务器下面的web服务器组件。
-
修改配置web发布服务的参数文件:
-
vim /etc/httpd/conf/httpd.conf (在最底下添加如下内容)
ServerName localhost:80 #发布的端口说明 <VirtualHost *:80> ServerAdmin admin@china1168.com ServerName localhost ServerAlias localhost <proxy balancer://testcluster> #testcluster可自己命名,没什么特别的意义 BalancerMember ajp://192.168.0.101:8011 loadfactor=1 route=tomcat1 #要与tomcat中的ajp对应 BalancerMember ajp://192.168.0.101:8012 loadfactor=1 route=tomcat2 BalancerMember ajp://192.168.0.102:8013 loadfactor=1 route=tomcat3 BalancerMember ajp://192.168.0.104:8014 loadfactor=1 route=tomcat4 </proxy> ProxyRequests Off ProxyPass /server-status ! ProxyPass /balancer-manager ! ProxyPass / balancer://testcluster/ stickysession=JSESSIONID #注意balancer前面有空格 ProxyPassReverse / balancer://testcluster/ #注意balancer前面有空格 </VirtualHost> <Location /server-status> #负载均衡服务器的状态查询,http://192.168.0.100/server-status SetHandler server-status </Location> <Location /balancer-manager> #负载均衡服务器的管理查看,http://192.168.0.100/balancer-manager SetHandler balancer-manager </Location>
-
vim /etc/httpd/conf/httpd.conf (在最底下添加如下内容)
-
负载均衡集群测试实例
- 在tomcat目录下面的webapps文件夹中新建test测试文件:
- mkdir webapps/test
-
vi test/index.jsp(文件内容如下)
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <html><head><title>Cluster App Test</title></head> <body> Server Info: <% request.setCharacterEncoding("UTF-8"); out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session 列表</b>"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); } %> <form action="index.jsp" method="POST"> 名称:<input type=text size=20 name="dataName"><br> 值:<input type=text size=20 name="dataValue"><br> <input type=submit> </form> </body> </html>
-
对Apache负载均衡进行测试:
- 登录测试首页: http://192.168.0.100/test/index.jsp
- 登录管理界面:http://192.168.0.100/balancer-manager 可查看“Elected”的选中状态
- 登录状态界面:http://192.168.0.100/server-status
-
同时查看各个tomcat的日志文件,看看上面提交的测试内容是在哪个tomcat中显示出来
tail -f /usr/local/tomcat1/logs/catalina.out tail -f /usr/local/tomcat2/logs/catalina.out tail -f /usr/local/tomcat3/logs/catalina.out tail -f /usr/local/tomcat4/logs/catalina.out
- 正常情况下,提交的测试内容会在四个tomcat之间轮循显示,实现负载均衡。
-
设置Apache发布服务开机自启动:
chkconfig httpd on
Nginx负载均衡
nginx安装
-
安装前必须要先下载相关联的配套软件包:
- pcre套件包下载: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ (一定要先安装)
- nginx最新版下载: http://www.nginx.org/en/download.html (一定要安装)
- openssl套件包下载:http://www.openssl.org/source/ (可选安装)
-
相关联软件的安装
-
pcre套件的安装,进入下载目录,进行解压缩:
cd /tools tar zxvf pcre-8.12.tar.gz cd pcre-8.12 ./configure #默认是安装在/usr/local/目录下面,也可指定目录加参数 --prefix=/usr/local/ make && make install
-
pcre套件的安装,进入下载目录,进行解压缩:
-
openssl套件的安装,进入下载目录,进行解压缩(可选)
cd /tools tar zxvf openssl-1.0.0d.tar.gz cd openssl-1.0.0d ./configure # 默认是安装在/usr/local/目录下面,也可指定目录加参数 --prefix=/usr/local/ make && make install
-
Nginx软件的安装和配置
cd /tools tar zxvf nginx-1.0.0.tar.gz cd nginx-1.0.0 ./configure #默认是安装在/usr/local/目录下面,也可指定目录加参数 --prefix=/usr/local/ make && make install
-
测试安装是否成功
cd /usr/local/nginx/sbin/ ./nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
nginx负载配置
-
vim /usr/local/nginx/conf/nginx.conf (修改增加下面的内容)
pid logs/nginx.pid; upstream tomcat { # 负载均衡站点的名称为tomcat,可以自己取 ip_hash; # 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器 server 192.168.0.101:81; # web服务器的IP地址及tomcat发布端口 server 192.168.0.101:82; server 192.168.0.102:83; server 192.168.0.102:84; } server { listen 80; # 站点侦听端口80 server_name localhost; # 站点名称 location / { root html; index index.html index.htm; proxy_pass http://tomcat; # 负载均衡指向的发布服务tomcat }
-
注意:
-
upstream
部分要放在server { listen 80
这部分的前面,不能放到下面去,不然会出错 -
proxy_pass
部分要放在localtion这部分的括号里面,且http://
后面跟的名称要与上面upstream
中一样
-
-
启动负载均衡服务
cd /usr/local/nginx/sbin/ ./nginx -t # 测试配置有无错误 ./nginx # 启动服务 netstat -tlnp | grep :80 #查看nginx端口的进程号 kill -9 11274 #杀死nginx的主进程,11274是上面查询出来的主进程号,实际环境中不一定一样 # 在线修改配置参数(在nginx启动的情况),并让它重新加载,其间nginx不用停止服务。 vi nginx.conf kill -HUP `cat /usr/local/nginx/logs/nginx.pid` # 设置Nginx开机自动启动 vim /etc/rc.d/init.d/nginx,增加内容 #chkconfig:35 80 10 #description:Nginx server /usr/local/nginx/sbin/nginx chmod a+x nginx chkconfig --add nginx chkconfig nginx on
Tomcat与Apache或Nginx连接和集群配置
Tomcat的连接方式
- 官方文档参考:http://tomcat.apache.org/tomcat-7.0-doc/connectors.html
-
Tomcat与Web服务器的连接方式有两种:
- HTTP: HTTP连接器是Tomcat默认的方式,并且已经被使用。这种方式具有最低的延迟和最佳的整体性能。对于集群,需要一个支持粘性会话的web服务器在Tomcat前端。Tomcat支持mod_porxy(被默认包含在Apache HTTP Server 2.2)作为负载平衡器。值得注意的是,通常情况下HTTP proxy的性能低于AJP的性能,所以集群时AJP是优选。
- AJP: 单个服务器,一个本地WEB服务器和一个Tomcat实例连接的效率通常低于单个Tomcat使用其默认的HTTP连接的方式,即使web应用大部分都是静态内容。如果为了某种原因,你需要整合一个本地WEB服务器,那么AJP连接将提供更好的效率。对于Tomcat集群,AJP连接是最有效的,其他功能和HTTP集群一样。
Tomcat7所支持的本地连接:
- JK 1.2 .x
- mod_proxy (Apache HTTP Server 2.2默认包含)
其他AJP连接器可能可以工作,但不再维护。
Tomcat 与 Apache HTTP Server2.4连接
HTTP连接
从上面的说明可以看出,如果你只需要一个Tomcat,那就直接用就好了,不用和Apache HTTP Server连接。如果需要多个Tomcat集群,就是AJP连接。所以用HTTP连接Apache和Tomcat这种情况应该不多,简单说明一下怎么连接: 取消两个module的注释:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
在httpd.conf文件中添加以下两行:
ProxyPass /webappname http://ip:8080/webappname ProxyPassReverse /webappname http://ip:8080/webappname
ip、端口号和webappname根据实际情况修改
说明:上述写法可能有安全隐患。不要使用ProxyRequests启用代理,除非对代理做了权限控制。否则对你的网络和互联网都是很大的危险。默认ProxyRequests为off。
参考:http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#access
AJP连接
AJP连接官方支持两种方式JK 1.2.x和mod_proxy。
JK是老牌连接器,被广泛使用和验证,值得信任,但是配置比较复杂。
mod_proxy是Apache2.2以后的默认设置,配置简单,但是因为比较新,所以没有经过大范围的验证。
网上JK的文档比较多,这里我们介绍一下mod_proxy的写法。其实跟HTTP的方式一样,只是把http://
修改为ajp://
就可以了。
取消两个module的注释
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
在httpd.conf文件中添加以下行:
ProxyPass /webappname ajp://ip:8009/webappname
ip、端口号和webappname根据实际情况修改
AJP连接通常不需要设置ProxyPassReverse。
参考:http://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html
Apache HTTP Server2.4集群配置
如文章开始所述,Apache Http Server和Tomcat集群要用AJP方式连接
- modules
同样集群可以用JK和mod_proxy两种方式,这里介绍mod_proxy的方式:
取消五个module的注释
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
根据负载均衡调度策略的不同,取消如下module的注释
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
-
示例配置:
<Proxy balancer://mycluster> #定义一个集群,起个名字 #定义集群成员。loadfactor是权重,数值越大权重越大被分配的请求约多。route和Tomcat中配置的jvmRoute一至。 #还有一些参数可以添加,比如:max=20 ttl=120 retry=300 timeout=15,详细参考:http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass BalancerMember ajp://ip:8019 loadfactor=1 route=tomcat7_a BalancerMember ajp://ip:8029 loadfactor=2 route=tomcat7_b #热备服务器,只有在上面的BalancerMember都坏掉之后才会被启用。 BalancerMember ajp://ip:8009 status=+H #现有3种负载均衡调度策略 #byrequests:请求计数(Request Counting) #bytraffic:流量加权计数(Weighted Traffic Counting) #bybusyness:挂起请求计数(Pending Request Counting) #默认是byrequests ProxySet lbmethod=bytraffic </Proxy> ProxyPass /examples balancer://mycluster/examples #设置代理连接
- 负载均衡器的粘性
当一个请求被代理到某个节点,接下来同一个用户的请求都将被代理到相同的节点。很多均衡器通过一张记录客户端ip和节点的关系表来实现这个特性。这种方式对客户端和节点都是透明的,但是存在一些问题:如果客户端藏在某些代理之后将导致负载分布不均,当客户端使用动态IP地址,并在请求间变更,将失去粘性,关系表溢出将导致错误等问题。
mod_proxy_balancer通过两种方式实现粘性:cookies和URL encoding。cookie可以被Apache服务器和节点使用,URL encoding通常在节点中使用。
下面的例子使用mod_headers提供负载均衡粘性,即使节点服务器没有设置合适的session cookie。
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy balancer://mycluster> ...... </Proxy> ProxyPass /test balancer://mycluster
env变量有6种,参考:http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#environment
以下配置同时支持cookies和URL encoding
ProxyPass /test balacer://mycluuster stickysession=JSESSIONID|jsessionid scolonpathdelim=On <Proxy balancer://mycluster> BlancerMember http://192.168.1.50:80 route=node1 BlancerMember http://192.168.1.51:80 route=node2 </Proxy>
-
Log
LogFormat "%v %h %l %u %t \"%r\" %{Set-Cookie}o %{BALANCER_SESSION_STICKY}e %{BALANCER_SESSION_ROUTE}e %{BALANCER_WORKER_ROUTE}e %>s %b" balance_common CustomLog logs/balance_log balance_common
将集群的日志写到Apache服务器目录下的logs/balance_log文件中。
参考:http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html#stickyness_troubleshooting
- 均衡器管理界面
需要mod_status。管理页面可以动态更新集群成员,修改平衡器的属性和特定成员或使之离线。
<Location /balancer-manager> SetHandler balancer-manager Require ip 192.168 </Location>
你可以通过http://your.server.name/balancer-manager
访问管理页面。
注意,只有balancers在<Location ...>之外定义,才能使用管理页面。
Tomcat 与 Nginx连接
HTTP连接
server { #添加一个站点 listen 82; #设置端口 server_name localhost; #站点名称/域名 location / { #设置路径 proxy_pass http://ip:8080; #http代理,指向tomcat http地址 } }
在nginx.conf文件中添加一个server{},listen设置端口,server_name设置域名,location设置目录。
proxy_pass是http代理,指向tomcat地址。
修改后conf后,nginx -s reload就可以热更新了,很方便。
AJP连接
关于AJP连接,有一种说法是Nginx采用连接池,所以HTTP方式的连接不比AJP方式差。
有人的测试结果是Nginx通过HTTP连接Tomcat 性能略强于Apache通过AJP连接Tomcat。
参见:http://nginx.2469901.n2.nabble.com/AJP-td7582236.html
Nginx本身并不支持AJP连接,但有人写了一个nginx_ajp_module来支持ajp。由于是第三方控件,所以请在充分测试后使用。
- 下载地址:https://github.com/yaoweibin/nginx_ajp_module
-
安装
cd nginx_dir/ patch -p1 < /tools/nginx_ajp_module/ajp.patch ./configure --prefix=/usr/nginx1.5.3 --add-module=/tools/nginx_ajp_module make make install
先到nginx安装文件的目录下,打ajp补丁,重新配置configure,编辑,安装。
-
配置nginx.conf文件
server { listen 82; server_name localhost; location / { ajp_keep_conn on; #设置是否保持连接 ajp_pass ajp://ip:8009; #Tomcat ajp连接地址和端口 } }
其他配置详情参考:https://github.com/yaoweibin/nginx_ajp_module
Nginx集群配置
HTTP
upstream tomcat_http { #用upstream定义一组服务器 #ip_hash通过记录客户端ip实现粘性session。有一个第三方的module可以用cookie实现粘性:https://code.google.com/p/nginx-sticky-module/ ip_hash; #通过server定义多个服务器 #weight是权重,默认为1。 #max_fails和fail_timeout配合使用,在fail_timeout时间内通信失败达到max_fails的次数后,此服务器在fail_timeout时间内被认为不可用。 server 192.168.50.65:8090 weight=2; server 192.168.50.65:8091 max_fails=3 fail_timeout=30s; #keepalive为连接开启缓存,并设置缓存连接的最大数量。 keepalive 10; } server { listen 82; server_name localhost; location / { #将proxy_pass后的服务器地址,变为upstream的名字 proxy_pass http://tomcat_http; } }
更多参数说明参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
AJP
upstream tomcat_ajp { # upstream定义一组服务器 #srun_id同Tomcat配置中Engine的jvmRoute。 server 192.168.50.65:8019 srun_id=tomcat7_a weight=2; server 192.168.50.65:8029 srun_id=tomcat7_b; #用cookie方式实现粘性session jvm_route $cookie_JSESSIONID reverse; keepalive 10; } server { listen 82; server_name localhost; location / { ajp_keep_conn on; ajp_pass tomcat_ajp; #指定连接到哪个upstream上 } }