Назад | Перейти на главную страницу

Изменение уровня сжатия nginx gzip в зависимости от пользовательского агента

Я профилировал свой сайт и понял, что 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>
        }
    }
}