› NGINX
› NGINX Trac
› 3rd Party Modules
› Security Advisories
› CHANGES
› OpenResty
› ngx_lua
› Tengine
在线学习资源
› NGINX 开发从入门到精通
NGINX Modules
› ngx_echo
firebroo
V2EX  ›  NGINX

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

  •  
  •   firebroo ·
    firebroo · Nov 21, 2018 · 6165 views
    This topic created in 2904 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    google 出的,你为什么不找 google

    https://github.com/google/ngx_brotli
    mytry
    mytry
    Nov 21, 2018
    17
    用 nginx lua 写个监控 CPU 和内存的程序吧,根据当前负载动态调整要不要压缩,以及压缩比都可以调整~
    firebroo
    firebroo
    OP
    Nov 21, 2018 via Android
    18
    @liuxu 我擦,你是一直看东西只看一半吗。。
    ryd994
    ryd994
    Nov 22, 2018 via Android
    19
    解压的开销一般小于压缩的开销
    Dragonish3600
    Dragonish3600
    Nov 22, 2018 via iPhone
    20
    没必要用这个模块啊,你的需求其实在前端开始 nginx cache 就可以减少很多前后端的压力了。还有这楼里很多人分不清 gzip 和 gunzip 模块的区别……
    yuikns
    yuikns
    Nov 22, 2018 via iPhone
    21
    看了好一会儿明白了…
    楼主问题很简单,upstream 只提供了 gzip 的结果,但是 client 可能不接受。作为中间层就需要特殊处理下。
    其实看过算法就知道,只要没啥漏洞,compress 固然可能要考虑性能,decompress 无论如何都是一把梭直接就能过… 除非有重大 bug
    firebroo
    firebroo
    OP
    Nov 22, 2018
    22
    @ladypxy cache 已经开了,对于动态数据准备再开启全压缩,我的场景就是这么特殊。。目标是前后端 nginx 的流量传输越小越好,小水管带宽还限流。。
    firebroo
    firebroo
    OP
    Nov 22, 2018
    23
    @yuikns 回头看看源码,准备一把梭了!
    julyclyde
    julyclyde
    Nov 22, 2018
    24
    不需要判断客户端是否支持 gzip
    不支持的就让他滚蛋好了
    全程压缩发给客户端!!
    firebroo
    firebroo
    OP
    Nov 22, 2018
    25
    @julyclyde 兄弟不要鸡冻。。
    julyclyde
    julyclyde
    Nov 22, 2018
    26
    @firebroo 想当年我上司为了兼容部分根本没消费能力的垃圾客户,不让用 gzip
    那是电商网站啊!!
    cloudyplain
    cloudyplain
    Nov 22, 2018
    27
    @mytry ngx lua 怎么实现监控 CPU、内存?有例子码?
    mytry
    mytry
    Nov 22, 2018❤️1
    28
    @cloudyplain nginx worker 里开个定时器,每隔一秒检测下就可以了。简单点直接用 lua 读 /proc/ 里的文件获取 CPU 等。觉得 lua 麻烦可以用其他程序写,通过文件或者管道和 lua 交互。最终通过 lua 设置 nginx 变量,决定压缩开不开以及比例。
    firebroo
    firebroo
    OP
    Nov 22, 2018
    29
    @julyclyde 流下了没有钱的眼泪
    mytry
    mytry
    Nov 23, 2018
    30
    @cloudyplain 之前试过按网络流量监控的。之前买了个按流量计费的 ecs,所以在性能和流量之间找一个平衡点。当时还用 lua 做了个接口: https://alert.fun/traff_stat
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1329 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 19:19 · PVG 03:19 · LAX 11:19 · JFK 14:19
    ♥ Do have faith in what you're doing.