前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何为Nginx添加一个模块(下)?

如何为Nginx添加一个模块(下)?

作者头像
用户1560186
发布2019-11-19 20:39:16
3.2K0
发布2019-11-19 20:39:16
举报
文章被收录于专栏:运维录

开始之前


在《如何为Nginx添加一个模块?》这篇文章介绍了静态模块添加方式,并在文章结尾处放置一个加载动态模块示例链接,但是并没有完整的说明 load_module 指令使用方法,总是觉得这个文章主题并没有全部完成,所以本篇补上加载动态模块部分。

本次示例中使用的是 ngx_echo模块,它的能够输出 nginx全局环境变量,非常适合排错,建议掌握这个模块使用方法。

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

环境描述
代码语言:javascript
复制
容器镜像: nginx:latest
容器系统: debian 9 (stretch)
配置文件: /etc/nginx/nginx.conf
        /etc/nginx/conf.d/default.conf
Docker主机: Ubuntu Server 16.04
操作步骤

1. 查找模块

代码语言:javascript
复制
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. 安装模块

代码语言:javascript
复制
apt install libnginx-mod-http-echo

安装好的模块保存在这个目录里

代码语言:javascript
复制
ls /usr/lib/nginx/modules/ngx_http_echo_module.so

3. 编辑配置文件

代码语言:javascript
复制
# 主配置文件 /etc/nginx/nginx.conf
确保 `load_module` 指令在配置文件首行。
head -n1 /etc/nginx/nginx.conf
load_module modules/ngx_http_echo_module.so;

然后在虚拟主机配置文设置 location 和 echo 指令。

代码语言:javascript
复制
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

代码语言:javascript
复制
nginx -t && nginx -s reload

5. 验证

代码语言:javascript
复制
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

常用变量例如

代码语言:javascript
复制
$http_user_agent: curl/7.58.0
$remote_addr: 119.188.1xx.1xx
$x_forwarded_for: 106.37.2xx.2xx, 119.188.1xx.1xx

那些没有值的变量是因为没有找到其值,例如:

代码语言:javascript
复制
$args:
$http_cookie:
$remote_user:

更多 ngx_echo 使用方法,请参考文章结尾的参考链接。

load_module指令
代码语言:javascript
复制
语法: load_module file;
默认值: 无
使用字段: main
功能: 加载动态模块。
小结

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

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

http://nginx.org/en/docs/ngx_core_module.html#load_module

https://github.com/openresty/echo-nginx-module

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境描述
  • 操作步骤
  • load_module指令
  • 小结
  • 参考
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档