目前需求需要优化前后端 nginx 之间传输的流量,压缩数据节约小水管带宽,所以准备开启全流量压缩,大概流程就是前端 nginx 会 set 一个 header 到后端 nginx,proxy_set_header Accept-Encoding "gzip"; 让后端 nginx 开启压缩,前端 nginx 再使用这个模块解压数据返回给不支持解压 gzip 的客户端
网上搜了下,这个模块没有看到被大量投入使用的场景,所以上到线上环境,有点担心 gunzip 解压带给前端 nginx 的内存和 CPU 压力会有多高,内心慌的一匹。。有把这个模块线上实战的老铁吗?
1
0ZXYDDu796nVCFxq 2018-11-21 16:13:37 +08:00 via Android
大规模用过,没问题
|
2
AnnanDou 2018-11-21 16:17:52 +08:00
应该就是吃内存和 cpu 的问题吧
|
3
lhx2008 2018-11-21 16:20:27 +08:00 via Android
gzip 很常见吧,阿里云腾讯云的 cdn 的 nginx 都有开 gzip,而且大部分网站也有开 gzip,比起后端的资源占用,nginx 这里真的不值得一提
另外,现在开始流行 br 算法了 |
7
jimrok 2018-11-21 17:37:42 +08:00
还可以研究一下 http_gzip_static_module 模块
|
8
liuxu 2018-11-21 17:48:35 +08:00
baidu:
Content-Encoding: gzip google: content-encoding: br |
9
305835227fadf 2018-11-21 17:54:04 +08:00
前后端 nginx 之间的链路真的这么紧张吗?这种做法有点骚啊。前端 nginx 还要判断用户端是否支持 gzip,鸡肋。
|
10
0ZXYDDu796nVCFxq 2018-11-21 17:57:06 +08:00 via Android
|
11
305835227fadf 2018-11-21 18:00:48 +08:00
CDN 回源强制 gzip?这个苛刻点了吧,一般场景没这样干的吧?如果用户浏览器访问不支持压缩,那 CDN 的缓存就没意义了,或者 CDN 有 2 种缓存,压缩和非压缩的。
|
12
0ZXYDDu796nVCFxq 2018-11-21 18:02:40 +08:00 via Android
@305835227fadf 可以只缓存一份压缩的,客户端不支持压缩再解压
|
13
305835227fadf 2018-11-21 18:07:49 +08:00
这就需要在 CDN 的缓存服务器写逻辑配置了吧?还有贵司也太精打细算了吧。。我是觉得是否有必要这么做,虽然技术上可行。
|
15
firebroo OP @305835227fadf 做法是有点极端,但是我的现实环境就是这样。。CND 不清楚,但是我测试 nginx 本身就实现了你说的逻辑,发现客户端不支持解压才会去解压。
|
16
liuxu 2018-11-21 19:57:23 +08:00
|
17
mytry 2018-11-21 19:58:53 +08:00
用 nginx lua 写个监控 CPU 和内存的程序吧,根据当前负载动态调整要不要压缩,以及压缩比都可以调整~
|
19
ryd994 2018-11-22 01:08:33 +08:00 via Android
解压的开销一般小于压缩的开销
|
20
ladypxy 2018-11-22 03:23:16 +08:00 via iPhone
没必要用这个模块啊,你的需求其实在前端开始 nginx cache 就可以减少很多前后端的压力了。还有这楼里很多人分不清 gzip 和 gunzip 模块的区别……
|
21
yuikns 2018-11-22 07:35:25 +08:00 via iPhone
看了好一会儿明白了…
楼主问题很简单,upstream 只提供了 gzip 的结果,但是 client 可能不接受。作为中间层就需要特殊处理下。 其实看过算法就知道,只要没啥漏洞,compress 固然可能要考虑性能,decompress 无论如何都是一把梭直接就能过… 除非有重大 bug |
22
firebroo OP @ladypxy cache 已经开了,对于动态数据准备再开启全压缩,我的场景就是这么特殊。。目标是前后端 nginx 的流量传输越小越好,小水管带宽还限流。。
|
24
julyclyde 2018-11-22 10:19:24 +08:00
不需要判断客户端是否支持 gzip
不支持的就让他滚蛋好了 全程压缩发给客户端!! |
27
cloudyplain 2018-11-22 10:25:28 +08:00
@mytry ngx lua 怎么实现监控 CPU、内存?有例子码?
|
28
mytry 2018-11-22 10:34:21 +08:00 1
@cloudyplain nginx worker 里开个定时器,每隔一秒检测下就可以了。简单点直接用 lua 读 /proc/ 里的文件获取 CPU 等。觉得 lua 麻烦可以用其他程序写,通过文件或者管道和 lua 交互。最终通过 lua 设置 nginx 变量,决定压缩开不开以及比例。
|
30
mytry 2018-11-23 15:18:19 +08:00
@cloudyplain 之前试过按网络流量监控的。之前买了个按流量计费的 ecs,所以在性能和流量之间找一个平衡点。当时还用 lua 做了个接口: https://alert.fun/traff_stat
|