nginx 开启--with-http_gunzip_module 模块是否有坑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
firebroo
V2EX    NGINX

nginx 开启--with-http_gunzip_module 模块是否有坑

  •  
  •   firebroo
    firebroo 2018-11-21 16:04:02 +08:00 5197 次点击
    这是一个创建于 2515 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前需求需要优化前后端 nginx 之间传输的流量,压缩数据节约小水管带宽,所以准备开启全流量压缩,大概流程就是前端 nginx 会 set 一个 header 到后端 nginx,proxy_set_header Accept-Encoding "gzip"; 让后端 nginx 开启压缩,前端 nginx 再使用这个模块解压数据返回给不支持解压 gzip 的客户端

    网上搜了下,这个模块没有看到被大量投入使用的场景,所以上到线上环境,有点担心 gunzip 解压带给前端 nginx 的内存和 CPU 压力会有多高,内心慌的一匹。。有把这个模块线上实战的老铁吗?

    30 条回复    2018-11-23 15:18:19 +08:00
    0ZXYDDu796nVCFxq
        1
    0ZXYDDu796nVCFxq  
       2018-11-21 16:13:37 +08:00 via Android
    大规模用过,没问题
    AnnanDou
        2
    AnnanDou  
       2018-11-21 16:17:52 +08:00
    应该就是吃内存和 cpu 的问题吧
    lhx2008
        3
    lhx2008  
       2018-11-21 16:20:27 +08:00 via Android
    gzip 很常见吧,阿里云腾讯云的 cdn 的 nginx 都有开 gzip,而且大部分网站也有开 gzip,比起后端的资源占用,nginx 这里真的不值得一提
    另外,现在开始流行 br 算法了
    firebroo
        4
    firebroo  
    OP
       2018-11-21 16:29:24 +08:00
    @gstqc 好的,老哥
    isCyan
        5
    isCyan  
       2018-11-21 16:31:43 +08:00
    @lhx2008 他说的是服务端解压 gzip 不是压缩
    firebroo
        6
    firebroo  
    OP
       2018-11-21 16:31:57 +08:00
    @lhx2008 br 我知道,但是没找到 nginx 的解压模块。
    jimrok
        7
    jimrok  
       2018-11-21 17:37:42 +08:00
    还可以研究一下 http_gzip_static_module 模块
    liuxu
        8
    liuxu  
       2018-11-21 17:48:35 +08:00
    baidu:
    Content-Encoding: gzip

    google:
    content-encoding: br
    305835227fadf
        9
    305835227fadf  
       2018-11-21 17:54:04 +08:00
    前后端 nginx 之间的链路真的这么紧张吗?这种做法有点骚啊。前端 nginx 还要判断用户端是否支持 gzip,鸡肋。
    0ZXYDDu796nVCFxq
        10
    0ZXYDDu796nVCFxq  
       2018-11-21 17:57:06 +08:00 via Android
    @305835227fadf 回源强制 gzip
    发现客户端不支持 gzip 并且源站返回 gzip 内容就解压

    本来前端 nginx 就必须判断客户端是否支持 gzip
    305835227fadf
        11
    305835227fadf  
       2018-11-21 18:00:48 +08:00
    CDN 回源强制 gzip?这个苛刻点了吧,一般场景没这样干的吧?如果用户浏览器访问不支持压缩,那 CDN 的缓存就没意义了,或者 CDN 有 2 种缓存,压缩和非压缩的。
    0ZXYDDu796nVCFxq
        12
    0ZXYDDu796nVCFxq  
       2018-11-21 18:02:40 +08:00 via Android
    @305835227fadf 可以只缓存一份压缩的,客户端不支持压缩再解压
    305835227fadf
        13
    305835227fadf  
       2018-11-21 18:07:49 +08:00
    这就需要在 CDN 的缓存服务器写逻辑配置了吧?还有贵司也太精打细算了吧。。我是觉得是否有必要这么做,虽然技术上可行。
    firebroo
        14
    firebroo  
    OP
       2018-11-21 18:55:12 +08:00
    @liuxu 我上面说了 nginx 没找到 br 算法解压模块,大佬你给写 nginx 的 br 解压模块吗
    firebroo
        15
    firebroo  
    OP
       2018-11-21 18:58:00 +08:00
    @305835227fadf 做法是有点极端,但是我的现实环境就是这样。。CND 不清楚,但是我测试 nginx 本身就实现了你说的逻辑,发现客户端不支持解压才会去解压。
    liuxu
        16
    liuxu  
       2018-11-21 19:57:23 +08:00
    @firebroo

    google 出的,你为什么不找 google

    https://github.com/google/ngx_brotli
    mytry
        17
    mytry  
       2018-11-21 19:58:53 +08:00
    用 nginx lua 写个监控 CPU 和内存的程序吧,根据当前负载动态调整要不要压缩,以及压缩比都可以调整~
    firebroo
        18
    firebroo  
    OP
       2018-11-21 21:13:56 +08:00 via Android
    @liuxu 我擦,你是一直看东西只看一半吗。。
    ryd994
        19
    ryd994  
       2018-11-22 01:08:33 +08:00 via Android
    解压的开销一般小于压缩的开销
    Dragonish3600
        20
    Dragonish3600  
       2018-11-22 03:23:16 +08:00 via iPhone
    没必要用这个模块啊,你的需求其实在前端开始 nginx cache 就可以减少很多前后端的压力了。还有这楼里很多人分不清 gzip 和 gunzip 模块的区别……
    yuikns
        21
    yuikns  
       2018-11-22 07:35:25 +08:00 via iPhone
    看了好一会儿明白了…
    楼主问题很简单,upstream 只提供了 gzip 的结果,但是 client 可能不接受。作为中间层就需要特殊处理下。
    其实看过算法就知道,只要没啥漏洞,compress 固然可能要考虑性能,decompress 无论如何都是一把梭直接就能过… 除非有重大 bug
    firebroo
        22
    firebroo  
    OP
       2018-11-22 10:13:59 +08:00
    @ladypxy cache 已经开了,对于动态数据准备再开启全压缩,我的场景就是这么特殊。。目标是前后端 nginx 的流量传输越小越好,小水管带宽还限流。。
    firebroo
        23
    firebroo  
    OP
       2018-11-22 10:16:36 +08:00
    @yuikns 回头看看源码,准备一把梭了!
    julyclyde
        24
    julyclyde  
       2018-11-22 10:19:24 +08:00
    不需要判断客户端是否支持 gzip
    不支持的就让他滚蛋好了
    全程压缩发给客户端!!
    firebroo
        25
    firebroo  
    OP
       2018-11-22 10:20:41 +08:00
    @julyclyde 兄弟不要鸡冻。。
    julyclyde
        26
    julyclyde  
       2018-11-22 10:24:36 +08:00
    @firebroo 想当年我上司为了兼容部分根本没消费能力的垃圾客户,不让用 gzip
    那是电商网站啊!!
    cloudyplain
        27
    cloudyplain  
       2018-11-22 10:25:28 +08:00
    @mytry ngx lua 怎么实现监控 CPU、内存?有例子码?
    mytry
        28
    mytry  
       2018-11-22 10:34:21 +08:00   1
    @cloudyplain nginx worker 里开个定时器,每隔一秒检测下就可以了。简单点直接用 lua 读 /proc/ 里的文件获取 CPU 等。觉得 lua 麻烦可以用其他程序写,通过文件或者管道和 lua 交互。最终通过 lua 设置 nginx 变量,决定压缩开不开以及比例。
    firebroo
        29
    firebroo  
    OP
       2018-11-22 10:42:32 +08:00
    @julyclyde 流下了没有钱的眼泪
    mytry
        30
    mytry  
       2018-11-23 15:18:19 +08:00
    @cloudyplain 之前试过按网络流量监控的。之前买了个按流量计费的 ecs,所以在性能和流量之间找一个平衡点。当时还用 lua 做了个接口: https://alert.fun/traff_stat
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     910 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:03 PVG 04:03 LAX 13:03 JFK 16:03
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86