Nginx+Tomcat+HTTPS配置不需要在Tomcat上启用SSL支持

coding

Nginx SSL+tomcat集群 Nginx tomcat no 不用https

最近做了个Web项目, 架构上使用了 Nginx +tomcat 集群, 且全站HTTPS,用nginx 做负载,nginx和tomcat 使用内网http通信,遇到http css,js静态资源被浏览器拦截问题,网上搜索到的很多文章在描述 Nginx + Tomcat 启用 HTTPS 支持的时候,都必须在 Nginx 和 Tomcat 两边同时配置 SSL 支持,今天做个总结。

遇到问题

  1. nginx强制使用https访问(http跳转到https)
  2. http的js,css 等静态资源被浏览器拦截(http不被信任)

最后的解决方案

首先解决第一个问题全站https
参考
三种方式,跟大家共享一下

nginx的rewrite方法

server {  

listen 192.168.1.111:80;

server_name test.com;

rewrite ^(.*)$ https://$host$1 permanent;

}

nginx的497状态码,我选择了这种方式

server {  

listen 192.168.1.11:443; #ssl端口

listen 192.168.1.11:80; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口

server_name test.com;

#为一个server{......}开启ssl支持

ssl on;

#指定PEM格式的证书文件

ssl_certificate /etc/nginx/test.pem;

#指定PEM格式的私钥文件

ssl_certificate_key /etc/nginx/test.key;

#让http请求重定向到https请求

error_page 497 https://$host$uri?$args;

}

index.html刷新网页

<html>  

<meta http-equiv="refresh" content="0;url=https://test.com/">

</html>

当http访问到index.html时候自动跳转到https


接下来解决第二个问题
如果tomcat 和nginx 双方没有配置X-Forwarded-Proto tomcat就不能正确区分实际用户是http 还是https,导致tomcat 里配置的静态资源被认为是http而被浏览器拦截,request.getScheme()总是 http,而不是实际的http或https

分别配置一下 Nginx 和 Tomcat ,果然好了。
配置 Nginx 的转发选项:

 proxy_set_header       Host $host;  

proxy_set_header X-Real-IP$remote_addr;

proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto$scheme;

配置Tomcat server.xml 的 Engine 模块下配置一个 Valve:

<ValveclassName="org.apache.catalina.valves.RemoteIpValve"remoteIpHeader="X-Forwarded-For"protocolHeader="X-Forwarded-Proto"protocolHeaderHttpsValue="https"/>

非80端口配置
Nginx增加以下配置
proxy_set_header Host $host:$server_port; 非80端口 ,用80端口时 不需要$server_port
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

Tomcat server.xml配置
<Engine name="Catalina" defaultHost="localhost">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https" httpsServerPort="7001"/> 非80端口时,必须增加httpsServerPort配置,不然request.getServerPort()方法返回 443.
</Engine>

关于 RemoteIpValve,可以阅读下 doc

http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html

以上是 Nginx+Tomcat+HTTPS配置不需要在Tomcat上启用SSL支持 的全部内容, 来源链接: utcz.com/z/510033.html

回到顶部