Nginx作为一款高性能服务器常用于负载均衡及反向代理,相比于Apache,Nginx有着很多优势:
今天我们就实际搭建一个Nginx+Tomcat的负载均衡实例。
这是一个简单的web工程打包文件,核心为一个jsp页面,将其复制三份,分别将其中的index.jsp中的内容设置如下:
test.war(1)
<%
out.println("服务器---11111111111111");
%>
test.war(2)
<%
out.println("服务器---22222222222222");
%>
test.war(3)
<%
out.println("服务器---33333333333333");
%>
这里使用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节点如下
<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>
<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>
<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的负载均衡配置主要有两种方式: 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节点中m,通过server:ip地址的方式我们将三台tomcat的ip地址添加到其中,这里还可以制定负载均衡的策略,如下代码
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s; //设置权重为1,最大失败次数为2,最大重试时间为30秒
到这里就可以启动nginx及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;
}
}
}