zero size buf in output при proxy cache
iprok
nginx-forum на forum.nginx.org
Вт Фев 16 19:00:33 UTC 2016
Здравствуйте!
На видеостриминговой системе используем два уровня проксей (эджи и
ориджины). Эджи проксируют клиентов на ориджины, ориджины проксируют эджи на
сервера-источники видео. Видео отдается в формате HLS: это плейлисты
(текстовые файлы) и чанки видео (видео-файлы в формате ts).
В локейшенах, проксирующих чанки, на ориджинах и эджах регулярно, хоть и
относительно не часто (пара десятков за сутки), проскакивают ошибки "zero
size buf in output". Мне кажется причиной является одна из директив:
proxy_cache_use_stale updating;
proxy_cache_lock on;
так как до их появления таких ошибок не было.
nginx в основном 1.8.1, но проявиляется так же и на 1.9.11, логи ниже делал
на последней. Используем пакеты для debian8 из репозитория на nginx.org.
Если смотреть access.log, то чанк в помент проявления этой ошибки отдается
частично, но с кодом 200 (размер в логе меньше реального размера), при
следующем запросе отдается нормально, и ошибка не проявляется.
Лог кратко (debug.log внизу, здесь и далее в логах вырезана приватная
информация, так как ошибка вопроизводится только в продакшене):
2016/02/14 11:09:20 [alert] 30161#30161: *1388932 zero size buf in output
t:0 r:0 f:0 0000000002387520 0000000002387520-0000000002389356
0000000000000000 0-0 while sending to client, client: HIDDENIPV4, server:
e6.mysite.com, request: "GET /place1/stream/cam13_low-5743015560.ts
HTTP/1.1", upstream:
"https://[HIDDENIPV6]:443/place1/video/cam13_low-5743015560.ts", host:
"e6.mysite.com", referrer: "https://mysite.com/"
2016/02/14 11:09:23 [alert] 30160#30160: *1389653 zero size buf in output
t:0 r:0 f:0 00000000022BBC50 00000000022BBC50-00000000022BF185
0000000000000000 0-0 while sending to client, client: HIDDENIPV4, server:
e6.mysite.com, request: "GET /place1/stream/cam13_hi-5297110020.ts
HTTP/1.1", upstream:
"https://HIDDENIPV4:443/place1/video/cam13_hi-5297110020.ts", host:
"e6.mysite.com", referrer: "https://mysite.com/"
Конфиги:
nginx.conf:
user www-data;
worker_processes 8;
worker_rlimit_nofile 65536;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
log_format csv_times
$remote_addr|$remote_user|$time_local|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent|$request_time;
gzip on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
----
conf.d/upstream.conf:
upstream o-mysite-place2 {
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 weight=3;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 weight=3;
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 weight=1;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 weight=1;
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 backup;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 backup;
keepalive 500;
}
upstream o-mysite-place1 {
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 weight=3;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 weight=3;
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 weight=1;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 weight=1;
server HIDDENIPV4:443 fail_timeout=60 max_fails=3 backup;
server [HIDDENIPV6]:443 fail_timeout=60 max_fails=3 backup;
keepalive 500;
}
----
sites-enabled/e6.mysite.com.conf:
proxy_cache_path /var/cache/nginx/mysite_edge_video keys_zone=m_e_v:3m
inactive=3m max_size=1g;
proxy_cache_path /var/cache/nginx/mysite_www_static keys_zone=m_w_s:3m
max_size=1g;
fastcgi_cache_path /var/cache/nginx/mysite_fastcgi keys_zone=m_s:3m
max_size=100m;
log_format req_times $time_local|$request|$request_time;
limit_req_zone $limit_head zone=limit_head:1m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=dynamic:10m;
#https
server {
listen HIDDENIPV4:443 ssl;
listen [HIDDENIPV6]:443 ssl;
server_name e6.mysite.com mysite.com;
access_log /var/log/nginx/mysite.edge.access.log csv_times;
error_log /var/log/nginx/mysite.edge.error.log;
ssl_certificate /etc/ssl/mysite.com.pem;
ssl_certificate_key /etc/ssl/private/mysite.com.key;
include ssl_params.conf;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/startssl.class2.pem;
resolver HIDDENIPV4;
add_header X-Content-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header Strict-Transport-Security "max-age=31536000;";
proxy_next_upstream error timeout invalid_header http_500 http_502
http_504;
proxy_http_version 1.1;
proxy_ssl_server_name on;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/ssl/startssl.class2.pem;
proxy_ssl_verify_depth 2;
location /place1/stream {
#чанки
proxy_ssl_name origin.mysite.com;
include proxy_headers.inc;
proxy_set_header host origin.mysite.com;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_cache m_e_v;
proxy_cache_valid any 1m;
proxy_cache_use_stale updating;
proxy_cache_key "$uri$is_args$args";
proxy_cache_lock on;
proxy_pass https://o-mysite-place1/place1/video;
access_log /var/log/nginx/mysite.edge.access.log
csv_times;
access_log /var/log/nginx/mysite.edge.chunk-times.log
req_times;
# error_log /var/log/nginx/debug.log debug;
error_log /var/log/nginx/mysite.edge.error.log;
}
location /place2/stream {
#чанки
proxy_ssl_name origin.mysite.com;
include proxy_headers.inc;
proxy_set_header host origin.mysite.com;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_cache m_e_v;
proxy_cache_valid any 1m;
proxy_cache_use_stale updating;
proxy_cache_key "$uri$is_args$args";
proxy_cache_lock on;
proxy_pass https://o-mysite-place2/place2/video;
access_log /var/log/nginx/mysite.edge.access.log
csv_times;
access_log /var/log/nginx/mysite.edge.chunk-times.log
req_times;
# error_log /var/log/nginx/debug.log debug;
error_log /var/log/nginx/mysite.edge.error.log;
}
}
----
proxy_headers.conf:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
----
Сразу выкладываю debug.log (18 мегабайт в распакованном виде):
https://kinetiksoft.com/thecloud/index.php/s/5ldvsZFiC2NjpXJ
Я обрезал только 10 секунд, за которые произошли две ошибки из краткого лога
в начале сообщения.
Posted at Nginx Forum: https://forum.nginx.org/read.php?21,264561,264561#msg-264561
Подробная информация о списке рассылки nginx-ru