Как предотвратить тайм-аут шлюза с FastCGI на Nginx

203

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

Проблема в том, что Nginx выдаст тайм-аут шлюза 504, если я потрачу слишком много времени на обработку 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;
    }

Редактировать: что у меня не работает :)

sheats
источник
7
Вы можете установить значения тайм-аута на «2 м» вместо «120».
Дженк Алти
1
Кажется плохим, что данные не передаются в потоковом режиме ... то есть, чтобы сервер начал отвечать обратно через 60 секунд или более, кажется неприемлемым.
Адам Гент

Ответы:

245

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

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

Редактировать : Учитывая то, что найдено в nginx wiki, директива send_timeout отвечает за установку общего времени ожидания ответа (что немного вводит в заблуждение). Для FastCGI есть то, fastcgi_read_timeoutчто влияет на время ожидания ответа процесса fastcgi .

НТН.

Zgoda
источник
8
Для тех, кто использует uwsgi и имеет эту ошибку, uwsgi_read_timeout 600; исправил мою проблему.
Homer6
2
Мой вопрос здесь будет (как любитель администратора сервера), где я могу изменить это? файл httpd.conf?
Джеффки
2
Если это поможет, мой был в / etc / nginx / в системе DV Media Temple.
Джеффки
Абдо дает хороший способ отладки. Если у вас все еще есть проблемы, вам может потребоваться увеличить максимальный размер клиентского сообщения в nginx.conf (client_max_body_size ** M;)
Сэм Грондаль
2
Увеличение таймаута imho не является правильным решением.
JazzCat
24

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

положить большой тайм-аут в единорога.rb

timeout 500

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

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}
Абдо
источник
3
Я думаю, что люди отвергли это, потому что речь идет о Django, однако ваш ответ
устранил
4

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

keepalive_timeout 300s

В serverразделе nginx (/etc/nginx/sites-available/your-config-file.com) добавьте следующие строки:

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

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

Хосе Карлос Рамос Карменатес
источник
Произойдет ли что-нибудь «плохое», если я изменю время на 10000 секунд?
Утев
Ничего плохого не произойдет, но ваш сервис подождет больше времени. Вы можете изменить это значение, как вы хотите.
Хосе Карлос Рамос Карменатес
1

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

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

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

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

Павел Калашников
источник
0

В настройках прокси сервера так

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

На сервере php установлен так

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
Камиль Домбровски
источник