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

2018年11月17日 0 条评论 47 次阅读 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 安装在/usr/local/nginx 下,首先进入:

cd /usr/local/nginx

进入之后,把上一步我们复制的 XXXXXXXXX 这部分粘贴到下面这段代码中的对应位置,并加入我们的自定义 OpenSSL 编译参数:

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

然后回车执行就 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 && make install

 

  • 编译完成,重启 Nginx
service nginx restart

开启 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 普通编译重启:

service 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 部分完整的复制下来,不管它有多长。

 

  • 进入已安装 Nginx 的安装目录,比如/usr/local/nginx
cd /usr/local/nginx

 

  • 重新配置编译参数,加入 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 && make install

 

  • 编译完成重启下 Nginx
service nginx restart

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

 

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)