第三方模块

前言

Nginx的第三方模块是由Nginx社区或其他独立开发者创建的扩展,可以用来扩展或增强Nginx的功能。这些第三方模块可以添加新的功能、提高性能、增强安全性、实现特定用途等等。

常用第三方模块

  1. ngx_http_geoip_module:用于将IP地址转换为地理位置信息,可以根据客户端的位置提供不同的服务。
  2. ngx_http_lua_module:通过Lua脚本语言扩展Nginx的功能,可以实现高度灵活的配置和动态处理请求。
  3. ngx_http_image_filter_module:可以缩放、裁剪、旋转和转换图像格式等等,可以用于图片处理或优化。
  4. ngx_http_auth_pam_module:使用PAM(Pluggable Authentication Modules)来验证用户身份,可以与系统用户数据库集成。

要使用这些第三方模块,您需要在编译Nginx时将其包含在内,并在Nginx配置文件中相应地配置。虽然第三方模块可以为Nginx增加很多有用的功能,但是需要注意的是,不同的第三方模块可能与不同版本的Nginx兼容性不同,因此需要仔细查看相应的文档并确认兼容性。

加载第三方模块

要在Nginx中加载第三方模块,您需要按照以下步骤进行操作:

  • 首先,您需要获取所需的第三方模块的源代码或二进制文件。通常,第三方模块的开发者会提供相应的源代码或二进制文件。
  • 接下来,您需要重新编译Nginx,并在编译时包含第三方模块。您可以使用以下命令来重新编译Nginx并包含第三方模块:
./configure --add-module=/path/to/third-party/module
make
sudo make install

这里的/path/to/third-party/module是您要包含的第三方模块的路径。您可以在configure命令中使用多个--add-module选项来同时包含多个第三方模块。

  • 编译完成后,您需要在Nginx配置文件中启用第三方模块。通常情况下,第三方模块的开发者会提供相应的配置说明,您只需要按照说明进行配置即可。

注意:在加载第三方模块之前,请确保您的Nginx版本与第三方模块兼容。某些第三方模块可能不支持最新版本的Nginx,因此您需要仔细查看相应的文档并确认兼容性。

echo

安装 echo 模块

  • clone完源码包后,重新编译
# echo 模块源码
# ls -l /usr/local/src/echo-nginx-module/
total 76
-rw-r--r-- 1 root root  3184 Apr  6 18:21 config
-rw-r--r-- 1 root root  1345 Apr  6 18:21 LICENSE
-rw-r--r-- 1 root root 54504 Apr  6 18:21 README.markdown
drwxr-xr-x 2 root root  4096 Apr  6 18:21 src
drwxr-xr-x 2 root root  4096 Apr  6 18:21 t
drwxr-xr-x 2 root root    55 Apr  6 18:21 util
-rw-r--r-- 1 root root   986 Apr  6 18:21 valgrind.suppress


# 编译前
# ls -l /apps/nginx/sbin/
total 7420
-rwxr-xr-x 1 nginx nginx 7596456 Apr  2 14:00 nginx


# 获取编译时的选项
# nginx -V
...


# 编译,主要添加 --add-module=PATH 选项来指定第三方模块的路径
# cd /usr/local/src/nginx-1.18.0/
# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/usr/local/src/echo-nginx-module
...
# make && make install


# 编译后
# ls -l /apps/nginx/sbin/
total 15364
-rwxr-xr-x 1 root  root  8131576 Apr  6 23:19 nginx # 新的!
-rwxr-xr-x 1 nginx nginx 7596456 Apr  2 14:00 nginx.old

echo 模块的使用

范例一

location /echo {
    echo "Hello, world!";
}


# curl www.azheng.com/echo
Hello, world!

范例二

下面是一个使用 echo 模块和一些自定义和内置变量的示例配置:

location /test {
    set $my_var "Hello, world!"; # 自定义变量 $my_var,值为"Hello, world!"。
    echo "My variable is: $my_var\n"; # 打印自定义的变量
    echo "My server name is: $server_name\n"; # 内置变量,服务器名称
    echo "My remote address is: $remote_addr\n"; # 内置变量,远程客户端的 IP 地址
    echo "My user agent is: $http_user_agent\n"; # 内置变量,HTTP User-Agent 标头
    echo "My request URI is: $request_uri\n"; # 内置变量,请求的 URI
}

当访问 /test 路径时,nginx 会输出类似于以下内容的响应:

My variable is: Hello, world!
My server name is: example.com
My remote address is: 192.0.2.1
My user agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
My request URI is: /test

您可以根据需要添加或修改变量,并使用它们在 HTTP 响应中输出信息。需要注意的是,在生产环境中不要暴露过多的信息,以防止信息泄漏和安全漏洞。