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