2015-05-09 3 views
2

У меня есть приложение Rails, которое подается с nginx/unicorn, у которого есть один конкретный запрос, который может занять 2-3 минуты, потому что он генерирует несколько PDF-файлов и добавляет их в zip-файл и используя send_data, чтобы позволить клиенту загружать сразу несколько отчетов.Nginx upstream рассчитан на длительный запрос единорога

Первоначально мои рабочие единорога были убиты после 30-х годов, поэтому я увеличил свой тайм-аут в файле unicorn.rb. Теперь запрос получает 504 ошибку после 60 секунд вместо 30 секунд. Поэтому мои рабочие-единороги убиваются, но nginx отключается.

Вот сообщение об ошибке в моем Nginx error_log:

upstream timed out (110: Connection timed out) while reading response header from upstream 

Я попытался увеличение всех настроек времени ожидания Nginx, которые имеют смысл, но после того, как service nginx restart запрос еще timeing вне.

Вот мой nginx.conf и сайты с поддержкой/по умолчанию

/***nginx.conf***/ 
http { 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    keepalive_timeout 300s; 
    client_header_timeout 300s; 
    client_body_timeout 300s; 
    send_timeout 300s; 
    types_hash_max_size 2048; 
} 



/***sites-enabled/default***/ 
upstream app { 
    unix:[PATH]/unicorn.sock fail_timeout=120s; 
} 

server { 

    listen 80; 
    root [PATH]; 

    server_name www.[URL].com [URL].com; 
    proxy_read_timeout 600s; 

    try_files $uri/index.html $uri @app; 

    access_log /var/log/nginx/APP_access.log combined; 
    error_log /var/log/nginx/APP_error.log; 

    location @app { 
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://app; 
    proxy_read_timeout 600s; 
    proxy_connect_timeout 600s; 
    proxy_send_timeout 600s; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 75; 
} 

Может кто-нибудь сказать мне, почему Nginx еще таймаут после 60 секунд?

+0

вы уверены, что вам больше не нужно увеличивать тайм-аут единорога - это сообщение об ошибке указывает на проблему с тайм-аутом «вверх по течению» – house9

+1

действительно вы должны использовать фоновое задание для обработки вещей, которые занимают больше 30 секунд - вам может потребоваться задержка работы: https://github.com/collectiveidea/delayed_job – house9

+0

@ house9, да, я забыл упомянуть об этом. Фоновые задания нужны, но это не в MVP. Когда тайм-аут единорога был проблемой, сообщение об ошибке было в журнале ошибок единорога, и он сказал что-то вроде «тайм-аута (31 с> 30 секунд)», теперь ошибка выше, и она находится в журналах ngoni. Также я установил тайм-аут единорога более 60 секунд. –

ответ

1

Возможно, я устранил проблему, перезапустив сервер. После изменения любого из моих nginx-файлов я бы запустил service nginx reload или service nginx restart, но я предполагаю, что на самом деле это не было сбросом настроек таймаута, которые я расширил.

Теперь проблема в том, что я не 100%, из которых многие параметры таймаута, которые я продюсировал, были теми, которые мне нужны. Я мог бы работать в обратном порядке, чтобы понять это, но я предполагаю, что это была одна из настроек прокси-сервера.

Правильное решение по-прежнему (как указано в статье @ house9) фактически создает фоновые задания, но это исправление для моего вопроса, как было заявлено.