跳转至

Nginx echo 模块


2016-01-18 by dongnan

开始之前

nginx 从 1.9.11版本开始支持动态方式加载模块,动态方式让 nginx添加第三方模块更为简单, 首先拿到第三方编译好的动态链接库so文件, 其次使用 load_module指令加载这个模块,最后检测并重启 nginx就完成了。

操作步骤

查找模块

# 执行命令
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

安装模块

# 执行命令
apt install libnginx-mod-http-echo

# 安装好的模块保存在这个目录里
ls /usr/lib/nginx/modules/ngx_http_echo_module.so

编辑配置文件

# 主配置文件 
vim /etc/nginx/nginx.conf

# 确保 `load_module` 指令在配置文件首行。
load_module modules/ngx_http_echo_module.so;

然后在虚拟主机配置文设置 locationecho 指令。

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;
    }
}

重启 nginx

nginx -t && nginx -s reload

验证

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 #这个变量等于请求行中的参数。
 $content_length #请求头中的Content-length字段。
 $content_type #请求头中的Content-Type字段。
 $document_root #当前请求在root指令中指定的值。
 $host #请求主机头字段,否则为服务器名称。
 $http_user_agent #客户端agent信息
 $http_cookie #客户端cookie信息
 $limit_rate #这个变量可以限制连接速率。
 $request_body_file #客户端请求主体信息的临时文件名。
 $request_method #客户端请求的动作,通常为GET或POST。
 $remote_addr #客户端的IP地址。
 $remote_port #客户端的端口。
 $remote_user #已经经过Auth Basic Module验证的用户名。
 $request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
 $query_string #与$args相同。
 $scheme #HTTP方法(如http,https)。
 $server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
 $server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
 $server_name #服务器名称。
 $server_port #请求到达服务器的端口号。
 $request_uri #包含请求参数的原始URI,不包含主机名,如:"/foo/bar.php?arg=baz"。
 $uri  #不带请求参数的当前URI,$uri不包含主机名,如"/foo/bar.html"。
 $document_uri #与$uri相同。

load_module指令

语法: load_module file;
默认值: 无
使用字段: main
功能: 加载动态模块。

小结

最后来总结下文章中的知识点

  • 添加的模块要与nginx版本相对应。
  • 动态方式,优势在于操作灵活简洁。
  • 静态方式,优势在于提供更好的性能。
  • 使用静态方式还是动态方式需要根据项目环境和实际需求来决定。

参考

  • http://nginx.org/en/docs/ngx_core_module.html#load_module
  • https://github.com/openresty/echo-nginx-module

欢迎关注微信公众号: 运维录

Back to top