跳转至

编译第三方模块

编译第三方模块

nginx 自从 1.9.11 以后就支持动态加载模块了, 不需要重新编译 nginx, 只需要将模块编译为 so 然后在 nginx 的配置文件中加载就行

官方文档:

其他文档:

下载对应版本 nginx 源码

为了保证编译出来的动态模块能正常使用,源码需要与当前运行的 nginx 版本相匹配

nginx 版本可用 nginx -v 查看

> nginx -v

nginx version: nginx/1.19.1

得知目前 nginx 版本为 1.17.9, 下载 nginx 源码以及模块源码并解压

wget https://github.com/nginx/nginx/archive/release-1.19.1.tar.gz

tar -xvf release-1.19.1.tar.gz

下载模块源码并配置模块

# 建议不要使用 master 分支,而是最新的稳定分支
# 一定要阅读文档,确保和 nginx 的兼容关系
git clone \
  -b v0.34 \
  https://github.com/openresty/headers-more-nginx-module.git \
  ./modules/headers-more-nginx-module

下载后,放置到 ./modules 文件夹,方便区分(并非强制要求)

编译模块

先安装编译时依赖的库

apt install -y \
  make gcc \
  zlib1g-dev \
  libpcre3-dev \
  openssl libssl-dev \
  build-essential

 # dnf install gcc-c++ pcre-devel zlib-devel openssl-devel \
 # make automake libxslt-devel libxml2 libxml2-devel gd-devel \
 # perl-devel perl-ExtUtils-Embed

查看原 nginx 的编译参数:可以考虑用 nginx -V 查看编译 nginx 时使用的参数, 将参数加入 configure 命令后编译模块

> nginx -V 

nginx version: nginx/1.19.1
built by gcc 8.3.0 (Debian 8.3.0-6) 
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --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='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.1/debian/debuild-base/nginx-1.19.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

为了保证兼容性,需要增加所有的 nginx 参数

# 最后一行添加要编译的模块: --add-dynamic-module=./modules/ngx_http_substitutions_filter_module
./auto/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='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.1/debian/debuild-base/nginx-1.19.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
  --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' \
  --add-dynamic-module=./modules/ngx_http_substitutions_filter_module

开始编译模块

make modules

编译动态模块完成后在 objs 目录下生成模块的 so 文件

加载并使用模块

拷贝模块

cp objs/ngx_http_headers_more_filter_module.so /etc/nginx/modules/

模块被存放在 /usr/lib/nginx/modules 下, 将模块挂载入 container 后, 修改 nginx 配置文件 /etc/nginx/nginx.conf, 加入

load_module modules/ngx_http_headers_more_filter_module.so;

重载 nginx 配置即可使用新模块

nginx -s reload

修改完配置文件后可以在 maps 中看到 so 已被加载

> cat /proc/4253/maps

564a5ee28000-564a5ee50000 r--p 00000000 fd:00 2851024                    /usr/sbin/nginx
# ...
7f5199349000-7f5199389000 rw-s 00000000 00:04 56787                      /dev/zero (deleted)
7f5199389000-7f51993c9000 rw-s 00000000 00:04 56786                      /dev/zero (deleted)
7f5199409000-7f519940b000 r--p 00000000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f519940b000-7f519940e000 r-xp 00002000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f519940e000-7f519940f000 r--p 00005000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f519940f000-7f5199410000 ---p 00006000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f5199410000-7f5199411000 r--p 00006000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f5199411000-7f5199412000 rw-p 00007000 fd:00 3246356                    /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so
7f5199412000-7f5199414000 rw-p 00000000 00:00 0
# ...

常用第三方模块

Awsome Nginx Module

模块列表