精通Nginx(25)-Nginx Plus增强功能之缓存清除、复杂媒体流支持、安全防护

Nginx Plus在缓存清除、复杂媒体流支持、安全防护也做了增强。

缓存清除

NGINX Plus 可手工指定清除缓存项。配置示例如下:

复制代码
http {
    # 请求是PURGE缓存清除方法
    map $request_method $purge_method {
        PURGE 1;
        default 0;
    }
    server {
        listen      80;
        server_name www.example.com;

        location / {
            proxy_pass  https://localhost:8002;
            proxy_cache mycache;

            # 清除缓存
            proxy_cache_purge $purge_method;
        }
    }
}

通过命令行发送如下命令:

复制代码
 curl -XPURGE http://127.0.0.1/main.js

上述命令是清除main.js的缓存。允许使用 * 来清除与常见 URI 前缀相匹配的缓存项(注意需要proxy_cache_path 指令中配置purger=on,通配符才起作用)。

复杂媒体流

HLS支持

HLS(HTTP Live Streaming)是处理 MP4 文件中封装的 H.264/AAC 编码内容。利用 NGINX Plus 的 HLS 模块进行实时分段、分包和多路复用,及控制分段缓冲等等。示例如下:

复制代码
location /hls/ {
    # 启用hls模式
    hls;

    # 视频文件位置
    alias /var/www/video;

    #  将媒体分割成 4 秒长度的片段
    hls_fragment 4s;
    # HLS 缓冲区的数量设置为 10,大小为 10MB
    hls_buffers 10 10m; 
    # 初始MP4 缓冲区大小设置为 1MB
    hls_mp4_buffer_size 1m; 
    # MP4 缓冲区最大为 5MB
    hls_mp4_max_buffer_size 5m;
}

指令:

hls: 开启hls模式支持

hls_fragment time; 默认5s; 按时间长度对媒体进行分段。

hls_buffers number size;默认hls_buffers 8 2m;指定了缓冲区的数量和大小。允许客户端在缓冲数据达到一定数量(由 hls_mp4_buffer_size 指定)后开始播放媒体文件。

hls_mp4_buffer_size size;默认512k;初始缓冲区大小

hls_mp4_max_buffer_size size;默认10M; 缓冲区的上限

HLS功能由ngx_http_hls_module模块提供。

HDF支持

HDS( Adobe HTTP Dynamic Streaming)是Adobe 自适应流媒体的模式,把FLV 文件分段且与元数据分开。Nginx plus中用f4f模式支持HDS,示例如下:

复制代码
location /video/ {
    alias /var/www/transformed_video; 

    # 非常简单,就下面两个指令
    # 开启f4f
    f4f;
    # 读取元数据.f4x文件的缓存大小
    f4f_buffer_size 512k;
}

HDS功能由ngx_http_f4f_module模块提供。

安全防护

DDoS 防护

DDoS(Distributed Denial of Service)分布式拒绝服务,当多台机器一起攻击一个目标,通过大量互联网流量淹没目标或其周围基础设施,从而破坏目标服务器、服务或网络为正常流量提供服务。使用 NGINX Plus可构建集群感知、速率限制和自动拦截列表。示例如下:

复制代码
# 按请求ip定义限制请求缓存(最多每秒100个请求)  sync是在集群内同步
limit_req_zone $remote_addr zone=per_ip:1M rate=100r/s sync;

# 429响应表示访问过于频繁,但服务器没有屏蔽你的IP,只是限制你访问速度
limit_req_status 429;

## 指令keyval_zone 和 keyval 在Nginx plus中支持
# 设置keyval缓存区,每对keyval有效期为600s
keyval_zone zone=sinbin:1M timeout=600 sync; 
# 用请求ip在缓存区查找,如果找到,则$in_sinbin为$remote_addr;否则,$in_sinbin为0
keyval $remote_addr $in_sinbin zone=sinbin; 

# Cluster-aware "sin bin" with 
# 10-minute TTL
# Populate $in_sinbin with 
# matched client IP addresses
server {
    listen 80;
    location / {
        if ($in_sinbin) {
            # 限速
            set $limit_rate 50;
        }

        # 限制请求
        limit_req zone=per_ip; 
        # 当响应429(超过规定请求数100r/s)做处理
        error_page 429 = @send_to_sinbin; 

        proxy_pass http://my_backend;
    }

    # 429的响应处理,把IP放入keyval缓存区 
    location @send_to_sinbin {
        # 把IP放入keyval缓存区
        rewrite ^ /api/3/http/keyvals/sinbin break; 
        proxy_method POST;
        proxy_set_body '{"$remote_addr":"1"}';
        proxy_pass http://127.0.0.1:80;
    }
    location /api/ {
        # 内部处理,keyval缓存区
        api write=on;
    }
}

示例表示:当客户端超过速率限制(每秒发送超过 100 个请求)时,通过调用 NGINX Plus API 将其 IP 地址添加到" sinbin"缓存中。集群内的 sinbin 是同步的。无论哪个 NGINX Plus 节点接收请求时,只要匹配来自sinbin中客户端的其他请求都会面临非常低的带宽限制。限制带宽比直接拒绝请求更可取,因为它不会向客户端清楚地表明 DDoS 防护已生效。 10 分钟后,客户端ip将自动从sinbin 中移除。

注意:因为用ip作为限制,需保证获得的是客户端真实IP,如何获取真实IP设置见精通Nginx(19)-更多实用功能:身份认证、流媒体支持、大文件传输、流量镜像、分片、获取客户端真实ip等

NGINX App Protect WAF防护

NGINX App Protect WAF(Web Application Firewall)保护应用和 API 免受七层攻击,为web应用程序和API提供了强大的安全性,实现了安全自动化、平台化。其示意图如下:

NGINX App Protect WAF除抵御和减缓常见漏洞、高级威胁和零星攻击,还具有如下特点:

  • 在针对基本的 OWASP 十大安全漏洞的安全防护的基础上,额外拥有 7500 多个高级特征库、机器人特征库和威胁情报所提供的安全防护
  • 保护组织的 HTTP/S 和 HTTP/2 应用以及 gRPC 双向流媒体等协议
  • 借助内置的数据保护(Data Guard)功能屏蔽个人身份信息(PII),包括信用卡和社会安全号码(SSN)
  • 在 PCI DSS 要求的基础上,避免更多违反法规的不合规行为
  • 借助高置信度的特征库以阻塞模式进行部署,从而实现极低的误报率

配置示意如下:

复制代码
...

# 动态加入ngx_http_app_protect_module模块
load_module modules/ngx_http_app_protect_module.so;

http {
    # 开启WAF
    app_protect_enable on;
    # 防护策略见文件
    app_protect_policy_file "/etc/nginx/AppProtectTransparentPolicy.json"; 
    # 开启防护日志
    app_protect_security_log_enable on;
    # 防护日志:第一个参数定义日志如何设置,第二个参数定义日志存储位置
    app_protect_security_log "/etc/nginx/log-default.json" syslog:server=127.0.0.1:515;

    ...
}

防护策略文件AppProtectTransparentPolicy.json内容如下:

复制代码
{
    "policy": {
        "name": "transparent_policy",
        "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
        "applicationLanguage": "utf-8",
        # 策略模式:blocking-阻拦 transparent-只记录,不阻拦
        "enforcementMode": "blocking",
        # 阻拦规则定义
        "blocking-settings": {
            "violations": [
            {
                "name": "VIOL_JSON_FORMAT",
                "alarm": true,
                "block": true
            },
            {
                "name": "VIOL_PARAMETER_VALUE_METACHAR",
                # 报警
                "alarm": true,
                # 不拦截
                "block": false
            }
            ]
        }
    }
}

大多数安全规则都是在策略文件中配置完成,根据官方文档,可灵活定义阻截规则。

日志定义文件log-default.json,默认内容如下:

复制代码
{
    "filter":{
        "request_type":"all"
    },
    "content":{
        "format":"default",
        "max_request_size":"any",
        "max_message_size":"5k"
    } 
}

NGINX App Protect WAF功能由ngx_http_app_protect_module模块提供。

这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!

相关推荐
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220706 天前
如何搭建本地yum源(上)
运维
ping某7 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠9 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质9 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务