我们经常会使用 nginx 作为反向代理,为 tomcat 提供负载均衡功能。但是往往,nginx 对外提供的协议或端口号,与内部 tomcat 的协议和端口号并不一致。例如:nginx 对外提供 HTTPS 服务,tomcat 则提供 HTTP 服务,或者 nginx 监听在80 端口,而 tomcat 则监听在8080端口。默认情况下,tomcat及应用代码无法感知用户访问 nginx 时使用的端口及协议,导致应用代码生成的跳转链接异常。

为了解决上述问题,我们需要将用户访问 nginx 时的协议头及端口号通过某种方式传递给 tomcat。

nginx中, 将协议头($scheme)、端口号通过 http 头传递给 tomcat。

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;

tomcat 中, 在 Engine 中添加如下 valve 配置。

internalProxies 默认配置为 10/8,192.168/16, 169.254/16,127/8。如果你的 proxy 地址在这些地址范围之内,你可以不配置 internalProxies,如果 proxy 地址不在这些地址范围内则必须配置。

<Valve className="org.apache.catalina.valves.RemoteIpValve"
    internalProxies="192\.30\.30\.17|192\.30\.30\.16"
    portHeader="x-forwarded-port"
    protocolHeader="x-forwarded-proto"
    proxiesHeader="x-forwarded-by"
    remoteIpHeader="x-forwarded-for"
/>

作者:whyreal
链接:https://www.jianshu.com/p/f4ec9b3afb63
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

发表评论

邮箱地址不会被公开。 必填项已用*标注