nginx开启对gzip的cache节省资源

虚拟机的网络性能大部分不好,使用nginx的时候经常会因为带宽的限制跑不到更高的QPS。这个时候可以开启gzip压缩,使得带宽占有成倍的减少。
但是开启gzip压缩后有个很大的问题是CPU的消耗非常大。对于普通的精态页面可以考虑配置2个server,其中一个代理另外一个,并且开启cache。
简单使用ab压测对比了一下,效果还可以。ab只支持HTTP 1.0,所以在nginx里需要配置一下
gzip_http_version 1.0
并且ab压测的时候使用添加HEADER ‘Accept-Encoding: gzip’。
[text]
ab -c 50 -t 60 -H ‘Accept-Encoding: gzip’ http://xxx.net/index.html
[/text]

配置大修改大致如下:
[text]
http {

proxy_cache_path /home/admin/temp levels=1:2 keys_zone=one:10m inactive=5m max_size=100m;
gzip_http_version 1.0;#这个只是为了方便ab测试,线上的话可以关闭这个,防止有古董浏览器不支持gzip。
gzip on;
……….

server {
listen 8888;
server_name localhost;
charset gbk;
gzip on;
gzip_comp_level 9;
gzip_http_version 1.0;
location / {
root /home/admin/webpages/;
index index.html;
}
}
upstream indexpage {
server 127.0.0.1:8888;
keepalive 10;
}

server {
listen 80;
server_name localhost;
charset gbk;
location =/index.html {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_intercept_errors on;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
proxy_buffer_size 16k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_pass http://indexpage;
proxy_cache_methods GET HEAD;
proxy_cache_min_uses 2;
proxy_cache_valid 302 1m;
proxy_cache_valid 200 2m;
proxy_cache_key "$scheme$host$request_uri$http_accept_encoding";
proxy_cache one;

}

}
[/text]
需要注意缓存的key把$http_accept_encoding加上,这样可以分别对gzip压缩过和没有压缩过的进行缓存,防止引起其他的问题,也有的是通过判断$http_accept_encoding并且对后端传递该header,实际上直接把这个加到cache_key更简单些。
测试一下的结果如下

Document Length: 11155 bytes
Total transferred: 567657498 bytes
HTML transferred: 557757300 bytes
Requests per second: 5123.96 [#/sec] (mean)
Time per request: 9.758 [ms] (mean)
Time per request: 0.195 [ms] (mean, across all concurrent requests)
Transfer rate: 56809.65 [Kbytes/sec] received

普通的不开启gzip的情况

Document Length: 52873 bytes

Concurrency Level: 50
Time taken for tests: 23.403494 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 2654793231 bytes
HTML transferred: 2643841260 bytes
Requests per second: 2136.43 [#/sec] (mean)
Time per request: 23.403 [ms] (mean)
Time per request: 0.468 [ms] (mean, across all concurrent requests)
Transfer rate: 110777.09 [Kbytes/sec] received

普通开启gzip后性能会大幅降低,而且还只是默认的level 1压缩。

Document Path: /index.html
Document Length: 13000 bytes

Concurrency Level: 50
Time taken for tests: 58.518396 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 659900000 bytes
HTML transferred: 650000000 bytes
Requests per second: 854.43 [#/sec] (mean)
Time per request: 58.518 [ms] (mean)
Time per request: 1.170 [ms] (mean, across all concurrent requests)
Transfer rate: 11012.49 [Kbytes/sec] received

测试环境:
单核的虚拟机上跑的,2G内存。。

此条目发表在nginx分类目录。将固定链接加入收藏夹。

发表回复