为 nginx 添加 HTTP/2 与 CHACHA20_POLY1305 支持

HTTP/2 协议正式发布已有数月有余,主流浏览器的最新版本均已经支持HTTP/2;而且不少Web Server也已经开始支持,nginx官方也表示要在年底支持HTTP/2。HTTP/2基于SPDY,可以有效改善站点的通讯速度,特别是HTTPS站点。本站也早已开启HTST,强制全局HTTPS,适合应用HTTP/2。虽然目前nginx的mainline从1.9.5版本开始支持HTTP/2,不过编译时候需要加上相应参数,不然不会编译HTTP/2的模块。

至于CHACHA20_POLY1305,之前被谷歌广泛应用的对称加密协议,相对于常用的AES,其在ARM平台的性能更佳。然而nginx默认使用的openssl并不支持这种加密方式,因此这里使用libressl作为替代。新版的libressl已经与新版nginx兼容良好,可以直接编译,整个过程非常顺畅,不会出现之前各种编译过程出错的问题。因为如此,本人也能够写出如下一个一键脚本:

编译选项根据自己需求进行更改即可,和HTTP/2和libressl相关的是如下几行,注意HTTP/2和SPDY模块是冲突的:

要启用HTTP/2,只需将http2关键字添加到server的listen中即可:

至于启用CHACHA20_POLY1305加密,则要配置ssl_ciphers,举例如下(这里添加了ECDHE-ECDSA-CHACHA20-POLY1305和ECDHE-RSA-CHACHA20-POLY1305两种加密方式):

如果准备全局HTTPS了,建议打开HSTS:

一键脚本如果有问题,请回复,本人会修改。OVER~

13 条评论

  1. luxurioust 回复

    你好,libressl 已经更新到 2.2.3 脚本45行可使用通配符 *

    1. cokebar 文章作者 回复

      感谢指出错误 那个地方忘了改了 已改

  2. saku 回复

    很好用的脚本,谢谢。
    有点好奇这种源代码编译的软件一般是怎么升级的?
    下载解压新的源码包覆盖编译安装?

    1. saku 回复

      mainline现在版本是1.9.7,不用自己编译也带http2了,还是用官方源了。

    2. cokebar 文章作者 回复

      最后make install换成make upgrade即可升级

    3. cokebar 文章作者 回复

      下载源码→编译→make upgrade

      1. saku 回复

        感谢回复。
        ml的nginx虽然有http2了,但是刚好有两个第三方模块想要用到,就又回来看博主的编译脚本了。
        redis和subtitle。
        这两个好像只有github上release的源码包,不能像博主脚本里那样直接下到latest。

  3. saku 回复

    编译到后面出错,请楼主帮忙看一下我还需要提供什么信息
    make[4]: 进入目录“/root/nginx/libressl-2.3.2/apps/nc”
    CC atomicio.o
    CC netcat.o
    CC socks.o
    CC compat/socket.o
    CC compat/base64.o
    CC compat/readpassphrase.o
    CC compat/strtonum.o
    CCLD nc
    make[4]: 离开目录“/root/nginx/libressl-2.3.2/apps/nc”
    make[4]: 进入目录“/root/nginx/libressl-2.3.2/apps”
    make[4]: 对“all-am”无需做任何事。
    make[4]: 离开目录“/root/nginx/libressl-2.3.2/apps”
    make[3]: 离开目录“/root/nginx/libressl-2.3.2/apps”
    Making all in tests
    make[3]: 进入目录“/root/nginx/libressl-2.3.2/tests”
    make[3]: 对“all”无需做任何事。
    make[3]: 离开目录“/root/nginx/libressl-2.3.2/tests”
    Making all in man
    make[3]: 进入目录“/root/nginx/libressl-2.3.2/man”
    make[3]: 对“all”无需做任何事。
    make[3]: 离开目录“/root/nginx/libressl-2.3.2/man”
    make[3]: 进入目录“/root/nginx/libressl-2.3.2”
    make[3]: 对“all-am”无需做任何事。
    make[3]: 离开目录“/root/nginx/libressl-2.3.2”
    make[2]: 离开目录“/root/nginx/libressl-2.3.2”
    make[2]: 进入目录“/root/nginx/libressl-2.3.2”
    make[2]: *** 没有规则可以创建目标“install_sw”。 停止。
    make[2]: 离开目录“/root/nginx/libressl-2.3.2”
    make[1]: *** [../libressl-2.3.2/.openssl/include/openssl/ssl.h] 错误 2
    make[1]: 离开目录“/root/nginx/nginx-1.9.12”
    make: *** [build] 错误 2

  4. saku 回复

    在make上一行插入以下内容后,编译通过,目前貌似没有问题。
    touch ../libressl-2.3.2/.openssl/include/openssl/ssl.h

    1. cokebar 文章作者 回复

      估计新版本又TM兼容性不太好了

  5. KissIce 回复

    请问这个错误怎么解决,谢谢!!
    ../libressl-2.5.0/.openssl/lib/libcrypto.a(getentropy_linux.o): In function getentropy_fallback':
    /root/libressl-2.5.0/crypto/compat/getentropy_linux.c:375: undefined reference to
    clock_gettime’
    /root/libressl-2.5.0/crypto/compat/getentropy_linux.c:445: undefined reference to clock_gettime'
    collect2: ld returned 1 exit status
    make[1]: *** [objs/nginx] Error 1
    make[1]: Leaving directory
    /root/nginx-1.11.6′
    make: *** [build] Error 2

  6. guopeng 回复

    同样遇到5楼的问题 ,求解

    1. cokebar 文章作者 回复

      libressl和nginx的兼容性问题,比较头疼,我最近没在用libressl了,因为我直接用aes-xxx-gcm了,因为现在手机cpu也有aes硬件加速了,chacha20的意义没那么大了。可以尝试:
      1. 回退老版本的libressl/nginx看能否解决
      2. google一下看有无其他人有解决办法
      3. 试试这个cloudfare对openssl的patch,这个可以让openssl支持chacha20:https://github.com/cloudflare/sslconfig/blob/master/patches/openssl__1.1.0_chacha20_poly1305.patch

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

请输入验证码 *