node.js – 无法使用gzip为nginx中的分块传输编码关闭从Node后端提供的静态资产

我们有一个Node / express Web应用程序,除了正常内容之外,还通过express.static()提供静态资产.前面有一个nginx服务器,当前配置为gzip这些静态资产请求,如果用户代理为它.

但是,虽然nginx正在按预期执行gzip,但是它会从原点删除Content-Length标头,并设置Transfer-Encoding:chunked.这打破了我们CDN的缓存.

以下是典型静态资产请求(本例中为JS文件),节点后端和nginx的响应:

请求:

curl -s -D - 'http://my_node_app/res/my_js.js' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Connection: keep-alive' --compressed -o /dev/null

节点的响应标头:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Date: Wed,07 Jan 2015 02:24:55 GMT
Cache-Control: public,max-age=0
Last-Modified: Wed,07 Jan 2015 01:12:05 GMT
Content-Type: application/javascript
Content-Length: 37386   // <--- The expected header
Connection: keep-alive

响应来自nginx的标题:

HTTP/1.1 200 OK
Server: nginx
Date: Wed,07 Jan 2015 02:24:55 GMT
Content-Type: application/javascript
Transfer-Encoding: chunked  // <--- The problematic header
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: public,07 Jan 2015 01:12:05 GMT
Content-Encoding: gzip

我们当前的静态资产位置的nginx配置如下所示:

nginx配置:

# cache file paths that start with /res/
location /res/ {
    limit_except GET HEAD { }

    # http://nginx.com/resources/admin-guide/caching/
    # http://nginx.org/en/docs/http/ngx_http_proxy_module.html

    proxy_buffers 8 128k;
    #proxy_buffer_size 256k;
    #proxy_busy_buffers_size 256k;

    # The cache depends on proxy buffers,and will not work if proxy_buffering is set to off.
    proxy_buffering     on;
    proxy_http_version  1.1;
    proxy_set_header  Connection "";
    proxy_connect_timeout  2s;
    proxy_read_timeout  5s;
    proxy_pass          http://node_backend;

    chunked_transfer_encoding off;

    proxy_cache         my_app;
    proxy_cache_valid   15m;
    proxy_cache_key     $uri$is_args$args;
}

从上面的配置中可以看出,即使我们根据nginx文档显式设置chunked_transfer_encoding为这些路径,启用了proxy_buffering,并且具有足够大的proxy_buffers大小,响应仍然被分块.

我们在这里失踪了什么?

– 编辑1:版本信息 –

$nginx -v
nginx version: nginx/1.6.1

$node -v
v0.10.30

– 编辑2:nginx gzip config–

# http://nginx.org/en/docs/http/ngx_http_gzip_module.html
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 1;
gzip_min_length 1000;
#gzip_http_version 1.0;
gzip_types application/javascript text/css
gzip_proxied any;
gzip_vary on;
你是对的,让我详细说明.

标头是第一个需要发送的东西.但是,由于您正在使用流式压缩,因此最终大小不确定.您只知道未压缩资产的大小,并且发送内容长度太大也不正确.

因此,有两种选择:

>转移编码分块
>在发送任何数据之前完全压缩资产,因此压缩的大小是已知的

目前,你正在经历第一种情况,听起来你真的需要第二种情况.得到第二个案例的最简单方法是打开gzip_static,因为@kodeninja在评论中说.

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...