之前打包的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.nginx及config.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