根据用户代理更改 nginx gzip 压缩级别

根据用户代理更改 nginx gzip 压缩级别

我分析了我的网站,发现桌面端的gzip_comp_level上限1会降低总吞吐量。但在移动设备上,瓶颈是网络速度而不是服务器 TTFB,因此设置gzip_comp_level4或更高是合理的。

我想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>
        }
    }
}

相关内容