准备工作

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

1
2
$ sudo apt update
$ sudo apt install build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev wget curl git -y

添加 Nginx 官方源

1
2
3
4
$ sudo apt install curl gnupg2 ca-certificates lsb-release -y
$ echo "deb https://nginx.org/packages/ubuntu/ `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ echo "deb-src https://nginx.org/packages/ubuntu/ `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

下载 Nginx 相关代码

1
2
3
$ mkdir ~/nginx && cd ~/nginx
$ sudo apt source nginx
$ sudo apt build-dep nginx -y

准备需要的模块

1
2
3
4
5
$ mkdir ~/nginx/modules && cd ~/nginx/modules
$ git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
$ git clone https://github.com/google/ngx_brotli
$ cd ~/nginx/modules/ngx_brotli
$ git submodule update --init

增加 TLS 1.3 的支持

先准备好 OpenSSL

1
2
3
$ cd ~/nginx/modules
$ wget -O openssl-1.1.1a.tar.gz https://www.openssl.org/source/openssl-1.1.1a.tar.gz
$ tar zxf openssl-1.1.1a.tar.gz && rm -f openssl-1.1.1a.tar.gz

考虑到兼容性问题,打一个补丁

1
2
3
$ cd ~/nginx/modules/openssl-1.1.1a
$ wget -O openssl-1.1.1a-tls13_draft.patch https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/openssl-1.1.1a-tls13_draft.patch
$ patch -p1 < openssl-1.1.1a-tls13_draft.patch

修改 Nginx 打包配置文件

1
$ cd ~/nginx/nginx-{版本号}/debian && vim rules

其实只要修改两行内容,也就是 config.status.nginx: config.env.nginxconfig.status.nginx_debug: config.env.nginx_debug 里面的 CFLAGS 内容。而且第二行的内容只是第一行的内容加了个 --with-debug

1
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_mp4_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-mail --with-mail_ssl_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)" --with-openssl=/ubuntu/nginx/modules/openssl-1.1.1a --with-openssl-opt=enable-tls1_3 --add-module=/ubuntu/nginx/modules/ngx_http_substitutions_filter_module --add-module=/ubuntu/nginx/modules/ngx_brotli

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

开始编译并打包

1
2
$ cd ~/nginx/nginx-{版本号}
$ dpkg-buildpackage -b

打包好的 .deb 文件存在上一级目录中