nginx 下使用 SPDY

google 开发的 SPDY 协议已经经历了几个版本,虽然 google 努力推动 SPDY 的使用,但就目前所见,除了一些比较领先的 IT 系统外,使用 SPDY 的站点还是很少。google 宣称 SPDY 可以加速 Web 的传输,从理论上看确实是可以达到加速的目的,但实际效果如何,还有待检验。

已经观望了好一段时间,本人也终于决定实际部署一下 SPDY。网上已经有很多关于如何在 Apache 部署 SPDY 的文章,但现在更多的新网站可能会选择使用 nginx,而且 nginx 1.6.0 也已经支持 SPDY 3.1 了,所以本文打算在 nginx 上部署 SPDY。

使用 SPDY 需要有网站的数字证书,因为 SPDY 是建立在 SSL 之上。测试的话可以使用自签名的,如果是正式站点则要使用由可信赖的 CA 签发的证书。

默认编译的 nginx 并不包含 SPDY 模块,而大部分发行版的软件源管理器提供的 nginx 也都不支持 SPDY,所以还是自行下载和编译 nginx。在 nginx 编译配置的时候需要加上 --with-http_spdy_module 选项,而SPDY是依赖SSL的,最好也加上 --with-http_ssl_module 选项,虽然这个选项一般是默认启用的。

wget http://nginx.org/download/nginx-1.6.0.tar.gz
tar zxvf nginx-1.6.0.tar.gz
cd nginx-1.6.0
 
./configure --prefix=/opt/nginx \
--with-http_ssl_module \
--with-http_spdy_module
 
make
make install

下面是配置 nginx,主要是配置要使用 SPDY 的 server 块里。SPDY 使用 SSL,默认使用 443 端口,还有证书的配置:

server {
    listen       443 ssl spdy;
    server_name  www.yourwebsite.com;
 
    ssl_certificate          /path/to/public.crt;
    ssl_certificate_key      /path/to/private.key;
    ssl_trusted_certificate  /path/to/ca.pem;
 
    location / {
        add_header        Alternate-Protocol         443:npn-spdy/3.1;
    }
...

上面是使用 SPDY 的最基本配置,至此,SPDY 已经可以正常使用。通过 spdycheck.org 来检测网站的 SPDY 支持情况。从本站的检测结果来看,已经支持了 SPDY 3.1。

而最近 OpenSSL 爆出 heartbleed 漏洞,让本人感觉配置使用 SSL 很容易,但要安全却不易。也就是说,并不是使用了 SSL 就一定安全,除了及时补上已发现的安全漏洞外,还有其他关于 SSL 的安全知识需要了解。如哪些 SSL 协议已经不可靠,哪些加密算法已经不再安全等等。google 了很多相关的资料,找到了一份比较有操作性的资料: Hardening Nginx SSL/TSL Configuration。这份资料提到了 5 个在 nginx 下加强 SSL 部署的实际操作点:

  1. 禁止旧的 SSL 协议,只允许使用当前可靠的 SSL 协议:
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  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:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

    除了限制服务器使用的安全算法外,还要设置优先使用服务器提供的加密算法而非客户端指定的加密算法,以缓解 BEAST 攻击:

    ssl_prefer_server_ciphers on;
  3. 配置强度更大的 DHE(Ephemeral Diffie-Hellman,一次性迪菲-赫尔曼密钥)参数。OpenSSL 默认使用 1024 位的 DHE 参数,而现在大部分人都会使用强度更大的 2048 位数字证书,所以也需要加大 DHE 参数的强度:
    openssl dhparam -out dhparam.pem 2048
    ssl_dhparam /path/to/dhparam.pem;
  4. 启用 HSTS。也就是限制网站只能通过 HTTPS 访问,这是降低中间人攻击的主要办法。这一点只适合支持全站使用 HTTPS 访问的站点。在 nginx 中是通过添加下面的 HTTPS 报头来提示浏览器作出该动作:
    add_header Strict-Transport-Security max-age=15768000;

    当然也需要使 HTTP 访问总是重定向到 HTTPS:

    server {
        listen 80;
        add_header Strict-Transport-Security max-age=15768000;
        return 301 https://www.yourwebsite.com$request_uri;
    }
  5. SSL 测试。可以通过 ssllabs.com 提供的服务器和客户端测试来检测网站的 SSL 安全性。本站的检测报告如下:

上述几点也只是比较有实用性的操作,确保 SSL 安全性要了解的内容还有很多。如果确实在维护一个 SSL 站点,需要定时了解最新的 SSL 信息,检查漏洞并及时安装相关的补丁。

使用了 SPDY 之后,从个人的使用体验来看,网站的加载速度并没有明显的提升,反而感觉刚打开网站时,反应比没有使用 SPDY 的时候还慢了。也许是 SSL 加密消耗了部分的处理能力和主机本身也并不给力所导致的。而 SPDY 还有个 push 的操作,可由服务器根据客户端的请求来决定在同一次响应的时候向客户端推送更多的内容,如加载 index.html,而假设服务器已经知道这个页面需要使用到 main.css 和 app.js 这两个资源文件,服务器便可在此次响应中将这两个资源文件连同 index.html 一并推送给客户端,以减少传输次数,从而提高传输效率。由于 nginx 并未提供这个功能,所以这里也没有做实际的测试。

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 69 queries in 0.817 seconds