14 Dec 2016
nginx给tomcat集群做反向代理,使用非80端口对外提供访问,需要使用ip和域名访问都可正常访问。
发现使用ip访问时,静态资源无法显示。而使用域名来访问,则可正常显示静态资源。
使用chrome查看请求过程,发现静态网络资源访问时,竟然请求的是80端口,而不是我们自定义的端口;
网查后,初步发现原因是,向nginx发送请求,使用的是自定义端口,nginx将请求发送给tomcat,而tomcat在返回其他网络资源给客户端时,它并不知道我们使用了自定义端口,所以默认使用了ip:80端口,而nginx并没有监听80,所以出现了资源请求失败的情况。
而之所以域名可以访问静态资源,是因为tomcat返回给客户端时使用的是域名,而域名经过dns解析,会获取cdn的配置,获得的是配置的自定义端口,则不会出错。
既然此问题出现在tomcat返回给客户端http网络资源时出现问题,当然要从tomcat的配置下手
http:$CATALINA_BASE/conf/server.xml
<Connector port="6236" protocol="HTTP/1.1"
proxyPort="6116"
...
redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8" />
增加配置proxyPort,将其配置为自定义的端口,则tomcat在返回给客户端时,会使用配置的端口,客户端使用这个端口则可正确访问静态网络资源。
https:$CATALINA_BASE/conf/server.xml
<Connector port="6236" protocol="HTTP/1.1"
proxyPort="6116"
sslProtocol='SSL'
scheme='https'
...
redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8" />
此处比http增加了sslProtocol,scheme
之所以tomcat不知道nginx配置的自定义端口,那也有nginx的部分原因,是因为nginx没有显式的告诉tomcat它使用了什么端口,所以tomcat才会傻傻的去使用默认的80
location / {
proxy_pass http://tomcat;
index index.jsp index.htm index.html;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
将proxy_set_header Host $host;改为proxy_set_header Host $host:$server_port;
无论是在nginx还是tomcat上去配置,原理都是在request header中的$host后面增加端口号。