编译第三方模块
编译第三方模块
nginx 自从 1.9.11 以后就支持动态加载模块了, 不需要重新编译 nginx, 只需要将模块编译为 so 然后在 nginx 的配置文件中加载就行
官方文档:
- nginx 模块编译文档:https://docs.nginx.com/nginx/admin-guide/dynamic-modules/dynamic-modules/
- nginx 动态模块加载:https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/
- nginx 编译参数:https://nginx.org/en/docs/configure.html
- nginx 模块加载文档:https://nginx.org/en/docs/ngx_core_module.html#load_module
其他文档:
下载对应版本 nginx 源码
为了保证编译出来的动态模块能正常使用,源码需要与当前运行的 nginx 版本相匹配
nginx 版本可用 nginx -v
查看
得知目前 nginx 版本为 1.17.9, 下载 nginx 源码以及模块源码并解压
下载模块源码并配置模块
# 建议不要使用 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
开始编译模块
编译动态模块完成后在 objs 目录下生成模块的 so 文件
加载并使用模块
拷贝模块
模块被存放在 /usr/lib/nginx/modules
下, 将模块挂载入 container 后, 修改 nginx 配置文件 /etc/nginx/nginx.conf
, 加入
重载 nginx 配置即可使用新模块
修改完配置文件后可以在 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
- Nginx-extra:https://nginx-extras.getpagespeed.com/modules/,Github 仓库:https://github.com/GetPageSpeed/ngx_security_headers
- NGINX 官方推荐的动态模块:https://docs.nginx.com/nginx/admin-guide/dynamic-modules/dynamic-modules/
模块列表
-
提供 http header 操作,例如:
more_set_headers 'Foo: Bar';
,源码:https://github.com/openresty/headers-more-nginx-module -
替换链接的功能,例如:
subs_filter a.example.com s.example.com;
,源码:https://github.com/yaoweibin/ngx_http_substitutions_filter_module -
nginx 虚拟主机流量状态模块,源码:https://github.com/vozlt/nginx-module-vts