Назад | Перейти на главную страницу

nginx закрывает соединение на некоторых картинках

Есть проблема с nginx. Он закрывает соединение до того, как клиент завершит загрузку. Это выглядит как:

 $ wget -O /dev/null http://www.site.com/images/theme/front/clean.jpg
--2012-07-11 21:37:03--  http://www.site.com/images/theme/front/clean.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 90707 (89K) [image/jpeg]
Saving to: `/dev/null'

26% [===============>                    ] 24,291      --.-K/s   in 8.7s    

2012-07-11 21:37:12 (2.74 KB/s) - Connection closed at byte 24291. Retrying.

--2012-07-11 21:37:13--  (try: 2)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 66416 (65K) remaining [image/jpeg]
Saving to: `/dev/null'

53% [+++++++++++++++============>        ] 48,555      --.-K/s   in 8.7s    

2012-07-11 21:37:23 (2.74 KB/s) - Connection closed at byte 48555. Retrying.

--2012-07-11 21:37:25--  (try: 3)  http://www.site.com/images/theme/front/clean.jpg
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 90707 (89K), 42152 (41K) remaining [image/jpeg]
Saving to: `/dev/null'

100%[+++++++++++++++++++++++++++========>] 90,707      --.-K/s   in 0.1s    

2012-07-11 21:37:25 (311 KB/s) - `/dev/null' saved [90707/90707]

в то же время с изображениями меньшего размера все в порядке:

 $ wget -O /dev/null http://www.site.com/images/theme/front/grease.jpg
--2012-07-11 21:41:28--  http://www.site.com/images/theme/front/grease.jpg
Resolving www.site.com (www.site.com)... 123.234.123.234
Connecting to www.site.com (www.site.com)|123.234.123.234|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21404 (21K) [image/jpeg]
Saving to: `/dev/null'

100%[====================================>] 21,404      --.-K/s   in 0.07s   

2012-07-11 21:41:29 (316 KB/s) - `/dev/null' saved [21404/21404]

Это причина, по которой это изображение не может быть нарисовано полностью в браузере. Я вижу только его голову.

Nginx настроен как внешний интерфейс, а apache как серверный. Прямая ссылка на apache работает хорошо, поэтому в nginx есть проблема. Я прав?

Конфигурация nginx:

user satellite;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    access_log  /var/log/nginx/access.log;

    sendfile        on;
    keepalive_timeout  0;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    client_max_body_size 100m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    server {
            listen 123.234.123.234:80;
            server_name site.com www.site.com;
            location ~* ^/(admin/|dump/|webmail/|myadmin/|webim/) {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
            location / {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_redirect http://site.com:8080/ /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_cache ino;
                    proxy_cache_valid 12h;
                    proxy_hide_header "Set-Cookie";
                    proxy_ignore_headers "Cache-Control" "Expires";
            }
            location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
                    access_log /home/satellite/logs/site.com.nginx.access.log;
                    error_page 404 = @fallback;
                    if ( $host ~* ^((.*).site.com)$ ) {
                            set $proot /home/satellite/www/$1;
                            break;
                    }
                    if ( $host = "www.site.com" ) {
                            break;
                    }
                    if ( $host = "site.com" ) {
                            break;
                    }

                    root /home/satellite/www/site.com;
            }
            location @fallback {
                    proxy_pass http://123.234.123.234:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP $remote_addr;
            }
    }

где я должен копать, чтобы исправить эту проблему?

Главное, что я забыл, это проверить /var/log/nginx/error.log.

2012/07/12 08:46:44 [crit] 24074#0: *3 open() 
"/var/lib/nginx/proxy/1/00/0000000001" failed (13: Permission denied) 
while reading upstream, client: 109.173.96.30, server: site.com, request: 
"GET /images/theme/front/clean.jpg HTTP/1.1", upstream: 
"http://123.234.123.234:8080/images/theme/front/clean.jpg", 
host: "www.site.com", referrer: "http://www.google.com"

Итак, я исправил /var/lib/nginx/proxy/* разрешения каталогов (sudo chown -R www-data:www-data /var/lib/nginx/proxy/*) и теперь все отлично работает. Спасибо всем за помощь.

Возможная причина закрытия соединения - медленное соединение и короткое keepalive_timeout. В значение по умолчанию для keepalive_timeout 75 с. Если оно слишком короткое и соединение медленное, значит, оно может быть закрыто слишком рано.

http {
    ..
    keepalive_timeout 75;
}

Одна из причин, по которой загрузка изображений может быть медленной, - это ваше приложение. Если вы используете приложение Ruby-on-Rails с Asset Pipeline в сочетании с Nginx загрузка изображения может быть медленной из-за того, что вы используете неправильные URL-адреса изображений (без отпечатков пальцев, созданных конвейером ресурсов). Помощники Rails asset_path и image_tag генерируют нужные файлы форм URL с отпечатком пальца, которые можно быстро загрузить.

Еще одна очень важная вещь, которую необходимо проверить: убедитесь, что у вас осталось место на диске!

Для меня это было примерно так:

[user@server]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G   29G     0 100% /

Для меня nginx не смог записать на диск, что в конечном итоге вызвало ту же проблему! Надеюсь, это кому-то поможет!

Ваша скорость загрузки невероятно низкая. (2,74 КБ / с!). Получаете ли вы тот же результат при запуске wget на том же компьютере, где находится Nginx? Возможно, Nginx разумно реагирует на запрос по очень медленному каналу.

В противном случае я рекомендую изучить различные директивы времени в документы Nginx. Найдите на странице каждое упоминание «тайм-аута» и посмотрите, подходит ли оно. Например, вы можете видеть, что тайм-аут составляет примерно 10 секунд, поэтому любой тайм-аут, равный примерно 10 секундам, должен подвергаться дополнительной проверке.

Например, lingering_timeout директива по умолчанию 10 секунд, так что вы можете это проверить.

Вы также должны выяснить, почему соединение с вашим клиентом такое медленное.

Еще одна идея: попробуйте альтернативного клиента, например curl, и вы увидите тот же результат, что и с wget. Если curl работает нормально, вы должны подозревать, что в этом есть что-то странное wget делает запрос.

Проверить lingering_time значение в nginx.conf. По умолчанию будет установлено 30 секунд. Итак, что это будет делать, так это то, что nginx будет ждать максимум 30 секунд, пока клиент отправит данные.

Если вы выполняете загрузку или POST файла, для завершения которой может потребоваться более 30 секунд, то сервер nginx сбросит соединение с клиентом, отправив клиенту пакет RST, если время загрузки превышает 30 секунд.

Чтобы nginx ждал больше времени для прослушивания данных клиента, установите для этого значения более высокое значение.

Подробную информацию о lingering_time см. Здесь lingering_time