[Nginx]用自定义 OpenSSL 版本编译 Nginx 以支持 TLS 1.3&Nginx 安装 Lua 扩展教程(更新日期:20190110)

2018年11月17日 0 条评论 195 次阅读 0 人点赞

博主最近偷偷的给博客开启了 TLS 1.3 支持,并且还装上了 Lua 扩展以增强下 Nginx 的功能,折腾之后体感良好,所以分享出来给大家当作教程参考。不过有朋友肯定会感到困惑,为什么我要把自定义 OpenSSL 版本编译 Nginx 和安装 Lua 扩展一起说?其实这也是我故意这么做的。因为在我测试 LNMP 1.5 的时候,发现虽然 LNMP 1.5 支持自定义 OpenSSL 版本编译,且对于 Lua 扩展安装还做了一个非常方便的选项,但是,如果这两者你要同时操作的话,那必然会出现问题。而我最终找出的办法就是两者都手动来操作,不依赖 LNMP 1.5 的 Lua 选项,实际测试也确实只有这样才能两者兼顾,所以我就故意把这两个不相干的东西放在一起来说,希望后面有此想法的人都能注意到这一点。

话不多说,我就直接开始按照我自己的记忆来写教程了~

一、自定义 OpenSSL 版本编译 Nginx,开启 TLS 1.3 支持

目前 OpenSSL 已经发布了 1.1.1 新版,支持最终正式版的 TLS 1.3 协议,但是因为各大 Linux 发行版本的稳定版系统很少有及时更新到这么新的 OpenSSL 的,而且 LNMP 1.5 中自己设置的源码包也比较旧,所以现如今网站要支持 TLS 1.3,最好的选择还是自己编译一下。

对于 Nginx 来说,使用自己指定版本的 OpenSSL 来编译 Nginx 还是比较容易的,开启 TLS 1.3 这个也很轻松没什么难度,下面主要来介绍两种方法:普通编译方法和 LNMP 1.5 编译方法。

普通编译方法

  • 下载并解压好 OpenSSL 最新源码
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar zxf openssl-1.1.1.tar.gz

执行完之后,我们的源码包会保存在/root/openssl-1.1.1 这个目录下。

这一步没什么好说的,按照命令来就可以了,但有两点需要注意:

  1. 注意 wget 之后源码包保存的目录,我这里假设是用 Root 用户进行操作的,默认下载到 wget 命令执行的当前目录,也就是/root,后面不再特别说明,默认都以在此目录下操作,如果你有不同的地方注意自己替换一下。
  2. wget 命令之后的那个链接,是 OpenSSL 官网给的下载地址,目前最新的是 1.1.1,支持 TLS 1.3 最终版本,如果以后有更新版本,注意自己去【这里】找链接替换,替换之后要注意第二个命令解压的源码包名字也得替换下。
  • 获取现有 Nginx 的编译参数
nginx -V

把稍后显示出来的 configure arguments: XXXXXXXXX 这一部分中的 XXXXXXXXX 部分完整的复制下来,不管它有多长。

  • 进入 Nginx 源码保存目录,加入自定义 OpenSSL 编译参数准备编译

Nginx 源码目录不是安装目录,请大家注意区分。进入用 cd 命令,这里就不多少了。如果你不知道你的源码目录在哪里,或者没有保存,那么可以使用下面的命令重新下载解压一个:

wget https://nginx.org/download/nginx-1.15.8.tar.gz
tar zxf nginx-1.15.8.tar.gz
cd nginx-1.15.8

上面的命令有三个需要注意的地方,一是 wget 下载的源码包,我这里演示的是最新的 Nginx 1.15.8,你们也可以下载别的版本的,注意替换下地址。二是 tar zxf 解压的源码包名字,请和前面下载的源码包名字保持一致。三是 cd 命令进入的目录,也是要和前面的名字保持一致。另外,要自己找源码包下载链接的可以去官网看看。

进入之后,把上一步我们复制的 XXXXXXXXX 这部分粘贴到下面这段代码中的对应位置,并加入我们的自定义 OpenSSL 编译参数(注意把后面的 /root/openssl-1.1.1 目录路径替换成前面说的你自己 OpenSSL 源码包保存的地方):

./configure XXXXXXXXX --with-openssl=/root/openssl-1.1.1

然后回车执行就 OK 了。

注意:这里可以再多加一条--with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' ,其中的 enable-tls1_3 是用来开启 TLS 1.3 支持的,不过新版本已经默认开启了,所以不是必要的,除非你发现不加没法开启 TLS 1.3。enable-weak-ssl-ciphers 这个是用来开启 TLS 1.3 被淘汰的部分不安全加密算法的,主要是为了兼容老系统和浏览器,不过我个人觉得没必要。

  • 搞定之后,开始正式编译
make
  • 重命名现有的 Nginx 二进制文件,并复制新二进制文件进去

首先我们要知道现有 Nginx 的安装目录位置,比如如果在 /uer/local/ningx(后面都以安装在该目录下时来进行说明,如果你的不是,请注意替换命令中的目录路径为你自己的),那么执行下面的命令重命名现有 Nginx 的二进制文件:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

然后复制新二进制文件放进原有的 Nginx 安装目录下:

cp objs/nginx /usr/local/nginx/sbin/nginx
  • 测试是否存在问题
/usr/local/nginx/sbin/nginx -t
  • 没有问题就执行更新
make upgrade
  • 完成,重启一下 Nginx
/usr/local/nginx/sbin/nginx restart

到这里就结束了。这里要说明的是,在中途我们只使用了 make 命令编译,但是并没有选择 make && make install,这是因为 make install 虽然也能让我们顺利解决问题,但是这个更加适合于全新安装 Nginx 的时候,如果我们在已经安装了 Nginx 的情况下,使用 make install,是会覆盖安装现有 Nginx 的,没有 upgrade 更新来得方便。

当然,如果你觉得有必要使用 make && make install 也是没什么问题的(最好在操作之前结束现有 Nginx 进程)。那么后面的重命名二进制文件还有复制新二进制文件什么的就不用做了,编译完成测试重启下什么的就没事了。

至于开启 TLS 1.3 的配置部分,我会在最后和 LNMP 1.5 编译方法的一块说。

LNMP 1.5 编译方法

LNMP 1.5 要编译起开还是比较简单的,下面我一点一点来说。

  • 下载并解压好 OpenSSL 最新源码
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar zxf openssl-1.1.1.tar.gz

注意部分就不额外说了,请参照上面的普通方法注意事项。

  • 编辑 LNMP 1.5 安装配置文件,加入自定义 OpenSSL 编译参数
vi /root/lnmp1.5/lnmp.conf

注意:该配置文件可能因你 LNMP 1.5 安装目录的不同而位于其它位置,请以自己的为准。

按 i 进入编辑模式,在如下位置加入自定义 OpenSSL 编译参数:

Nginx_Modules_Options='--with-openssl=/root/openssl'

注意其中的 OpenSSL 源码位置替换成你自己下载解压到的地方。

另外同上面的普通编译方法一样:这里可以再多加一条--with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' ,其中的 enable-tls1_3 是用来开启 TLS 1.3 支持的,不过新版本已经默认开启了,所以不是必要的,除非你发现不加没法开启 TLS 1.3。enable-weak-ssl-ciphers 这个是用来开启 TLS 1.3 被淘汰的部分不安全加密算法的,主要是为了兼容老系统和浏览器,不过我个人觉得没必要。

完成之后,按 ESC 退出编辑状态,:wq 保存并退出。

  • 使用 LNMP 1.5 的 Nginx 升级脚本开始编译 Nginx
cd /root/lnmp1.5
./upgrade.sh nginx

同上面一样,注意其中的 LNMP 1.5 路径改成你自己安装的地方。该脚本执行之后会让你选择升级到 Nginx 哪个版本(让你输入具体的版本号码),你可以写和当前完全相同的版本,也可以真正的升级到别的版本,这里不会影响实际编译效果,版本号可以去 Nginx 官网查询。

编译之后修改 Nginx 虚拟主机配置文件,加入开启 TLS 1.3 的配置

做完上面的两步之后,就算是基本完成了,后面的只要再自己加一下配置就可以了,主要是在原有配置上稍作修改,比如(假设虚拟主机的配置文件位于 /usr/local/nginx/conf/vhost 下):

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";

注意第一行和第三行:

  1. 第一行最后加入 TLSv1.3 表示使用该配置文件的网站开启 TLS 1.3 支持。
  2. 第三行最开头的 TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256 表示的是 OpenSSL TLS 1.3 默认开启支持的三种加密算法,用 : 号隔开,你可以调整这三者的前后顺序来达到优先使用何种加密算法的效果,不过貌似现在还存在一定的问题(Nginx 与 OpenSSL 的些许不兼容?),实际并未按照该先后顺序来判定。不加的话也可以开启 TLS 1.3,会使用默认的先后顺序来匹配。
  3. 配置文件中还可以加一个 ssl_early_data on 来开启 TLS 1.3 的另一个特性,但会牺牲一定的安全性,具体请自行查找有关资料。

修改并保存之后,记得重启下 Nginx 来使得配置生效。

Nginx 普通编译重启:

/usr/local/nginx/sbin/nginx restart

LNMP 1.5 编译方式重启:

lnmp nginx restart

Nginx 开启 Lua 扩展支持

同上面的教程一样,这里我也会分成普通编译方法和 LNMP 1.5 编译方法两种来说。因为耐心有限,有些地方可能说的不是特别清楚,如果有不懂的地方请留言告知。

另外在开始之前先告知一下大家,下面下载到的源码包,都是现时能找到的最新的,如果往后有更新的,请注意替换其中的链接!

LuaJIT 官网下载地址:http://luajit.org/download.html

lua-nginx-module 下载地址:https://github.com/openresty/lua-nginx-module/releases

ngx_devel_kit 下载地址:https://github.com/simplresty/ngx_devel_kit/releases

普通&LNMP 1.5 编译方法准备工作

在开始编译之前,我们需要先安装好 LuaJIT 和下载好后面编译需要的模块,这里不管是普通编译还是 LNMP 1.5 的都适用。

  • 下载并安装 LuaJIT
cd /root
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make
make install PREFIX=/usr/local/luajit
cd ..

说明:此处先将下载并解压的 LuaJIT 存放在了/root 目录下,并最终将其安装在了/usr/local/luajit  目录。

  • 下载并解压 lua-nginx-module&ngx_devel_kit
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.14rc3.tar.gz
tar zxf v0.10.14rc3.tar.gz
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar zxf v0.3.1rc1.tar.gz
  • 为 LuaJIT 设置系统环境变量
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

cat > /etc/ld.so.conf.d/luajit.conf<<EOF
/usr/local/luajit/lib
EOF

ldconfig

PS:第二行的 export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0 这个,博主猜测可能以后会有所变化,比如 LuaJIT 大版本升级到 3 之后,可能就会变成 export LUAJIT_INC=/usr/local/luajit/include/luajit-3.0,请注意一下。

普通编译方法

与上面的自定义 OpenSSL 编译类似,我们需要获取现有 Nginx 的编译参数。

  • 获取现有编译参数
nginx -V

把得到的结果里 configure arguments: XXXXXXXXX 这一部分中的 XXXXXXXXX 部分完整的复制下来,不管它有多长。

  • 用 cd 命令进入 Nginx 源码目录(非 Nginx 安装目录,cd 命令此处略过),如果没有的可以重新下载解压,看下面的代码操作
wget https://nginx.org/download/nginx-1.15.8.tar.gz
tar zxf nginx-1.15.8.tar.gz
cd nginx-1.15.8

上面的命令有三个需要注意的地方,一是 wget 下载的源码包,我这里演示的是最新的 Nginx 1.15.8,你们也可以下载别的版本的,注意替换下地址。二是 tar zxf 解压的源码包名字,请和前面下载的源码包名字保持一致。三是 cd 命令进入的目录,也是要和前面的名字保持一致。另外,要自己找源码包下载链接的可以去官网看看。

  • 重新配置编译参数,加入 Lua 有关参数

进入之后,输入以下的命令,XXXXXXXXX 部分就是你前面复制的那段:

./configure XXXXXXXXX --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib --add-module=/root/lua-nginx-module-0.10.14rc3 --add-module=/root/ngx_devel_kit-0.3.1rc1
  1. --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib 这里不要随便改,除非你的 LuaJIT 安装目录不同
  2. --add-module=/root/lua-nginx-module-0.10.14rc3 这里=后面接你的 lua-nginx-module 解压存放的目录
  3. --add-module=/root/ngx_devel_kit-0.3.1rc1 这里=后面接你的 ngx_devel_kit 解压存放的目录
  • 开始编译
make
  • 重命名现有的 Nginx 二进制文件,并复制新二进制文件进去

首先我们要知道现有 Nginx 的安装目录位置,比如如果在 /uer/local/ningx(后面都以安装在该目录下时来进行说明,如果你的不是,请注意替换命令中的目录路径为你自己的),那么执行下面的命令重命名现有 Nginx 的二进制文件:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

然后复制新二进制文件放进原有的 Nginx 安装目录下:

cp objs/nginx /usr/local/nginx/sbin/nginx
  • 测试是否存在问题
/usr/local/nginx/sbin/nginx -t
  • 没有问题,编译更新
make upgrade
  • 编译完成重启下 Nginx
/usr/local/nginx/sbin/nginx restart

OK!大功告成!最后特别提醒一句,如果你要想自定义 OpenSSL 编译,且加入 Lua 扩展的话,其实看了我上面的步骤之后应该也不难,无非就是在下载并解压好相应的源码包之后,在编译参数那里多加一个前面教程我们用的 OpenSSL 编译参数而已。

PS:此处再次复制一下前面的说明。在中途我们只使用了 make 命令编译,但是并没有选择 make && make install,这是因为 make install 虽然也能让我们顺利解决问题,但是这个更加适合于全新安装 Nginx 的时候,如果我们在已经安装了 Nginx 的情况下,使用 make install,是会覆盖安装现有 Nginx 的,没有 upgrade 更新来得方便。当然,如果你觉得有必要使用 make && make install 也是没什么问题的(最好在操作之前结束现有 Nginx 进程)。那么后面的重命名二进制文件还有复制新二进制文件什么的就不用做了,编译完成测试重启下什么的就没事了。

LNMP 1.5 编译方法

事实上,LNMP 1.5 是自带了安装 Lua 扩展选项的。不过因为这个选项没办法配合自定义 OpenSSL 编译的参数一起使用,所以我们后面主要说的还是手动添加参数的方法(可以配合 OpenSSL 编译参数一起使用),而单纯安装 Lua 的教程,我就只简单说一下了。

  • 编辑 LNMP 1.5 安装配置文件
vi /root/lnmp1.5/lnmp.conf
  • 在如下代码处加入 Lua 编译参数
Nginx_Modules_Options='--with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib --add-module=/root/lua-nginx-module-0.10.14rc3 --add-module=/root/ngx_devel_kit-0.3.1rc1'

共加了三项编译参数,解读可以参照普通编译方法中说的。

如果你只需要安装 Nginx 的 Lua 扩展而不需要自定义 OpenSSL 编译 Nginx,直接改下面这一个选项就行了,不需要添加上面的代码:

Enable_Nginx_Lua='y'

如果两个都需要,请保持 Enable_Nginx_Lua='n'。

PS:要自定义 OpenSSL 版本编译&安装 Lua 扩展,只需要把第一个教程中 LNMP 1.5 方法中添加的编译参数和这里加的编译参数都写进来,再保存好就行了。

  • 进入 LNMP 1.5 安装目录,使用脚本升级 Nginx
cd /root/lnmp1.5
./upgrade.sh nginx

输入之后会让你选择要升级的 Nginx 具体版本号,可在官网查找。注意这里不需要真的升级,填写当前版本的版本号也是可行的。

  • 编译完成,重启下 Nginx
lnmp nginx restart

OK!两个教程我都写完了,不知道对大家有没有帮助?如果有的话,给我评论或者点赞一下吧。_(:з)∠)_

相似文章

12点半

Darkness cannot drive out darkness; only light can do that. Hate cannot drive out hate; only love can do that.

文章评论(0)