You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nginx反向代理与Node.js间分工处理Gzip/Brotli压缩

解决方案

直接给你修改后的Nginx配置,关键调整了gzip压缩规则和请求头传递,完美兼容Node的预压缩静态文件和动态内容压缩:

upstream my_nodejs_upstream {
    server 127.0.0.1:3001;
    keepalive 64;
}

server {
    listen 443 ssl;
    
    server_name www.my-website.com;
    ssl_certificate_key /etc/ssl/main.key;
    ssl_certificate     /etc/ssl/main.crt;

    # 核心gzip配置
    gzip on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_min_length 1024;
    # 指定要压缩的动态内容类型,可根据业务需求调整
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/xml+rss
        application/json;
    # 只对后端未缓存/私有类型的响应压缩,跳过Node已预压缩的静态文件
    gzip_proxied no-cache no-store private expired auth;
    gzip_disable "msie6";

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        # 关键:把客户端的Accept-Encoding头传给Node,让它能返回对应压缩格式的静态文件
        proxy_set_header Accept-Encoding $http_accept_encoding;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        proxy_pass http://my_nodejs_upstream/;
        proxy_redirect off;
        proxy_read_timeout 240s;
    }
}

关键调整说明

  • 传递Accept-Encoding头:Node的expressStaticGzip依赖客户端的Accept-Encoding判断返回Brotli还是Gzip静态文件,之前Nginx未传递这个头,可能导致Node无法正确返回预压缩文件,或Nginx后续乱处理。
  • 精准控制gzip压缩范围:gzip_proxied的参数设置确保Nginx只对动态内容(比如API返回的JSON、未预压缩的动态页面)做压缩,而Node已经预压缩的静态文件(通常带有public类型的Cache-Control头)会被跳过,不会二次压缩。
  • 明确压缩类型:gzip_types指定了需要压缩的动态内容格式,避免Nginx对不需要的内容做无用压缩。

另外确认下你的expressStaticGzip配置没问题,它默认会给预压缩文件加上正确的Content-Encoding头,Nginx识别到这个头后就不会再动手处理了。

内容的提问来源于stack exchange,提问作者john d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:36