2009-02-18 3 views
188

Я запускаю Django, FastCGI и Nginx. Я создаю api рода, где кто-то может отправлять некоторые данные через XML, которые я буду обрабатывать, а затем возвращать некоторые коды состояния для каждого отправленного узла.Как предотвратить тайм-аут шлюза с FastCGI на Nginx

Проблема заключается в том, что Nginx будет выдавать 504 Gateway Time-out, если я займу слишком много времени на обработку XML - я думаю, дольше 60 секунд.

Поэтому я хотел бы настроить Nginx так, чтобы, если любые запросы, соответствующие местоположению/api, не будут выходить на 120 секунд. Какая настройка будет выполнена.

То, что я до сих пор:

# Handles all api calls 
    location ^~ /api/ { 
     proxy_read_timeout 120; 
     proxy_connect_timeout 120; 
     fastcgi_pass 127.0.0.1:8080; 
    } 

Edit: То, что я не работаю :)

+7

Вы можете установить значения тайм-аута в «2m» вместо «120». –

+1

Кажется, плохо, что данные не передаются ... т.е. для сервера, который начинает отвечать на запросы через 60 секунд или более, кажется неприемлемым. –

ответ

235

Proxy таймаут хорошо, для прокси-серверов, а не для FastCGI ...

Директивы, которые влияют на тайм-ауты FastCGI, - client_header_timeout, client_body_timeout и send_timeout.

Edit: Учитывая то, что находится на Nginx вики, то send_timeout directive отвечает за установление общего времени ожидания ответа (который был немного вводит в заблуждение). Для FastCGI есть fastcgi_read_timeout, который влияет на fastcgi process response timeout.

HTH.

+44

Ответ был fastcgi_read_timeout - спасибо! – sheats

+7

Для всех, кто использует uwsgi и имеет эту ошибку, uwsgi_read_timeout 600; исправлена ​​моя проблема. – Homer6

+2

Мой вопрос здесь был бы (как любитель-администратор сервера), куда я могу изменить это? Файл httpd.conf? – jeffkee

21

Для тех, кто использует Nginx с единорогом и рельсами, скорее всего, тайм-аут в файле unicorn.rb

поставил большой перерыв в unicorn.rb

timeout 500 

, если вы по-прежнему сталкиваются с проблемами, попробуйте с fail_timeout = 0 в вашем восходящем потоке в nginx и посмотреть, устраняет ли это проблему. Это предназначено для отладки и может быть опасным в производственной среде.

upstream foo_server { 
     server 127.0.0.1:3000 fail_timeout=0; 
} 
+5

Если вы пытаетесь сделать то, что кажется законным, можете ли вы прокомментировать, почему. Этот ответ мне кажется прекрасным. –

+3

Я думаю, что люди отказались от этого, потому что речь идет о Django, однако ваш ответ исправил мою проблему с тайм-аутом шлюза с Rails + Unicorn :) – ZiggyTheHamster

1

Если вы используете единорог.

Посмотрите на top на вашем сервере. В настоящее время единорог использует 100% процессора. Существует несколько причин этой проблемы.

  • Вы должны проверить свои HTTP-запросы, некоторые из них могут быть очень сложными.

  • Проверьте версию единорога. Может быть, вы недавно обновили его, и что-то было сломано.

0

В http Nginx секции (/etc/nginx/nginx.conf) добавить или изменить:

keepalive_timeout 300s 

В server Nginx раздела (/ и т.д./Nginx/сайты-доступные/ваш -config-файл.ком) добавить эти строки:

client_max_body_size 50M; 
fastcgi_buffers 8 1600k; 
fastcgi_buffer_size 3200k; 
fastcgi_connect_timeout 300s; 
fastcgi_send_timeout 300s; 
fastcgi_read_timeout 300s; 

В php файл в случае 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) модифицируют:

request_terminate_timeout = 300 

Я надеюсь вам помочь.

+0

Может ли что-нибудь «плохо» произойти, если я изменю время до 10000 секунд? – utdev

+0

Не случилось ничего плохого, но ваш сервис ждет больше времени. Вы можете изменить его значение по своему усмотрению. –

Смежные вопросы