不得不知道的Nginx模块

683 阅读6分钟

Nginx运维过程中常用到的模块,持续更新中。。。。。

ngx_log_if ⭐️⭐️⭐️⭐️

Nginx日志过滤模块,允许您控制不要写的访问日志github.com/cfsego/ngx_…

location / {
	access_log_bypass_if ($status = 404); #不记录404状态的所有日志信息
	access_log_bypass_if ($uri ~* 'images'); #不记录uri中所有images目录下文件的日志信息
	access_log_bypass_if ($uri = '/index.html'); #不记录uri为/index.html的日志信息
	access_log_bypass_if ($host ~* 'tonv.cc'); #不记录host为tonv.cc的所有日志信息
}

nginx-http-concat ⭐️⭐️⭐️⭐️

前端资源合并请求,类似这样来请求example.com/??style1.cs… 每个http请求的应答都是非常昂贵的, 并且我们知道浏览器本身也有并发请求限制,当一个网站并发请求非常多时,也会非常影响性能的。通常来说合并css、js也是为了将很多小的css文件全部合并成一个http返回,也是非常重要的优化手段,github.com/alibaba/ngi…

location /static/css/ {
    concat on; #开启合并功能
    concat_max_files 20;#合并的最大文件数
}
    
location /static/js/ {
    concat on;
    concat_max_files 30;
}

nginx-image-filter-watermark ⭐️⭐️⭐️

可以实现对图片进行编辑处理,包括水印、裁剪。github.com/intaro/ngin…

image_filter watermark;

image_filter_watermark_width_from 300;
image_filter_watermark_height_from 400;
    
image_filter_watermark "PATH_TO_FILE";
image_filter_watermark_position center-center; # top-left|top-right|bottom-right|bottom-left|right-center|left-center|bottom-center|top-center|center-center|center-random`

ngx_image_thumb ⭐️⭐️⭐️

主要功能是对请求的图片进行缩略/水印处理,支持文字水印和图片水印,支持自定义字体,文字大小,水印透明度,水印位置。 判断原图是否是否大于指定尺寸才处理。 github.com/oupula/ngx_…

image on/off 是否开启缩略图功能,默认关闭
image_backend on/off 是否开启镜像服务,当开启该功能时,请求目录不存在的图片(判断原图),将自动从镜像服务器地址下载原图
image_backend_server 镜像服务器地址
image_output on/off 是否不生成图片而直接处理后输出 默认off
image_jpeg_quality 75 生成JPEG图片的质量 默认值75
image_water on/off 是否开启水印功能
image_water_type 0/1 水印类型 0:图片水印 1:文字水印
image_water_min 300 300 图片宽度 300 高度 300 的情况才添加水印
image_water_pos 0-9 水印位置 默认值9 0为随机位置,1为顶端居左,2为顶端居中,3为顶端居右,4为中部居左,5为中部居中,6为中部居右,7为底端居左,8为底端居中,9为底端居右
image_water_file 水印文件(jpg/png/gif),绝对路径或者相对路径的水印图片
image_water_transparent 水印透明度,默认20
image_water_text 水印文字 "Power By Vampire"
image_water_font_size 水印大小 默认 5
image_water_font 文字水印字体文件路径
image_water_color 水印文字颜色,默认 #000000

nginx-rtmp-module ⭐️⭐️

基于RTMP视频直播和点播服务,在流媒体服务上用的多。github.com/arut/nginx-…

headers-more-nginx-module ⭐️⭐️⭐️

去掉 Nginx 关于 OS 和 Nginx 版本的信息,可以简单得再 Nginx 上设置一个:server_tokens off;,但这样还会存在Nginx服务器类型信息(虽然没有透露版本了)

img

想要完全去除Nginx返回的Server HTTP头,就需要这个模块headers-more-nginx-module大显身手github.com/openresty/h…

more_clear_headers 'Server';

nginx_upstream_check_module ⭐️⭐️⭐️⭐️⭐️

主动健康检查,nignx定时主动地去检查后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中, nginx_upstream_check_module,虽然Nginx自带的健康检查模块ngx_http_upstream_module也可以做到基本的健康检查,功能简单,是被动检查,只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发,而且自带模块无法做到预警。server 172.16.0.23:80 max_fails=1 fail_timeout=10s;

upstream cluster1 {
        # simple round-robin
        server 192.168.0.1:80;
        server 192.168.0.2:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "HEAD / HTTP/1.0\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    upstream cluster2 {
        # simple round-robin
        server 192.168.0.3:80;
        server 192.168.0.4:80;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_keepalive_requests 100;
        check_http_send "HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }

nginx-upsync-module ⭐️⭐️⭐️⭐️⭐️

动态配置Nginx的upstrea节点,调整节点后不用重启nginx,需要结合etct、consul实现动态上下线nginx-upsync-module

upstream test {
        upsync 127.0.0.1:8500/v1/kv/upstreams/test/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;
        include /usr/local/nginx/conf/servers/servers_test.conf;
         #这个配置无用了,但删除后启动会报错,如果consul里没有配置则会调用此地址,故此设置应该设置为一个默认的可用的地址,一旦从consul拉取到数据这个配置就无用了
        server 127.0.0.1:11111 down;
    }

ngx_http_dyups_module ⭐️⭐️⭐️⭐️⭐️

它提供API动态修改upstream的配置,而不用重载Nginxngx_http_dyups_module

    server {
        listen 8081;
        location / {
            dyups_interface;
        }
    }

支持的接口说明表:

请求方法HTTP接口用途
GET/detail获取所有upsteam的清单明细
GET/list获取所有upsteam的name
GET/upstream/name获取指定的upstream内的后端服务器的IP地址和端口
POST/upstream/name覆盖指定的upstream的内容,包括IP地址、端口号、权重等信息
DELETE/upstream/name删除指定的upstream

ngx_http_limit_conn_module ⭐️⭐️⭐️⭐️⭐️

ngx_http_limit_conn_module 对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制;该模块可以根据定义的键来限制每个键值的连接数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。

官方文档

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }

ngx_http_limit_req_module ⭐️⭐️⭐️⭐️⭐️

限制每个已定义 key 的请求处理速率,特别是来自单个 IP 地址请求的处理速率。限制机制采用了 leaky bucket (漏桶算法)方法完成官方文档

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    ...

    server {

        ...

        location /search/ {
            limit_req zone=one burst=5;
        }

nginx-module-vts⭐️⭐️⭐️⭐️⭐️

获取 nginx 自身的一些数据,包括流量、连接数、超时、虚拟主机等、nginx-module-vts

 	vhost_traffic_status_zone;
    vhost_traffic_status_filter_by_host on; #开启此功能,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个上。
    ...
    server {
   #启用或禁用该模块,在不想统计流量的server区域禁用vhost_traffic_status off;
        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }

nginx-vts-exporte ⭐️⭐️⭐️⭐️⭐️

采集nginx-module-vts模块暴露的数据供prometheus使用nginx-vts-exporter

./nginx-vts-exporter -nginx.scrape_uri=http://localhost/status/format/json

set-misc-nginx-module ⭐️⭐️

set-misc-nginx-module模块提供标准的HttpRewriteModule指令的扩展,更多的功能,如URI转义与非转义、JSON引述、Hexadecimal/MD5/SHA1/Base32/Base64编码与解码、随机数等

	set_if_empty $dst <src>; #如果参数$dst是空的,则赋值为<src>
	set_quote_sql_str $dst <src> #当两个参数时,该指令将引用第二个参数<src>值。并将结果分配给第一个参数,变量$dst,该指令通常用于防止SQL注入。
	set_unescape_uri $dst <src>  #当两个参数时,该指令将非转义第二个参数<src>的值作为URI一部分,并分配第一个参数变量$dst分配结果
	set_secure_random_alphanum
	set_md5 $dst <src> #当两个参数时,该指令将对第二个参数<src>进行MD5编码,并将结果赋值给第一个变量参数$dst
	set_random $res <from> #生成从<from>与<to>之间的非负数的随机数。含<from> <to>。
	set_secure_random_alphanum $res <length> #生成长度为<length>的随机字符串。字符有[a-zA-Z0-9]。
	set_secure_random_lcalpha $res <length>  #生成长度为<length>的随机字符串。字符有[a-z]
	

ngx_devel_kit ⭐️⭐️

NDK 是一个 Nginx 模块,旨在以一种可用作其他 Nginx 模块基础的方式扩展优秀的 Nginx 网络服务器的核心功能。 它具有处理通用任务的函数和宏,这些任务当前没有通用代码作为核心发行版的一部分。NDK 本身添加了一些从用户的角度来看的功能 - 它只是旨在帮助减少 Nginx 模块开发人员需要编写的代码。 ngx_devel_kit是其他 Nginx 模块的依赖项,并且用户在编译自己的模块时也需要编译它

echo-nginx-module ⭐️⭐️⭐️⭐️⭐️

echo-nginx可以在Nginx中用来输出一些信息,是在测试排错过程中一个比较好的工具

#可用的命令行有如下:
echo 
echo_duplicate 
echo_flush
echo_sleep
echo_blocking_sleep
echo_reset_timer
echo_read_request_body
echo_location_async
echo_location
echo_subrequest_async
echo_subrequest
echo_foreach_split
echo_end
echo_request_body
echo_exec
echo_status

更多精彩关注公众号“51运维com” 个人博客