首页 > 系统相关 >nginx预压缩静态文件

nginx预压缩静态文件

时间:2023-11-17 19:06:03浏览次数:42  
标签:文件 浏览器 静态 压缩 nginx gzip http

http请求压缩可减少宽带,提升终端加载速度。像http服务自带的压缩是实时的,虽然可通过缓存减少重复请求压缩次数,实际还是不能有效减少重复压缩相同请求,特别是较大的静态文件。


http压缩协议

HTTP 协议中的数据压缩 - HTTP | MDN (mozilla.org)

浏览器会在每个请求中携带 Accept-Encoding 请求头信息,用于标识支持接收的响应数据体编码格式,比如:

nginx预压缩静态文件_nginx

http服务器就会选择其中一种编码格式进行返回响应数据体,通过响应头信息 content-encoding 标识,比如:

nginx预压缩静态文件_html_02

浏览器获取到支持的响应编码格式后进行解码处理,然后再响应给请求处理(所有浏览器请求)。


nginx 压缩配置

模块ngx_http_gzip_module (nginx.org)

nginx常用压缩配置是通过gzip模块完成的,配置相对简单,常用配置如下:

# 压缩开关 on 或 off
gzip            on;

# 最少压缩响应体长度,过小的文件压缩意义不大
gzip_min_length 1000;

#
gzip_proxied    expired no-cache no-store private auth;

# 指定压缩响应类型,默认:text/html,如果要全部压缩可使用 *
gzip_types      text/plain application/xml;

# 压缩级别: 1~9 级别越大压缩率越高同时CPU开销越大
gzip_comp_level 9;

# 匹配User-Agent头信息包含内容的请求不执行压缩的处理
gzip_disable    "MSIE [1-6]\.";

# 开启响应头信息 Vary: Accept-Encoding 代理时使用
gzip_vary 			on;

注意:不同的静态文件压缩率不一样,一般文本类文件压缩率会高些(比如:html、css、js等文件),像图片、音频、视频类压缩率低些。对于压缩率低的文件不建议配置压缩。


预压缩静态文件

nginx压缩是实时的,并且不会缓存前面的压缩结果(缓存由终端浏览器处理),特别是压缩一个大文件会占用较多的CPU,不利于服务器性能利用。

提前将要请求的静态文件进行压缩,然后通过配置请nginx响应出去即可拦截nginx压缩又能实现http压缩功能会大大减少nginx压缩开销。

nginx配置

    # 静态文件进行预压缩
    location ~ .*\.(html|js|css)$ {
    	# 低端浏览器不走预压缩
        if ( $http_user_agent ~* 'MSIE [4-6]' ) {
            root /www/html;   # 无压缩目录
        }
        # 高端浏览器走预压缩
        if ( $http_user_agent !~* 'MSIE [4-6]' ) {
            gzip off; # 强制关闭压缩,如果外层没有开过可去掉
            root /www/gzip;   # 预压缩目录
            add_header Vary Accept-Encoding;
            add_header Content-Encoding gzip;  # 压缩头信息
        }
    	# 没有预压缩文件就取未压缩文件
        if (!-e $request_filename) {
            root /www/html;
        }
    }

预压缩脚本

预压缩脚本代码:保存文件 gzip.php

<?php
if (!extension_loaded('zlib')) {
    die("请安装 zlib 扩展");
}
if ($argc < 2) {
    die("
批量压缩目录内所有文件,压缩成gzip格式

命令:
    php {$argv[0]} source-dir [target-dir]

参数:
    source-dir          要压缩的目录
    target-dir          压缩到指定目录

说明:
    此脚本用来快速预压缩文件,用于预压缩http请求静态文件
");
}

$dir = $argv[1];
if (!is_dir($dir)) {
    die('目录不存在:' . $dir);
}
$targetDir = $argv[2] ?? './gzip/';
mkdirs($targetDir);
$targetDir = realpath($targetDir) . '/';
$sourceDir = realpath($dir) . '/';
$count = 0;
foreach (forFile($sourceDir) as $file) {
    mkdirs($targetDir . dirname($file));
    $targetFile = $targetDir . $file;
    if (file_exists($targetFile)) {
        unlink($targetFile);
    }
    $gzip = gzopen($targetFile, 'wb9');
    gzwrite($gzip, file_get_contents($sourceDir . $file));
    gzclose($gzip);
    $count++;
}
echo "成功压缩文件:" . $count . PHP_EOL;
function forFile(string $dir, string $prefix = '') {
    foreach (scandir($dir) as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $path = "$dir/$file";
        if (is_file($path)) {
            yield $prefix . $file;
        } else {
            yield from forFile($path, $prefix . $file . '/');
        }
    }
}
function mkdirs(string $path) {
    if (!is_dir($path) && !mkdir($path, 0777, true)) {
        die("目录创建失败:$path");
    }
}

预压缩文件生成

php gzip.php /www/html /www/gzip

重启nginx,打开浏览器验证下预压缩是否成功。

标签:文件,浏览器,静态,压缩,nginx,gzip,http
From: https://blog.51cto.com/php2012web/8451535

相关文章

  • docker 部署nginx
     docker部署Nginx一、先启动一次,把配置文件copy出来 #创建并运行容器,容器命名为nginx dockerrun--namenginx-p80:80-dnginx#创建目录存放mkdir /usr/local/docker-nginx#从容器中copy配置 dockercpnginx:/etc/nginx/nginx.conf/usr/local/docker-nginx......
  • openwrt l2tp支持设置本地静态ip地址
    设备使用4G网络,设备间需要通讯,又是短连接,必须要是静态ip,所以选择使用l2tp。然后LNS端通过/etc/ppp/chap-secrets为每个帐号绑定一个ip,每个设备使用一个帐号,LNS这端设备默认的隧道保活时间为60s。这时设备端(LAC)正常拨号时获取到的ip为LNS端绑定的,但是如果插拔一下网线,或者断电重......
  • java zip 压缩密码
    在Java开发中,Zip文件是一种常见的文件压缩格式。有时候我们需要给Zip文件添加密码保护,以确保文件的安全性。本文将指导你如何使用Java代码来实现Zip文件的添加密码功能。流程概述下面是实现“JavaZip添加密码”的整个流程:步骤描述步骤1创建一个Zip文件步骤2向Zi......
  • nginx keepalive 设置避免 服务器端大量time_wait 增加tcp 连接重用
    #Formoreinformationonconfiguration,see:#*OfficialEnglishDocumentation:http://nginx.org/en/docs/#*OfficialRussianDocumentation:http://nginx.org/ru/docs/usernginx;worker_processesauto;error_log/var/log/nginx/error.log;pid/run/......
  • jar/war包内容的压缩与解压
    #此命令jia包和war包都适用#将jar包里的内容解压出来jar-xvfxxxxx.jarBOOT-INF/classes/a.javaBOOT-INF/classes/a.java#将jar包里解压出来的内容压缩回去jar-uvfxxxxx.jarBOOT-INF/classes/a.javaBOOT-INF/classes/a.java演示:我们现在有一个名为xxxxx.jar的jar包,首先查看......
  • VMware+CentOS7 网络及静态IP配置
     设置“虚拟机网络编辑”打开VMware: 在工具栏的“编辑”选项里有一个“虚拟网络编辑器”,打开:   点击“更改设置”  首先选中VMnet8,下面会显示VMnet信息。我们选择NAT模式;然后将“使用本地DHCP服务奖IP地址分配给虚拟机”的勾选取消掉,因为我们要使用静态IP;最后......
  • Spring Boot 访问静态资源css/js
    一、前言我们用SpringBoot搭建Web应用时(如搭建一个博客),经常需要在Html中访问一些静态资源,比如:css样式;js脚本;favicon.ico图标等;而在SpringBoot中如果没有做任何配置,是无法直接访问静态资源的,通常会报404错误二、SpringBoot访问静态资源的默认目录SpringBoot访问......
  • php nginx 出现504 Gateway Timeout
    先试试:ini_set('memory_limit','4096M');set_time_limit(0);情况一:由于nginx默认的fastcgi进程响应缓冲区太小造成这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示“504GatewayTime-out”错误。情况一解决办法:默认的fastcgi进程响......
  • 41.静态方法
    静态方法除了类方法,Python的类中还有一种静态方法。静态方法在定义时,需要使用 @staticmethod 装饰器进行装饰,与类方法不同的是,静态方法没有默认参数。静态方法和普通的函数本质上是一样的,只是定义在了类中。一般情况下,静态方法同类方法一样,也是在封装工具类时使用,区别在于,......
  • 类的实例方法和静态方法的使用场合区别
    面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程思想,它使用类(Class)和对象(Object)的概念来组织和管理代码。在OOP中,类是一种模板,用来定义对象的属性(成员变量)和行为(成员方法)。对象则是类的实例,它们包含了类中定义的属性和方法,并且可以根据需要进行创建和操作。在OOP中,类......