Nginx 反向代理 Tomcat 错误示例
2016-10-14 by dongnan
开始之前
这篇文章的内容来源 2016年的两篇文章,当时使用 Nginx
反向代理 Tomcat/Resin
出现错误,发现是 proxy_redirect
指令导致的问题,错误的原因令人印象很深刻。
错误的原因是没有详细查看指令和参数的含义,直接照搬他人的示例配置,这种方式是不可取的,因为你的环境与目标可能是不同的,同样参数配置可能会适合作者但未必能适合你,所以示例配置仅能作参考,务必要结合自己的实际需求做出相应调整。
问题描述
某台测试机安装有 nginx
与 tomcat
,并使用 nginx
反向代理 tomcat
,错误表现为访问服务器时会重定向为 tomcat的地址,即http://127.0.0.1:8204/
。
配置文件
server
{
#... 其它配置项省略
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8204/;
proxy_redirect off; #注意这里的 off 参数啊!!!
}
#... 其它配置项省略
}
关于参数含义请参考这篇文章 <<Nginx Proxy反向代理>>
问题原因
使用 nginx
反向代理 tomcat
或者 resin
服务器,如果出现上述的问题请检查nginx配置文件中 proxy_redirect指令是否使用了off选项
(关闭所有proxy_redirect指令)。
在不确定 off
参数是否有副作用的情况下请使用默认选项,即 proxy_redirect default;
。
proxy_redirect 指令
- 语法:
proxy_redirect [ default|off|redirect replacement ]
- 默认值:
proxy_redirect default
- 使用字段:
http, server, location
- 功能: 这个指令用于修改从被代理服务器传来的应答头中的
Location
和Refresh
字段。
举个栗子
假设
被代理服务器返回的 Location字段为:http://localhost:8080/3g/video
代理服务器设置 proxy_redirect http://localhost:8080/3g/ http://demo.com/m/;
那么 Location
字段将重写为 http://demo.com/m/video
。
default 参数
将根据 location
和 proxy_pass
指令的设置来决定,例如下列两个配置等效的。
#... 两个配置等效的
location /m/ {
proxy_pass http://upstream:port/3g/;
proxy_redirect default;
}
location /m/ {
proxy_pass http://upstream:port/3g/;
proxy_redirect http://upstream:port/3g/ /m/;
}
#... 其它配置项省略
off 参数
将在这个字段中禁止所有的 proxy_redirect
指令:
proxy_redirect off;
proxy_redirect default;
proxy_redirect http://localhost:8080/ /;