Nginx与Tomcat搭建负载实战
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;
}
}
}