开始之前
在《如何为Nginx添加一个模块?》这篇文章介绍了静态模块添加方式,并在文章结尾处放置一个加载动态模块示例链接,但是并没有完整的说明 load_module
指令使用方法,总是觉得这个文章主题并没有全部完成,所以本篇补上加载动态模块部分。
本次示例中使用的是 ngx_echo
模块,它的能够输出 nginx全局环境变量,非常适合排错,建议掌握这个模块使用方法。
nginx 从 1.9.11版本开始支持动态方式加载模块,动态方式让 nginx添加第三方模块更为简单,首先拿到第三方编译好的动态链接库so
文件, 其次使用 load_module
指令加载这个模块,最后检测并重启 nginx就完成了。
容器镜像: nginx:latest
容器系统: debian 9 (stretch)
配置文件: /etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf
Docker主机: Ubuntu Server 16.04
1. 查找模块
apt search mod-http-echo
Sorting... Done
Full Text Search... Done
libnginx-mod-http-echo/oldstable,oldstable,now 1.10.3-1+deb9u3 amd64
Bring echo and more shell style goodies to Nginx
2. 安装模块
apt install libnginx-mod-http-echo
安装好的模块保存在这个目录里
ls /usr/lib/nginx/modules/ngx_http_echo_module.so
3. 编辑配置文件
# 主配置文件 /etc/nginx/nginx.conf
确保 `load_module` 指令在配置文件首行。
head -n1 /etc/nginx/nginx.conf
load_module modules/ngx_http_echo_module.so;
然后在虚拟主机配置文设置 location 和 echo 指令。
cat /etc/nginx/conf.d/default.conf
server
{
#... 其它配置项省略
location = /nginx_var {
default_type 'text/plain';
echo "args:" $args;
echo "content_length:" $content_length;
echo "content_type:" $content_type;
echo "document_root:" $document_root;
echo "host:" $host;
echo "http_user_agent:" $http_user_agent;
echo "http_cookie:" $http_cookie;
echo "limit_rate:" $limit_rate;
echo "request_body_file:" $request_body_file;
echo "request_method:" $request_method;
echo "request_filename:" $request_filename;
echo "request_uri:" $request_uri;
echo "remote_addr:" $remote_addr;
echo "remote_port:" $remote_port;
echo "remote_user:" $remote_user;
echo "x_forwarded_for:" $proxy_add_x_forwarded_for;
echo "query_string:" $query_string;
echo "scheme:" $scheme;
echo "server_protocol:" $server_protocol;
echo "server_addr:" $server_addr;
echo "server_name:" $server_name;
echo "uri:" $uri;
echo "document_uri:" $document_uri;
}
}
4. 重启 nginx
nginx -t && nginx -s reload
5. 验证
curl https://www.demo.com/nginx_var
args:
content_length:
content_type:
document_root: /var/www/html
host: www.demo.com
http_user_agent: curl/7.58.0
http_cookie:
limit_rate: 0
request_body_file:
request_method: GET
request_filename: /var/www/html/nginx_var
request_uri: /nginx_var
remote_addr: 119.188.1xx.1xx
remote_port: 44230
remote_user:
x_forwarded_for: 106.37.2xx.2xx, 119.188.1xx.1xx
query_string:
scheme: https
server_protocol: HTTP/1.1
server_addr: 192.168.128.2
server_name: www.demo.com
uri: /nginx_var
document_uri: /nginx_var
常用变量例如
$http_user_agent: curl/7.58.0
$remote_addr: 119.188.1xx.1xx
$x_forwarded_for: 106.37.2xx.2xx, 119.188.1xx.1xx
那些没有值的变量是因为没有找到其值,例如:
$args:
$http_cookie:
$remote_user:
更多 ngx_echo 使用方法,请参考文章结尾的参考链接。
语法: load_module file;
默认值: 无
使用字段: main
功能: 加载动态模块。
最后来总结下文章中的知识点
http://nginx.org/en/docs/ngx_core_module.html#load_module
https://github.com/openresty/echo-nginx-module