强制让Nginx压缩包头中未带GZip的请求

NGINXLINUX2017-02-24 17:13

假设你已经把Nginx的GZip压缩配置正常打开了,如果没有的话麻烦先去Google相关资料,以下是针对请求头中未带「Accept-Encoding: gzip」包头时,也让Nginx始终进行GZip压缩并返回的方法。

通常的方法有两种:

  • 使用Nginx的第三方模块「headers-more-nginx-module」,优点是功能齐全、配置简单,缺点是要重新编译,对于Yum/Apt安装之类的Nginx有些麻烦。
  • 启动两个Nginx进程服务,一个前端修改Header作为反向代理转发,一个作为后端固定会收到GZip包头所以会返回压缩,以下的是这种方法的简化版本。

启动两个Nginx进程太不人性化,所以网上常用的方法是配置两个虚拟主机。但是笔者觉得还是多余了一些,所以对此再作了一些修改,先来看看原始配置:

server {
    listen       80;
    server_name  test.jtwo.me;

    root /data/cdnfile;

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, max-age=259200";
    }
}

然后再来看看,经过笔者多次修改,测试后简化的配置:

upstream test.jtwo.me {
    server 127.0.0.1:80;
}
server {
    listen       80;
    server_name  test.jtwo.me;

    root /data/cdnfile;

    location ~* \.(?!(php|jsp|asp|aspx)$) {
        gzip_http_version 1.0;
        proxy_set_header Accept-Encoding gzip;
        if ($http_accept_encoding !~* "gzip") {
            proxy_pass http://test.jtwo.me;
        }
        add_header Access-Control-Allow-Origin *;
        add_header Cache-Control "public, max-age=259200";
    }
}

可以看出来实际上就只是多了几行配置,相比重新编译Nginx,或者启动两个虚拟主机要简单吧?笔者现在解释下修改的指令和参数:

upstream test.jtwo.me
这句就不解释了,太简单网上资料很多,通常可以用于负载均衡等作用。

gzip_http_version 1.0
GZip最低的压缩协议,不能使用默认的1.1,因为Nginx转发用的是1.0协议。

proxy_set_header Accept-Encoding gzip
修改转发请求,加上gzip的包头,只修改转发,并不会影响到正常的请求。

if ($http_accept_encoding !~* "gzip")
如果请求过来的包头中未匹配到gzip关键字,则进入if的逻辑,进行转发。

proxy_pass http://test.jtwo.me
转发到虚拟主机的域名,这个就是server区域的server_name,不要搞错。

参考资料:


原文链接: http://blog.jtwo.me/nginx-compression-without-gzip-header