Nginx内部应用重定向问题解决

由于爬虫小组有很多项目要运行在同一个服务器上,而且大家都想使用80端口,这个时候就需要使用神器Nginx了。关于Nginx的反向代理配置其实网上有很多,但是这里还是有必要仔细说一说本小组的实际情况。

部署项目介绍

以反爬虫项目为例,有两个子项目,分别是反爬虫系统和反爬虫后台管理系统,项目如下:

可以看到,这两个项目分别是acs和acsd,一旦Tomcat成功在本地启动,这两个项目对应的接口分别如下:

Nginx配置文件

使用Nginx部署的时候,写了两个子配置文件,acs_server.conf和acsd_server.conf,分别如下:
acs_server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ACS系统配置
server {
listen 80;
listen 443;

ssl on;
ssl_certificate /usr/local/etc/ssl/acs.qinjiangbo.com.pem;
ssl_certificate_key /usr/local/etc/ssl/acs.qinjiangbo.com.key;

server_name acs.qinjiangbo.com.com;
access_log logs/access.log main;

location / {
proxy_pass http://127.0.0.1:8080/acs/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

acsd_server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ACSD系统配置
server {
listen 80;
listen 443;

ssl on;
ssl_certificate /usr/local/etc/ssl/keys/admin.acs.qinjiangbo.com.pem;
ssl_certificate_key /usr/local/etc/ssl/keys/admin.acs.qinjiangbo.com.key;

server_name admin.acs.qinjiangbo.com;
access_log logs/access.log main;

location / {
proxy_pass http://127.0.0.1:8080/acsd/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

好了,在浏览器端访问的时候直接输入https://acs.qinjiangbo.com/或者是https://admin.acs.qinjiangbo.com/就能访问对应的网站了。

内部应用重定向的问题

是这样的,acs这个项目需要进行重定向,也就说,内部会使用request.sendRedirect()进行重定向操作,这个时候前端的URL地址栏就变成了这个地址

多加了一个acs?是的,你没看错。这种情况是由于Nginx多次映射导致的,针对这种情况的解决方案非常少,至少我当时Google和百度了好久都没有令人满意的。这个时候就需要仔细搞清楚Nginx的实现逻辑,只有这样才能知道这个问题的答案。

问题的解决方案

其实这个问题的最终解决方案非常简单,我们知道proxy_pass是用来转发请求的,将前台的请求转发到后台服务器,以一个固定的地址。OK,那么我们就需要将这个包含/acs/的地址进行重新改写,这样才能够去掉Nginx内部重定向导致的URL多了一个根目录的问题。这里需要使用rewrite命令,具体的解决方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ACS系统配置
server {
listen 80;
listen 443;

ssl on;
ssl_certificate /usr/local/etc/ssl/keys/acs.qinjiangbo.com.pem;
ssl_certificate_key /usr/local/etc/ssl/keys/acs.qinjiangbo.com.key;

server_name acs.qinjiangbo.com;
access_log logs/access.log main;

location / {
proxy_pass http://127.0.0.1:8080/acs/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

rewrite ^/acs/(.*)$ $scheme://$server_name:$server_port/$1 last;
}
}

这样的话,问题得解!关于rewrite的具体使用方法,请参考Nginx的官方文档。

总结

关于这个问题,困扰了我好久,终于通过自己的努力将这个问题解决了。解决问题的思路一定是现需要理解这个问题出现的原因,然后才能比较好采用对应的解决方案。之前有点着急,到处找解决方案,无果。现在决定仔细思考这个问题的本质,然后就采用上述的方法非常有效地解决了Nginx内部应用重定向的问题。

分享到