Nginx

根據使用者代理更改 nginx gzip 壓縮級別

  • December 28, 2018

我已經分析了我的站點,並意識到將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

有沒有辦法解決?

這應該工作

使用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>
       }
   }
}

引用自:https://serverfault.com/questions/946795