Tomcat + Nginx + SSL 实现 HTTPS 访问(Let's Encrypt)
因为信息安全的需要,最近需要给一台应用服务器上添加 SSL 以便开启 HTTPS 访问,服务器上的软件是 Tomcat ,对于 PHP 党来说当然是比较陌生的。
根据网上的教程修改 Tomcat 的配置文件,倒腾了超久之后发现 HTTPS 的监听一直无法生效,而且每次重启都非常费时间,所以开始想用另一条道路:通过 Nginx 反向代理的方式上 HTTPS ,具体的步骤如下:
一、前置工作
配置好 Let's Encrypt 的证书,安装 Nginx 。
二、Nginx 配置
1、将 /etc/nginx/conf.d 内的 default.conf 备份,并将内容修改如下并保存,注意将大写域名部分替换为实际的小写域名:
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
# HTTPS server
server {
listen 443;
server_name www.wavelpc.com;
ssl_certificate /etc/letsencrypt/live/www.wavelpc.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.wavelpc.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
# note, there is not SSL here! plain HTTP is used
proxy_pass http://tomcat;
}
}
2、重启 Nginx 服务。
三、Tomcat 配置
1、在 Tomcat 的 server.xml 的 Connector 修改为,主要是在末尾添加 proxyPory="443" :
<connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443"
proxyPort="443"></connector>
2、在Host 标签结束前添加以下内容:
<valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"></valve>
3、重启 Tomcat 服务。
4、若设定好之后仍抛出 502 Bad Gateway 错误,这是由于没有开放转发权限所致,运行以下命令即可:
setsebool -P httpd_can_network_connect=1
四、自动重定向
1、如果需要全站的 HTTP 访问都转向到 HTTPS,可以在 Nginx 的 /etc/nginx/conf.d/default.conf 文件中添加以下内容:
server {
listen 80;
server_name WWW.WAVELPC.COM;
rewrite ^ https://$server_name$request_uri? permanent;
}
注意:本文中的代码和思路参考了这篇教程:https://juejin.im/post/5a5f0307518825732c539257