Debian系统添加模块并重新编译打包Nginx

之前打包的Nginx已经很久没更新了,前几天正好爆出了两个安全漏洞(HTTP/2(CVE-2018-16843,CVE-2018-16844)和MP4模块(CVE-2018-16845)),再加上想试试brotli压缩,于是花了点时间再次打包了一下,这里做个记录以便查阅。

系统及服务器资源

我是在Linode上开了一台VPS进行操作的,毕竟编译安装这回事,作为一个强迫症来说,不可能在生产服务器上操作,如果手头没有合适的VPS,可以跟我一样,到Linode上开一台按量付费的VPS进行操作,操作完删除即可,点击这里注册,输入优惠码podcastinit2018可以获得20美元,注册好之后即可新建服务器及删除操作。

我是开了一台最便宜的1G内存25G SSD月付5美元的套餐,系统选的是Debian 9 x64,内存建议还是大点,太小可能编译不过。除了Debian9,其实Debian8也是差不多的套路,还在使用Debian 8的,也可以参考一下这些操作。

编译之前的准备工作

虽然是手动编译,但是我也不可能从头到尾再去手动编译打包,毕竟有更简单的办法去完成这项工作,因为Nginx的官方源就提供了所有的编译及打包脚本,我们只需要根据我们的需求修改一下编译脚本即可。

安装编译功能所需要的包:

apt install build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev wget curl git

Debian 8/9及Ubuntu 14.04/16.04/18.04添加Nginx官方源

首先,根据Nginx官方文档添加Nginx的官方源,比起新功能,这种基础的软件,我更加追求稳定,所以我选择的是稳定版,目前版本是1.14.x,相关命令:

vim /etc/apt/sources.list

## Debian 8及Debian 9
deb http://nginx.org/packages/debian/ codename nginx
deb-src http://nginx.org/packages/debian/ codename nginx

## Ubuntu
deb http://nginx.org/packages/ubuntu/ codename nginx
deb-src http://nginx.org/packages/ubuntu/ codename nginx

wget https://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

上述命令中,codename根据实际系统代号进行修改。

然后,新建相关文件夹及下载Nginx相关代码:

cd ~
mkdir -p ~/new/nginx_rebulid/ #创建新目录  用于保存我们所要使用的文件
cd ~/new/nginx_rebulid/ 
apt-get source nginx #下载Nginx源代码
apt-get build-dep nginx  #安装编译Nginx所需要的依赖

准备需要的模块

有了Nginx相关代码及编译脚本之后,我们还需要准备需要添加进Nginx的相关模块。

我的习惯是自行添加的模块都放到/usr/local/src/,所以下述所有的模块放置目录都是这个,根据实际需要准备所需要的模块就行:

cd /usr/local/src/

## Google模块
git clone https://github.com/cuber/ngx_http_google_filter_module
## 替换相关
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
## brotli压缩
git clone https://github.com/google/ngx_brotli.git

上面是我想添加的几个包,除了这几个模块之外,还少了TLSv3,下面还需要将TLSv3添加进去。

Nginx编译添加TLSv1.3支持

由于TLSv1.3需要OpenSSL的支持,在编译之前还需要准备好OpenSSL:

wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar zxvf openssl-1.1.1.tar.gz
mv openssl-1.1.1 openssl

考虑到兼容性的问题,还需要给OpenSSL打个patch:

cd /usr/local/src/
git clone https://github.com/hakasenyang/openssl-patch
cd /usr/local/src/openssl
patch -p1 < /usr/local/src/openssl-patch/openssl-1.1.1-tls13_draft.patch

对于这部分功能,可以进入作者的github了解:https://github.com/hakasenyang/openssl-patch 。

修改Nginx打包配置文件

做好了以上准备之后,下一步就是修改Nginx的配置文件,将上述准备好的模块添加进去了:

cd ~/new/nginx_rebulid/nginx-{nginx版本号}/debian/
vim rules

其实只要修改两行内容,也就是config.status.nginx: config.env.nginxconfig.status.nginx_debug: config.env.nginx_debug里面的CFLAGS的内容,而且第二行内容只是第一行加了个开启debug模式,如果对于Nginx的配置不熟悉的,建议复制原来的内容,然后根据实际需要修改之后再贴回去,比如说我的配置:

CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="$(CFLAGS) -Wno-error" --with-ld-opt="$(LDFLAGS)" --add-module=/usr/local/src/ngx_http_google_filter_module --add-module=/usr/local/src/ngx_http_substitutions_filter_module --with-openssl=/usr/local/src/openssl --with-openssl-opt=enable-tls1_3 --add-module=/usr/local/src/ngx_brotli

注意上面配置中–with-cc-opt=”$(CFLAGS) -Wno-error”这个配置,原来的配置中是没有后面-Wno-error这个的,但是建议加上,因为不加上后面可能会因为一些报错而无法打包成功。

对于没有需要的模块,可以不需要编译进去,比如之前的MP4模块及邮件相关模块,这两个我就从来没使用过。

重新编译Nginx并打包成deb

其实重新编译打包Nginx很简单,因为Nginx官方源已经包含了相关的脚本,我们直接执行就好了:

cd ~/new/nginx_rebulid/nginx-{nginx版本号}/
dpkg-buildpackage -b

如果没有意外,能看到一串串的字符飘过,飘完之后打包也就完成了;如果有意外,根据报错信息一个一个排除就好了。

打包好的deb安装包存放在~/new/nginx_rebuild,我最终包含的文件:

root@Linode-Fremont:~/new/nginx_rebuild# ls
nginx-1.14.1                            nginx_1.14.1-1~stretch_amd64.changes  nginx_1.14.1-1~stretch.debian.tar.xz  nginx_1.14.1.orig.tar.gz
nginx_1.14.1-1~stretch_amd64.buildinfo  nginx_1.14.1-1~stretch_amd64.deb      nginx_1.14.1-1~stretch.dsc            nginx-dbg_1.14.1-1~stretch_amd64.deb

有了安装包,我们可以在本机或者传到别的服务器上安装,安装命令为:

dpkg -i nginx_*~stretch_amd64.deb

如果安装过程报错,执行以下命令即可解决:

apt install -f