由于爬虫小组有很多项目要运行在同一个服务器上,而且大家都想使用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内部应用重定向的问题。