我們經(jīng)常會(huì)使用 nginx 作為反向代理,為 tomcat 提供負(fù)載均衡功能。但是往往,nginx 對(duì)外提供的協(xié)議或端口號(hào),與內(nèi)部 tomcat 的協(xié)議和端口號(hào)并不一致。例如:nginx 對(duì)外提供 HTTPS 服務(wù),tomcat 則提供 HTTP 服務(wù),或者 nginx 監(jiān)聽在80 端口,而 tomcat 則監(jiān)聽在8080端口。默認(rèn)情況下,tomcat及應(yīng)用代碼無法感知用戶訪問 nginx 時(shí)使用的端口及協(xié)議,導(dǎo)致應(yīng)用代碼生成的跳轉(zhuǎn)鏈接異常。
為了解決上述問題,我們需要將用戶訪問 nginx 時(shí)的協(xié)議頭及端口號(hào)通過某種方式傳遞給 tomcat。
nginx中, 將協(xié)議頭($scheme)、端口號(hào)通過 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 默認(rèn)配置為 10/8,192.168/16, 169.254/16,127/8。如果你的 proxy 地址在這些地址范圍之內(nèi),你可以不配置 internalProxies,如果 proxy 地址不在這些地址范圍內(nèi)則必須配置。
<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"
/>