Nginx与Tomcat搭建负载实战          返回主页

Nginx作为一款高性能服务器常用于负载均衡及反向代理,相比于Apache,Nginx有着很多优势:

  1. 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  2. 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  3. 高度模块化的设计,编写模块相对简单
  4. 社区活跃,各种高性能模块出品迅速啊
  5. Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率

今天我们就实际搭建一个Nginx+Tomcat的负载均衡实例。

原料

  1. Tomcat * 3
  2. Nginx
  3. Test.war

Test.war

这是一个简单的web工程打包文件,核心为一个jsp页面,将其复制三份,分别将其中的index.jsp中的内容设置如下:

test.war(1)
    <%
        out.println("服务器---11111111111111");
    %>
test.war(2)
    <%
        out.println("服务器---22222222222222");
    %>
test.war(3)
    <%
        out.println("服务器---33333333333333");
    %>

Tomcat配置

这里使用Tomcat7进行配置。

将tomcat复制三份分别命名为tomcat1,tomcat2,tomcat3;

修改其中的server.xml,除了将tomcat1保持默认配置外,其余两台的

shutdown="SHUTDOWN"设置为8105,8205(默认为8005)

Connector的port设置为8081,8082(默认为8080)

protocol="AJP/1.3"端口设置为8109,8029(默认为8009)

最后,将test.war分别放置于三台tomcat的webapps文件夹下,并分别配置server.xml文件中的Host节点如下

tomcat1

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Context docBase="C:\Users\Administrator\Desktop\tomcat-nginx-loadbalance\tomcat1\webapps\ROOT\test" path="/" reloadable="true"/>
      </Host>

tomcat2

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Context docBase="C:\Users\Administrator\Desktop\tomcat-nginx-loadbalance\tomcat2\webapps\ROOT\test" path="/" reloadable="true"/>
      </Host>

tomcat3

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Context docBase="C:\Users\Administrator\Desktop\tomcat-nginx-loadbalance\tomcat3\webapps\ROOT\test" path="/" reloadable="true"/>
      </Host>

解释

上述代码的意思为将test配置到每一台tomcat的根路径下,使用localhost:[port]即可访问

Nginx配置

Nginx的负载均衡配置主要有两种方式: 1. nginx 的 upstream默认是以轮询的方式实现负载均衡,这种方式中,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2. 另外一种方式是ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 3. 我们使用轮询的方式模拟负载均衡。

配置代码

        upstream backend {          
                     #ip_hash;          
                     server 127.0.0.1:8081;

                     server 127.0.0.1:8082;

                     server 127.0.0.1:8080;

                 }                                  
            server {

                listen       80;

                server_name  2;      

                location / {            
                #设置主机头和客户端真实地址,以便服务器获取客户端真实IP

                     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_buffering off;                                   
                     #反向代理的地址           
                     proxy_pass http://backend;     

                }

            }

代码解释

  1. upstream:我们给upstream起了一个别名为backend
  2. 在Server节点中配置Nginx监听80端口,并且位置为根路径/,设置反向代理地址为http://backend;这里的backend就是我们之前起的别名
  3. 在upstream节点中m,通过server:ip地址的方式我们将三台tomcat的ip地址添加到其中,这里还可以制定负载均衡的策略,如下代码

    server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s; //设置权重为1,最大失败次数为2,最大重试时间为30秒
    

测试

到这里就可以启动nginx及tomcat进行测试。

  1. 通过start nginx.exe启动nginx
  2. 分别运行tomcat的bin目录下的startup.bat启动不同的tomcat服务器
  3. 在浏览器访问:127.0.0.1,不断刷新页面可以看到如下的结果(结果随机)

    服务器---333333333333 服务器---111111111111111 服务器---22222222222222222

说明:上述的结果不同时出现,每次出现一条,表明我们的负载均衡设置是正确的。 在这里,我们随机关闭其中的一台服务器,并没有影响到我们的访问,nginx会自动调度失败的服务器下线,并将我们引导到其他的服务器节点。

完整配置,可以对其进行修改为自己的配置

    #user  nobody;
    worker_processes  1;
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;       
    #pid        logs/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;     
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';        
        #access_log  logs/access.log  main;     
        sendfile        on;
        #tcp_nopush     on;     
        #keepalive_timeout  0;
        keepalive_timeout  65;      
        gzip  on;
        #server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s; 
         upstream backend {

                 #ip_hash;

                 server 127.0.0.1:8081;

                 server 127.0.0.1:8082;

                 server 127.0.0.1:8080;

             }       
        server {

            listen       80;

            server_name  2;



            location / {

            #设置主机头和客户端真实地址,以便服务器获取客户端真实IP

                 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_buffering off;



                 #反向代理的地址

                 proxy_pass http://backend;     

            }

        }
    }