负载均衡配置(nginx反向代理)
1、准备工作:
- 在/usr/local/nginx/conf 目录下建立一个conf.d 文件夹
- 修改nginx.conf配置文件,在http block下加上如下内容:include conf.d/*.conf;
2、在conf.d 文件夹下建立tomcat.conf文件,内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#upstream作负载均衡,在此配置需要轮询的服务器地址和端口号,max_fails为允许请求失败的次数,默认为1.
#weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
upstream tomcat {
server 192.168.2.149:8080 max_fails=0 weight=1;
server 127.0.0.1:8080 max_fails=0 weight=1;
}
server {
listen 82;
server_name tomcat;
#access_log off;
#error_log /data/logs/nginx/iisad.error.log;
index index.html index.shtml;
location / {
proxy_pass http://tomcat;
#include proxy.conf;
}
}
在/usr/local/nginx/conf下的proxy.conf文件内容如下:
1 | [root@adiiscenter160 conf]# cat proxy.conf |
3、测试:
访问nginx后,nginx会根据权重把请求分发给后端的tomcat。当其中一个tomcat挂掉后,nginx会自动感知到,以后的分发就不会分发到该tomcat上。当tomcat起来以后,nginx会继续转发到它上面。
4、注意事项:
Nginx通过80端口反向代理到Tomcat实现很简单,通过Jsp的request.getServerPort()获取到的端口号依然是80;而如果Nginx使用非80端口做反响代理时request.getServerPort()获取到的端口号返回依然会是80,这样就会导致代码中引入的js等文件找不到…
1 | <% |
解决方法:
- 非80端口,需要设置proxy_set_header Host $host:$server_port;
- 如果是80端口,不需要设置,或者设置成proxy_set_header Host $host;
1 | proxy_redirect off; |
5、Nginx 内置常用变量
1 | $args, 请求中的参数; |
动静分离
1、配置文件同时,在其基础上对tomcat.conf进行如下修改:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32upstream tomcat {
#ip_hash;
server 127.0.0.1:8080;
}
server {
listen 83;
server_name localhost;
#access_log off;
#error_log /data/logs/nginx/iisad.error.log;
#index index.html index.shtml;
#root /data/ifengsite/htdocs/;
#动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡
location ~ .*\.(do|jsp|action)?$ {
proxy_pass http://tomcat;
include proxy.conf;
}
#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /data/;
expires 30d; #使用expires缓存模块,缓存到客户端30天
}
location / {
proxy_pass http://tomcat;
include proxy.conf;
}
}
2、发布:
后端配置好Tomcat服务,并启动,发布的程序需同步到Nginx的/data/对应的目录,因为配置动静分离后,用户请求你定义的静态页面,默认会去nginx的发布目录请求,而不会到后端请求,所以这时候你要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步。(假设项目名为NginxTest,将其发布到tomcat的webapps下,同时还要把NginxTest拷贝到/data/下。)