本篇整理了如何利用 Nginx 作为反向代理,并配置 SSL 证书,实现 HTTPs 加密传输 Web 网页的内容,提高网站的安全性。
# 国外 StartSSL http://www.startssl.com # 国内 沃通 WoSign https://buy.wosign.com/free/
StartSSL,国外的一家 CA 机构,支持大部分主流的浏览器,Firefox、Chrome、Safari、IE等。 唯一的问题是纯英文的网站,而且,用户体验做的很差。 沃通 WoSign,是国内的一家数字证书商店。官方宣传是支持全球所有浏览器。 申请免费证书的操作流程,全程中文,非常轻松。 验证域名归属性后,下载 SSL 证书。
由于系统之前已经使用 yum 安装了一个低版本的 Nginx,需要升级至较高的版本。
nginx -v
nginx version: nginx/1.0.15
# 在 /etc/yum.repos.d 目录下创建文件 nginx.repo
# nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
yum update nginx
nginx -v
nginx version: nginx/1.8.0
HTTPs 使用 443 端口,进行通信,所以,需要配置 Nginx 监听 443 端口。 如有需要可以将 80 过来的 HTTP 请求,强制重定向到 HTTPs 443 端口。
# Force redirect HTTP request to HTTPs
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 default ssl;
server_name server_name;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_certificate /path/server_name.crt;
ssl_certificate_key /path/server_name.key;
# Support JS WebSocket wss://
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / {
index index.jsp;
root /path;
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Front-End-Https on;
}
}
# /path/jetty/etc/jetty.xml
< New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration" >
< Set name="secureScheme">https< /Set>
...
< Call name="addCustomizer">
< Arg>< New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/>< /Arg>
< /Call>
< /New>
logger.info("========ContextPath: "+request.getContextPath());
logger.info("========Scheme: "+request.getScheme());
logger.info("========serverName: "+request.getServerName());
logger.info("========serverPort: "+request.getServerPort());
2015-11-18 07:40:00 [com.servername.controller.forward.AccountController:160]
INFO: ========ContextPath: /actionpath
2015-11-18 07:40:00 [com.servername.controller.forward.AccountController:161]
INFO: ========Scheme: https
2015-11-18 07:40:00 [com.servername.controller.forward.AccountController:162]
INFO: ========serverName: servername
2015-11-18 07:40:00 [com.servername.controller.forward.AccountController:163]
INFO: ========serverPort: 443
request.getSchema() 可以返回当前页面使用的协议,http 或是 https;
request.getServerName() 可以返回当前页面所在的服务器的名字;
request.getServerPort() 可以返回当前页面所在的服务器使用的端口, 默认是 80;
request.getContextPath() 可以返回当前页面所在的应用的名字;
参考链接
How To Configure Nginx with SSL as a Reverse Proxy for Jenkins
Nginx + https + 免费SSL证书配置指南
Nginx + Tomcat 动静分离实现负载均衡
2015-11-23