nginx & tomcat 获取正确端口号

我们经常会使用 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"
/>

Links

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容