在 nginx 中结合 root 路径与 gzip 压缩,核心做法是在 http 或 server 块中启用 gzip on,并通过 gzip_types 指定需要压缩的 mime 类型。nginx 会先根据 root 指令定位磁盘上的静态文件,若该文件存在且符合压缩条件(如未开启 gzip_static 则实时压缩,或已开启则优先读取预编译文件),则向客户端返回压缩后的内容。

如何配置 gzip 以覆盖常见的文本类静态资源
要使 root 目录下的 HTML、CSS、JS 等文件生效,必须显式添加对应的 MIME 类型到 gzip_types 指令中,因为默认仅压缩 text/html。通常还需要设置 gzip_min_length 以避免压缩过小文件带来的 CPU 浪费,并配合 gzip_vary 确保代理缓存正确。

server {
listen 80;
server_name example.com;
# 定义根目录
root /var/www/html;
index index.html;
# 启用 Gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
location / {
try_files $uri $uri/ =404;
}
}
上述配置中,gzip_types 包含了常见的文本和脚本类型。当请求 /style.css 时,Nginx 会在 /var/www/html 下查找该文件。如果启用了 gzip_static on,它会优先寻找 style.css.gz;如果没有预压缩文件且满足大小要求,它将实时读取原文件进行压缩并发送。客户端需携带 Accept-Encoding: gzip 头才能触发此行为。
使用 gzip_static 模块优化性能的具体差异是什么
引入 ngx_http_gzip_static_module 后,Nginx 的行为从“实时压缩”变为“查找预压缩文件”。这能显著降低 CPU 负载,但要求管理员预先将静态文件压缩为 .gz 后缀的文件并存放在同一目录下。若预压缩文件不存在,Nginx 会回退到正常处理流程(即不压缩或实时压缩,取决于其他配置)。

# 假设在 server 块中添加了以下指令 gzip_static on;
在这种模式下,如果 /var/www/html/main.js 存在,但 /var/www/html/main.js.gz 不存在,且没有配置其他实时压缩回退机制(通常 gzip on 仍有效),Nginx 可能会直接发送未压缩的原文件,或者根据 gzip 指令的状态决定是否实时压缩。最佳实践是同时开启 gzip on 和 gzip_static on,这样既享受预压缩的性能优势,又能在缺少预压缩文件时作为后备方案进行实时压缩。
当 gzip_static 找不到预压缩文件时实际返回什么
当配置了 gzip_static on 但目标路径下没有对应的 .gz 文件时,Nginx 不会报错,而是继续执行后续的请求处理逻辑。如果此时 gzip on 也处于开启状态,且请求头包含 Accept-Encoding: gzip,Nginx 将会实时压缩原始文件并返回。如果 gzip on 被关闭,则直接返回未压缩的原始文件。这一行为确保了服务的可用性,不会因为缺少预压缩文件而导致 404 错误。


















