Я профилировал свой сайт и понял, что 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
Есть ли что-нибудь вокруг этого?
Это должно работать
С помощью 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>
}
}
}