V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2018-11-21 16:04:02 +08:00 · 4551 次点击
    这是一个创建于 1954 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前需求需要优化前后端 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
    gstqc
        1
    gstqc  
       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,鸡肋。
    gstqc
        10
    gstqc  
       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 种缓存,压缩和非压缩的。
    gstqc
        12
    gstqc  
       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
    解压的开销一般小于压缩的开销
    ladypxy
        20
    ladypxy  
       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   ·   我们的愿景   ·   实用小工具   ·   4306 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:13 · PVG 18:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.