跳转至

Nginx 反向代理 Tomcat 错误示例


2016-10-14 by dongnan

开始之前

这篇文章的内容来源 2016年的两篇文章,当时使用 Nginx 反向代理 Tomcat/Resin 出现错误,发现是 proxy_redirect 指令导致的问题,错误的原因令人印象很深刻。

错误的原因是没有详细查看指令和参数的含义,直接照搬他人的示例配置,这种方式是不可取的,因为你的环境与目标可能是不同的,同样参数配置可能会适合作者但未必能适合你,所以示例配置仅能作参考,务必要结合自己的实际需求做出相应调整。

问题描述

某台测试机安装有 nginxtomcat ,并使用 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
  • 功能: 这个指令用于修改从被代理服务器传来的应答头中的LocationRefresh字段。

举个栗子

假设

被代理服务器返回的 Location字段为:http://localhost:8080/3g/video

代理服务器设置 proxy_redirect http://localhost:8080/3g/ http://demo.com/m/;

那么 Location字段将重写为 http://demo.com/m/video

default 参数

将根据 locationproxy_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/ /;

欢迎关注微信公众号: 运维录

Back to top