Як запобігти тайм-ауту шлюзу за допомогою 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;
    }

Редагувати: те, що у мене не працює :)


7
Ви можете встановити значення тайм-ауту на "2м" замість "120".
Cenk Alti

1
Дуже погано, що дані не передаються в потоки ... тобто сервер починає відповідати через 60 секунд і більше, здається неприйнятним.
Адам Гент

Відповіді:


245

Час очікування проксі-сервера добре для проксі, а не для FastCGI ...

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

Редагувати : Враховуючи те, що знайдено у вікі nginx, директива send_timeout відповідає за встановлення загального тайм-ауту відповіді (який був трохи оманливим). Для FastCGI є те, fastcgi_read_timeoutщо впливає на час очікування реакції на швидкий процес .

HTH.


8
Для всіх, хто використовує uwsgi та має цю помилку, uwsgi_read_timeout 600; виправили мою проблему.
Homer6

2
Моє запитання тут було б (як аматор сервера), де мені це змінити? Файл httpd.conf?
jeffkee

2
Якщо це допоможе, мій був у / etc / nginx / у системі DV Media Media Temple.
jeffkee

Абдо дає хороший спосіб налагодження. Якщо у вас все ще виникають проблеми, можливо, вам доведеться збільшити максимальний розмір повідомлення клієнта в nginx.conf (client_max_body_size ** M;)
Сем Грондал

2
Збільшення тайм-ауту imho не є правильним рішенням.
JazzCat

24

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

помістити великий тайм-аут в unicorn.rb

timeout 500

якщо ви все ще стикаєтеся з проблемами, спробуйте вказати fail_timeout = 0 у своєму потоці в nginx і побачити, чи це вирішує вашу проблему. Це для налагодження та може бути небезпечним у виробничих умовах.

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

3
Я думаю, що люди це спростували, оскільки мова йде про Джанго, проте ваша відповідь зафіксувала мою проблему таймауту на шлюзі з Rails + Єдиноріг :)
ZiggyTheHamster

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 секунд?
утдев

Не трапляється нічого поганого, але ваша служба чекає більше часу. Ви можете змінити його значення, як вам захочеться.
Хосе Карлос Рамос Carmenates

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;
       }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.