Nginx+Tomcat 集群部署

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+Tomcat 集群部署相关的知识,希望对你有一定的参考价值。

1.nginx + Tomcat 集群部署 简单配置

  1 #user  nobody;
  2 worker_processes  4;#工作进程的个数
  3 
  4 #error_log  logs/error.log;
  5 #error_log  logs/error.log  notice;
  6 #error_log  logs/error.log  info;
  7 
  8 #pid        logs/nginx.pid;
  9 
 10 
 11 events {
 12     worker_connections  1024;  #单个进程连接数
 13 }
 14 
 15 
 16 http {
 17     include       mime.types;
 18     default_type  application/octet-stream;
 19 
 20     #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
 21     #                  ‘$status $body_bytes_sent "$http_referer" ‘
 22     #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;
 23 
 24     #access_log  logs/access.log  main;
 25 
 26     sendfile        on;
 27     #tcp_nopush     on;
 28 
 29     #keepalive_timeout  0;
 30     keepalive_timeout  65;
 31 
 32     #gzip  on;
 33     #配置反向代理配置
 34     gzip on;
 35     upstream netitcast.com{
 36         # 定下请求ip_hash;
 37         ip_hash;
 38         server 127.0.0.1:8181 weight=1;#服务器配置 代理分配  weight:分配权重 down:不参与负载均衡
 39         server 192.168.0.105:8181 weight=1;#
 40     }
 41 
 42     server {
 43         listen       8888;
 44         server_name  localhost;
 45 
 46         #charset koi8-r;
 47 
 48         #access_log  logs/host.access.log  main;
 49 
 50         location / {
 51             root   html;
 52             index  index.html index.htm;
 53             # 配置
 54             proxy_pass http://netitcast.com;
 55         }
 56 
 57         #error_page  404              /404.html;
 58 
 59         # redirect server error pages to the static page /50x.html
 60         #
 61         error_page   500 502 503 504  /50x.html;
 62         location = /50x.html {
 63             root   html;
 64         }
 65 
 66         # proxy the php scripts to Apache listening on 127.0.0.1:80
 67         #
 68         #location ~ \.php$ {
 69         #    proxy_pass   http://127.0.0.1;
 70         #}
 71 
 72         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 73         #
 74         #location ~ \.php$ {
 75         #    root           html;
 76         #    fastcgi_pass   127.0.0.1:9000;
 77         #    fastcgi_index  index.php;
 78         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 79         #    include        fastcgi_params;
 80         #}
 81 
 82         # deny access to .htaccess files, if Apache‘s document root
 83         # concurs with nginx‘s one
 84         #
 85         #location ~ /\.ht {
 86         #    deny  all;
 87         #}
 88     }
 89 
 90 
 91     # another virtual host using mix of IP-, name-, and port-based configuration
 92     #
 93     #server {
 94     #    listen       8000;
 95     #    listen       somename:8080;
 96     #    server_name  somename  alias  another.alias;
 97 
 98     #    location / {
 99     #        root   html;
100     #        index  index.html index.htm;
101     #    }
102     #}
103 
104 
105     # HTTPS server
106     #
107     #server {
108     #    listen       443 ssl;
109     #    server_name  localhost;
110 
111     #    ssl_certificate      cert.pem;
112     #    ssl_certificate_key  cert.key;
113 
114     #    ssl_session_cache    shared:SSL:1m;
115     #    ssl_session_timeout  5m;
116 
117     #    ssl_ciphers  HIGH:!aNULL:!MD5;
118     #    ssl_prefer_server_ciphers  on;
119 
120     #    location / {
121     #        root   html;
122     #        index  index.html index.htm;
123     #    }
124     #}
125 
126 }

2.关于Session 的问题

  2.1Tomcat 提供了Cluster 的组件实现session 复制 ,Clurster 的配置

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
             channelSendOptions="8">
      <!--
       复制方式:
        org.apache.catalina.ha.session.DeltaManager:复制所有的session 到所有的节点(节点太多,耗费资源)
        org.apache.catalina.ha.session.BackupManager:    

        
        expireSessionsOnShutdown:一个程序被关闭时候,是否要销毁所有session
        notifyListenersOnReplication:session复制和移动的时候通知
      -->
      <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="228.0.0.4"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4002"
                  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=""/>
      <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>

           注意:使用Cluster的组件实现Session复制的时候,一定要在程序中web.xml加上这样一句告诉tomcat这个程序是分布式        

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5">
  <display-name>Test</display-name>
   <!--
        分布式
  -->
  <distributable/>
</web-app>

测试Session复制和Nginx集群是否成功页面

 1 <%@ page contentType="text/html; charset=GBK" %>
 2 <%@ page import="java.util.*" %>
 3 <html><head><title>Cluster App Test</title></head>
 4 <body>
 5 Server Info:
 6 <%
 7 out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
 8 <%
 9   out.println("<br> ID " + session.getId()+"<br>");
10   // 如果有新的 Session 属性设置
11   String dataName = request.getParameter("dataName");
12   if (dataName != null && dataName.length() > 0) {
13      String dataValue = request.getParameter("dataValue");
14      session.setAttribute(dataName, dataValue);
15   }
16   out.println("<b>Session 列表</b><br>");
17   System.out.println("============================");
18   Enumeration e = session.getAttributeNames();
19   while (e.hasMoreElements()) {
20      String name = (String)e.nextElement();
21      String value = session.getAttribute(name).toString();
22      out.println( name + " = " + value+"<br>");
23          System.out.println( name + " = " + value);
24    }
25 %>
26   <form action="index.jsp" method="POST">
27     名称:<input type=text size=20 name="dataName">
28      <br>
29     值:<input type=text size=20 name="dataValue">
30      <br>
31     <input type=submit>
32    </form>
33 </body>
34 </html>

 

到了这里我有两个疑问没有解决,

1.使用Cluster虽然Session复制成功了,但是在网页上使用iframe 框架时候会出现失效

2.文件上传的问题

 

       

 

以上是关于Nginx+Tomcat 集群部署的主要内容,如果未能解决你的问题,请参考以下文章

Docker Compose 一键部署Nginx代理Tomcat集群

Nginx+Tomcat实现负载均衡动静分离集群部署

Tomcat学习总结——Tomcat+Nginx集群解决均衡负载及生产环境热部署

Nginx+Tomcat 部署负载均衡集群

Tomcat+Nginx+Memcacheed集群部署

Tomcat之Nginx+Tomcat实现负载均衡动静分离集群部署