文章目录
  1. 1. 原料
  2. 2. Tomcat配置
    1. 2.1. 解释:
    2. 2.2. Nginx配置
    3. 2.3. 代码解释
    4. 2.4. 测试

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

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

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

原料

Tomcat * 3
Nginx
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;     

        }

    }

代码解释

upstream:我们给upstream起了一个别名为backend
在Server节点中配置Nginx监听80端口,并且位置为根路径/,设置反向代理地址为http://backend;这里的backend就是我们之前起的别名
在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进行测试。

通过start nginx.exe启动nginx
分别运行tomcat的bin目录下的startup.bat启动不同的tomcat服务器
在浏览器访问: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;     

        }

    }
}
文章目录
  1. 1. 原料
  2. 2. Tomcat配置
    1. 2.1. 解释:
    2. 2.2. Nginx配置
    3. 2.3. 代码解释
    4. 2.4. 测试
Fork me on GitHub