V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
waringid
V2EX  ›  NGINX

Nginx 能不能实现按域名限制网速?

  •  
  •   waringid · 47 天前 · 1806 次点击
    这是一个创建于 47 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Nginx 对外映射 80 和 443 端口,Nginx 对应的宽带线路是 100M (上下行对等),通过反向代理配置域名( hostname )的方式映射到后端服务器。类似于:
    a.example.com -> 192.168.1.10:3000
    b.example.com -> 192.168.2.10:8900

    想要实现的效果:
    a.example.com 限制访问带宽为 2M (外网访问,不限制访问 192.168.1.10 )
    b.example.com 限制访问带宽为 3M (外网访问)
    其它的域名不限制

    尝试过的方案:
    1 、防火墙或网关限制(只能基于 IP 限制,而且不灵活)
    2 、Nginx 自带的访问频率和访问速率控制 (有一定效果,不够灵活并且如果是已建立的连接,限制带宽操作不生效,需要断开本次连接,重新再连时才生效)

    各位大佬有没有更灵活的实现方案推荐?
    11 条回复    2024-11-06 15:55:53 +08:00
    i4t
        1
    i4t  
       47 天前
    上思科,3 层交换,可以设置限速,Nginx 基本上做不到精确限速
    waringid
        2
    waringid  
    OP
       47 天前
    @i4t 我是需要对访问 a.example.com 这样的客户端源 IP 限速(有 2 个限定条件:1 是访问域名 a.example.com 的这个客户端 IP ,2 是判断如果是访问这个域名就对这个客户的外网 IP 进行限速),3 层交换更多是对内网 IP
    nieqibest
        3
    nieqibest  
       47 天前
    去 nginx 上提个 issue 试试
    fenglangjuxu
        4
    fenglangjuxu  
       47 天前
    上 openresty 看有啥插件可用的
    waringid
        5
    waringid  
    OP
       47 天前
    @fenglangjuxu 用过 openresty 的一些插件,也没有匹配到合适的。特别是针对云盘下载已建立连接的这种无法按要求限制网速。我在想是不是 Nginx 是 7 层应用,而针对网络限速的是四层的原因,所以无法做到有效的限制。

    按这个理解有没有可以通过 Nginx 和 防火墙(或网关)联动的配置案例?
    fenglangjuxu
        6
    fenglangjuxu  
       47 天前
    能改配置 一个连接的时间超时变短么 强制重开链接 这样就算超了 时间很短
    waringid
        7
    waringid  
    OP
       47 天前
    @fenglangjuxu 基于 Nginx 这类的 HTTP 协议不行,在原理上它无法对已经建立连接的链路重置(如果是服务端主动发起重置请求则需要更改后端应用,这个就不具备普适性)
    wheat0r
        8
    wheat0r  
       46 天前
    前置国产下一代防火墙之类的设备,一般都有很复杂的限速功能
    waringid
        9
    waringid  
    OP
       46 天前
    @wheat0r 主要是想了解有没有实现这样需求的成功案例。和防火墙联动肯定是可以实现这样的特性,但是怎么样配置对接?有哪些坑和难点?需要有清晰的认知
    cnoder
        10
    cnoder  
       46 天前
    waringid
        11
    waringid  
    OP
       46 天前
    @cnoder 这个是最早尝试的方法,达不到要求有 2 个原因:
    1 、默认无法基于被访问的域名判断(当然可以通过 openresty lua 代码读取 $host 和 X-Real-IP ,但如果配置的二级域名较多或者是经常变化就很难动态调整)
    2 、最大的问题是已经建立的连接无法实现网速的限制(频率控制也不够平缓,有延迟并且突发的峰值对整体网络有影响)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2685 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:27 · PVG 16:27 · LAX 00:27 · JFK 03:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.