我分析了我的网站,发现桌面端的gzip_comp_level
上限1
会降低总吞吐量。但在移动设备上,瓶颈是网络速度而不是服务器 TTFB,因此设置gzip_comp_level
为4
或更高是合理的。
我想gzip_comp_level
根据用户代理进行更改,但在 NGINX 中似乎不可能。
这是我的 nginx.conf
http {
server {
...
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_buffers 16 8k;
gzip_min_length 1024;
gzip_types image/png image/svg+xml text/plain text/css image/jpeg application/font-woff application/json application/x-javascript application/javascript text/xml application/xml application/rss+xml text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype;
...
location / {
include /etc/nginx/mime.types;
expires max;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
add_header Pragma public;
add_header Cache-Control "public";
add_header Vary "Accept-Encoding";
if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)') {
set $ua_type "mobile";
}
if ($ua_type = "mobile") {
gzip_comp_level 4;
}
if ($ua_type != "mobile") {
gzip_comp_level 1;
}
location ~* \.(js|jpg|jpeg|png|css|svg|ttf|woff|woff2)$ {
access_log off;
log_not_found off;
}
}
}
}
NGINX 提供nginx: [emerg] "gzip_comp_level" directive is not allowed here in /etc/nginx/nginx.conf:44
有没有办法解决?
答案1
这应该有效
使用我们根据代理map
给出一个值(根据需要在下面的配置列表中添加更多代理)。$ismobile
然后我们检查该值并返回错误代码。
然后我们让 nginx 处理错误并重定向到包含正确gzip_comp_level
和其余配置的位置。
下面我只包含了相关部分。
http {
map $http_user_agent $ismobile {
"default" 0;
"~*iphone" 1;
.....
}
server {
error_page 412 = @mobile;
error_page 413 = @notmobile;
recursive_error_pages on;
if ($ismobile = "1"){
return 412;
}
if ($ismobile = "0"){
return 413;
}
location @mobile {
gzip_comp_level 4;
<add rest of config with an include or line by line>
}
location @notmobile {
gzip_comp_level 1;
<add rest of config with an include or line by line>
}
}
}