使用 Nginx 构建优化的 https 服务

推荐使用 Nginx 1.6 以上版本,用以支持 spdy 3.0。虽然 http/2 已经推出,但现在浏览器支持度太低,服务器也只有几个小应用,Nginx 和 Apache 都还没有支持 http/2。

所以 spdy 依然是加速 https 的最好方式,但 Chrome 新版已经不支持 spdy 2.0 及以下版本,所以新版 Nginx 对 https 是很有帮助的。

首先监听443端口。

listen       443 ssl spdy;

老版本 Nginx 大家都用 ssl on,新版本(0.7.14以上)就推荐在 listen 加 ssl 关键字,这样最大的好处是在一个 Server 段里可同时支持 http 与 https 服务,像这样:

listen   80;
listen   443 ssl;

配置证书:

ssl_certificate      /etc/nginx/zhigang.net.crt;
ssl_certificate_key  /etc/nginx/zhigang.net.key;

证书现在免费的 StartSSL 挺好的,大部分浏览器都支持,新版 Linux 也都内置了 StartSSL 的 CA 证书。只是 java 目前还没有内置。具体申请与使用回头单写。

启用 ssl session 缓存:

ssl_session_cache shared:SSL:10m;
ssl_session_timeout  10m;

第一条设置一10M大小的缓存池,因为 Nginx 使用本地内存,所以这在分布式系统中作用就不大了。第二条缓存时间,单位分钟。

加密协议与算法:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;

因 SSL3.0 及以下版本已被爆出各种漏洞,现在已极不推荐使用,所以我们只启用 TLS 系列协议。

加密算法部分涉及东西太多,这里先注意需禁用的几个:MD5 RC4 DES 及 NULL。这里列出的算法规则应该是比较优化的。

启用 OCSP

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/startssl_trust_chain.crt;
resolver 8.8.8.8 8.8.4.4;

简单点说,启用 OCSP 可以让浏览器更快的获取证书撤销状态,提高加载速度。ssl_trusted_certificate 是 CA 的证书链,如 StartSSL class 1 证书这样生成:

wget https://www.startssl.com/certs/ca-sha2.pem
wget https://www.startssl.com/certs/class1/sha2/pem/sub.class1.server.sha2.ca.pem
cat sub.class1.server.sha2.ca.pem ca-sha2.pem > startssl_trust_chain.crt

启用 HSTS

add_header Strict-Transport-Security "max-age=31536000";

用于通知浏览器强制使用 https 通信,这样下次用户在直接输入域名访问时,浏览器会自动使用 https 请求,避免一次跳转。

Notes

完成设置后可以使用测试网站:https://www.ssllabs.com/ssltest/ 测下自己的得分,本站经过优化前的 D 提升到了 A+。

Ubuntu双线双IP配置

软件环境

Ubuntu 14.04

网络环境

两条网络,电信与移动,测试服务器位于内网,移动IP:192.168.1.8,电信IP:192.168.23.8。

路由器使用端口映射对外暴露部分服务。

设置网络

/etc/network/interfaces

auto em1
#iface em1 inet dhcp
iface em1 inet static
address 192.168.1.8
gateway 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0

auto em2
iface em2 inet static
address 192.168.23.8
netmask 255.255.255.0

em1 使用移动网络,服务器默认出口。em2 使用电信网络,不设置网关。

设置路由表,实现原路返回数据

修改:/etc/iproute2/rt_tables 文件,增加条记录

252 mobile
251 telecom

执行命令:

ip route flush table telecom
ip route add default via 192.168.23.1 dev em2 src 192.168.23.8 table telecom
ip rule add from 192.168.23.8 table telecom

将以上命令加入 /etc/rc.local 实现重启配置不丢失。

在这个案例中,移动为默认网络,所以不需要特殊配置路由表,否则会导致网络不通。

设置路由表,实现指定网络访问特定内容

route add -host 91.189.95.83 gw 192.168.23.1

91.189.95.83 是 launchpad.net 源的IP地址,移动访问不稳定,这里指定网关使用电信网络访问。

结语

网上很多教程是错误的,主要在实现原路返回数据部分,很多人都说要写两个网络的路由表,但这会直接导致网络不通,我也在这里卡了很久。