2017年04月25日发布的nginx 1.13.0支持了TLSv1.3,而TLSv1.3相比之前的TLSv1.2、TLSv1.1等性能大幅提升。而宝塔面板目前的nginx版本是1.12.1,在nginx官网的最新版本是1.13.8,所以我迫不及待地将nginx升级到最新版1.13.8。下面记录如何升级nginx,本文基于CentOS Linux 7.4.1708 (Core),其他的操作系统略有不同。
获得宝塔 nginx 的编译参数
nginx -V
从图中可以看出他的版本号和配置文件路径和添加的模块路径都在/www/server
下, 其中/www
是宝塔默认安装路径, server 则是宝塔存服务端和配置文件的路径, 于是确定了这是宝塔的 nginx, 将 configure arguments: 后面的参数 cpoy 下来, 后面需要用到.
下载 nginx 1.13.8
这部分很简单, 就不截图了, 直接贴命令
wget http://nginx.org/download/nginx-1.13.8.tar.gz tar zxvf nginx-1.13.8.tar.gz
你也可以去 nginx 官网找最新版, 但是版本号差很多的话我不确定是否能用.
编译 nginx
直接给出命令, 其中./configure
后面那一串就是刚刚 copy 的 configure arguments: 后面的参数 (保险起见请 copy 自己的那一段参数)
cd nginx-1.13.8 ./configure--user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-ld-opt=-ljemalloc make
这里说明下, 首先是运行./configure
之后会有 ipv6 的警告, 这个可以不用理会, 直接 make 编译.
安装
这里需要注意, 不要直接make install
, 这样可能会覆盖一些配置文件, 先通过find / -name nginx
查找当前服务器里名为 nginx 的文件或目录.
这里可以看到在/www/server
目录里有几个叫 nginx 的文件或目录, 其中最可疑的就是/www/server/nginx/sbin/nginx
, 直接执行/www/server/nginx/sbin/nginx -V
可以看到 nginx 的版本和参数都和宝塔 nginx 的一样, 可以确定这就是宝塔的 nginx.
然后使用 cp 命令将编译好的新版本覆盖掉宝塔的 nginx.
cp objs/nginx /www/server/nginx/sbin/nginx
这里要注意, 如果提示文件正忙需要先去宝塔停止 nginx 之后再覆盖, 覆盖后再打开 nginx, 如果没有提示文件正忙直接覆盖后去面板点击重载配置.
其它提示
宝塔 nginx 路径可能会变更, 如果发现路径不是/www/server/nginx/sbin/nginx
的话, find 找到的每个都加 -V 试一下.
nginx 编译时的./configure
参数中的 openssl 需要使用宝塔自带的 openssl 那个路径, 之前我使用了自己下载的新版, 编译时提示 lua 错误, 具体原因不知.
上面的 cp 命令中的 objs/nginx 是自己编译后的 nginx,nginx 编译后文件会生成在编译目录的 objs 目录里.
在nginx中启用TLSv1.3
我们到网站的 nginx 配置中,找到如下的配置:
ssl_ciphers
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
我们只需要把 TLSv1.3
加到 ssl_protocols
后面,同時添加TLSv1.3可以使用的加密套件即可:
ssl_ciphers
"TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
保存并重启nginx。
验证nginx是否支持TLS 1.3
我们可以通过 nginx -t
命令来验证nginx是否支持TLS 1.3:
如果nginx支持TLS 1.3,将会输出下面的信息
[root@VM_95_137_centos ~]$ nginx -t
nginx: the configuration
file
/etc/nginx/nginx
.conf syntax is ok
nginx: configuration
file
/etc/nginx/nginx
.conf
test
is successful
如果nginx不支持TLS 1.3,将会输出下面的信息
[root@mlsha.cn
/data/log
]$ nginx -t
nginx: [warn] invalid value
"TLSv1.3"
in
/etc/nginx/conf
.d
/default
.conf:12
nginx: configuration
file
/etc/nginx/nginx
.conf
test
failed
现在你已经在nginx正确地启用了TLS 1.3;但是如果你的OpenSSL版本没有升级到1.1.1的draft-18分支版本也是不支持的。也就是说,虽然我们在nginx启用了TLS 1.3,但实际上最终网站还是使用TLS 1.2 及以下版本进行连接,还需要升级OpenSSL以及开启浏览器对TLS1.3的支持才行.
暂无评论