Я настраиваю 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_ratio
. В body_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
?
Либо вы используете версию nginx с ошибками, либо ваш метод тестирования имел некоторые недостатки. Я только что подтвердил это $gzip_ratio
в log_format
определение отлично работает в nginx 1.9.1.
Я видел $gzip_ratio
только равняться -
когда не выполнялось сжатие. Во всех остальных случаях он имел числовое значение.
Сталкивался с таким же недавно.
$gzip_ratio
доступен только в том случае, если nginx выполняет сжатие самостоятельно. Он НЕ будет доступен, если это действительно вышестоящий сервер, который выполняет сжатие в сценарии обратного прокси / балансировки нагрузки; который будет соответствовать всем вашим симптомам (ответ фактически сжимается при тестировании с помощью cURL).
Способ зарегистрировать этот сценарий - включить $sent_http_content_encoding
и / или $upstream_http_content_encoding
в ваших журналах; он будет содержать «gzip».
Также стоит проверить gzip_min_length
и gzip_types
config, чтобы убедиться, что ответы действительно подходят для сжатия.