码蚁

打码改变人生

nginx 编译添加动态模块

Posted at — Jan 14, 2019

NGINX 1.9.11 开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展。

已经安装编译安装好的 nginx,可以通过 $ nginx -V 命令输出的 configure arguments 字段查看当时编译参数。

lua-nginx-module 模块编译安装

ngx_http_lua_module 将 Lua 的功能嵌入到 Nginx HTTP 服务器中。

编译服务器安装编译程序组件

$ yum -y install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel 

$ yum install luajit luajit-devel

下载 nginx 源码

$ wget 'https://nginx.org/download/nginx-1.14.2.tar.gz'
$ tar -xzvf nginx-1.14.2.tar.gz
$ cd nginx-1.4.2/

下载 lua-nginx-module 源码

$ wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
$ tar -zxvf v0.10.13.tar.gz 

$ wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
$ tar -zxvf v0.3.0.tar.gz 

只编译模块

$ export LUAJIT_LIB=/usr/lib64
$ export LUAJIT_INC=/usr/include/luajit-2.0

$ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/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='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-dynamic-module=./lua-nginx-module-0.10.13/ --add-dynamic-module=./ngx_devel_kit-0.3.0/

$ make modules

# 编译产出物有两个分别是 ./objs/ngx_http_lua_module.so 和 ./objs/ndk_http_module.so

目标 nginx 服务器使用 module

首先要安装 luajit

$ yum install nginx

复制模块到 nginx 指定目录

$ cp ngx_http_lua_module.so /usr/lib64/nginx/modules
$ cp ndk_http_module.so /usr/lib64/nginx/modules

nginx 配置引用 module

$ cat /etc/nginx/nginx.conf
load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;


location /hello_lua { 
      default_type 'text/plain'; 
      content_by_lua 'ngx.say("hello, lua")'; 
}

访问 /hello_lua 验证模块是否工作正常。

nginx-upsync-module 模块编译安装

nginx-upsync-module 可以同步Consul或其他上游应用。它动态地修改了后端服务器的属性(weight,max_fails 等),而无需重新加载 NGINX。

修改配置文件并重新启动 NGINX 可能并不总是很方便。例如,如果您遇到大量的流量和高负载,则在那时重启 NGINX 并重新加载配置会进一步增加系统的负载并可能暂时降低性能。考虑到扩容会有频繁的配置变更,这对高可用在线业务来说,是不堪承受之重。

模块编译

$ wget https://github.com/weibocom/nginx-upsync-module/archive/v2.1.0.tar.gz
$ tar -zxvf v2.1.0.tar.gz
$ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/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='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-dynamic-module=./nginx-upsync-module-2.1.0/

# 编译产出物
./objs/ngx_http_upsync_module.so

模块使用配置

$ cat /etc/nginx/nginx.conf
load_module modules/ngx_http_upsync_module.so;

# 后端应用服务主动注册到 consul,nginx 从 consul 动态获取 upstream 列表
$ cat /etc/nginx/conf.d/chaos_dailystarapp_com.conf
upstream chaos-php-fpm-default {
      upsync 172.18.80.133:8500/v1/catalog/service/chaos-php-fpm-default upsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;
      upsync_dump_path /etc/nginx/upsync/servers_chaos-php-fpm-default.conf;


      # https://github.com/weibocom/nginx-upsync-module/issues/237
      # add * at the end to make nginx "include" happy when file doesn't exist.
      include /etc/nginx/upsync/servers_chaos-php-fpm-default.conf*;

      # dummy server entry to make nginx config check happy
      # https://github.com/weibocom/nginx-upsync-module/issues/226
      # server 127.0.0.1:9000 down;
}
comments powered by Disqus