gzip_ratio 未打印在 nginx 日志中

gzip_ratio 未打印在 nginx 日志中

我正在配置nginx access_log输出JSON格式以便与其他工具一起使用。

我想要的数据包括有关压缩的信息。我启用了 gzip,但我得到的唯一信息gzip_ratio-

确认一下,嵌入的变量是$gzip_ratio

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

这是我的定义log_format

log_format  main_json '{"time": "$time_iso8601", '
                  '"remote_addr": "$remote_addr", '
                  '"body_bytes_sent": "$body_bytes_sent", '
                  '"gzip_ratio": "$gzip_ratio", '
                  '"status": "$status", '
                  '"request": "$request_time", '
                  '"request_method": "$request_method", '
                  '"http_referrer": "$http_referer", '
                  '"http_user_agent": "$http_user_agent", '
                  '"http_x_forwarded_for": "$http_x_forwarded_for", '
                  '"request_time": "$request_time", '
                  '"upstream_response_time": "$upstream_response_time"}';

以下是 gzip 设置nginx.conf

gzip  on;
gzip_proxied any;
gzip_types text/plain text/xml text/css application/x-javascript text/javascript application/xml+rss text/json application/json;

这里是输出access_log

{
    "time":"2015-02-03T14:26:26+00:00",
    "remote_addr":"[IP]",
    "body_bytes_sent":"574",
    "gzip_ratio":"-",
    "status":"200",
    "request":"0.064",
    "request_method":"GET",
    "http_referrer":"-",
    "http_user_agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2293.0 Safari/537.36",
    "http_x_forwarded_for":"-",
    "request_time":"0.064",
    "upstream_response_time":"0.064"
}

因此,看起来东西没有被压缩。但是,我已经运行了cURL压缩测试,结果如下:

[~]$ curl https://[URL] --silent --write-out "size_download=%{size_download}\n" --output /dev/null
size_download=3297
[~]$  curl https://[URL] --silent -H "Accept-Encoding: gzip,deflate" --write-out "size_download=%{size_download}\n" --output /dev/null
size_download=859

因此,从实际测量响应的大小来看,它似乎被压缩了。但是,日志仍然缺少gzip_ratiobody_bytes_sent每个请求日志中的 都与 报告的字节数相匹配cURL(压缩响应略有不同)。

{"time": "2015-02-03T14:57:11+00:00", "remote_addr": "[IP]", "body_bytes_sent": "3297", "gzip_ratio": "-", "status": "200", "request": "0.477", "request_method": "GET", "http_referrer": "-", "http_user_agent": "curl/7.37.0", "http_x_forwarded_for": "-", "request_time": "0.477", "upstream_response_time": "0.477"}
{"time": "2015-02-03T14:57:20+00:00", "remote_addr": "[IP]", "body_bytes_sent": "871", "gzip_ratio": "-", "status": "200", "request": "0.676", "request_method": "GET", "http_referrer": "-", "http_user_agent": "curl/7.37.0", "http_x_forwarded_for": "-", "request_time": "0.676", "upstream_response_time": "0.676"}

有人知道我怎样才能获得实际情况gzip_ratio吗?

答案1

要么你使用的 nginx 版本有问题,要么你的测试方法存在缺陷。我刚刚确认,$gzip_ratiolog_formatnginx 1.9.1 中定义运行正常。

我只见过在未执行压缩时才$gzip_ratio相等的情况-。在所有其他情况下,它都为数值。

答案2

最近也遇到同样的情况。

$gzip_ratio仅当 nginx 自己进行压缩时才可用。如果实际上是上游服务器在反向代理/负载平衡器场景中进行压缩,则它将不可用;这将符合您的所有症状(使用 cURL 测试时,响应实际上是压缩的)。

记录该场景的一种方法是在日志中包含$sent_http_content_encoding和/或;它将包含“gzip”。$upstream_http_content_encoding

还值得检查gzip_min_lengthgzip_types配置选项以确保响应确实符合 gzip 压缩的条件。

相关内容