Час очікування проксі-сервера Apache2


23

У мене Apache2 з PHP + PHP-FPM налаштований відповідно до:

http://wiki.apache.org/httpd/PHP-FPM

Я пишу сценарій, який триватиме довгий час для виконання на внутрішньому Vhost, але продовжуйте виходити з часу, все працює бездоганно, якщо сценарій виконується за 30 секунд.

Мій журнал apache повідомляє мені:

[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:

Коли я намагаюся запустити сценарій, мені надається приблизно 503 Service Unavailableчерез 30 секунд часу виконання. Логічно це означатиме, що у мене встановлена ​​директива про час та встановлення на 30 секунд, але вони є в конфігурації мого Vhost:

Timeout 600
<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
    ProxyTimeout 600
</IfModule>

(для мене працює порт PHP-fpm)

Я також спробував Помістивши Timeoutі ProxyTimeoutв httpd.confбез різниці.

Здається, є інша настройка тайм-ауту, яка є специфічною mod_proxy_fcgi, але я не можу її знайти. Я встановив Apache2 httpd з офіційного tarball, жоден із модів, мабуть, не мав жодних файлів конфігурації.

Якщо хтось може вказати мені в правильному напрямку, це буде дуже вдячно.

Відповіді:


32

Я остаточно виправив цю проблему після тестування декількох параметрів конфігурації. Я тестував рішення двічі, видаляючи всі попередні зміни. Для її виправлення знадобився лише один параметр.

Для останніх версій httpd та mod_proxy_fcgi ви можете просто додати timeout=до кінця ProxyPassMatchрядка, наприклад:

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

Для старих версій це було трохи складніше, наприклад:

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

Мені потрібно було додати директиву проксі, щоб встановити час очікування на 30 хвилин. У деяких додатках, як правило, під час роботи з базою даних, є підпрограми, на виконання яких може знадобитися більше 10 хвилин. Я тимчасово встановив час очікування на 30 хвилин, щоб переконатися, що вони закінчуються. Особливо корисно при використанні майстра встановлення, який займає занадто багато часу (на мою скромну думку).

До речі, додаткова інформація, яка допомогла мені вирішити цю проблему, була знайдена в наступній URL-адресі .


1
Схоже, що ця помилка в останніх версіях Apache, AH00526: ProxyPass / <Proxy> та ProxyPassMatch / <ProxyMatch> не можна використовувати взагалі з тим же ім'ям робочого
Stewart Adam

4
Я вирішив вищезазначене, додавши параметр 'timeout = 120' в кінці рядка ProxyPassMatch.
Стюарт Адам

@Palantir радий це почути! Надіслано як відповідь .
Стюарт Адам

Ще дві речі, які мені знадобляться: По-перше, ви повинні встановити "Timeout" і "ProxyTimeout" у вашому глобальному конфігураційному файлі apache, щоб вони були довші за інші таймаути FPM. По-друге, мій пул FPM прослуховував сокет Unix, і я використовую SetHandler так: [SetHandler "проксі: unix: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // localhost: 8000 "]. Але <Proxy> відповідає у fcgi: // localhost частині лінії SetHandler (частина ПІСЛЯ | | ... яка навіть фактично не використовується!), А НЕ unix: / var / run / part. щоб налаштувати тайм-аути для використання вище: <Proxy fcgi: // localhost: 8000>, а не <Proxy unix: / var / run / ...
Професор Фолкен

9

Я хотів би зазначити, що хоча ця відповідь чудово підходить для старих версій, вона підпадає під останні версії Apache 2.4 з кодом помилки AH00526. ProxyPassта ProxyPassMatchабо <Proxy>і <ProxyMatch>не можуть використовуватися разом у межах одного імені робочого. Це функціонувало нормально, тому не знайте, чи це було змінено дизайном, чи це помилка.

У будь-якому випадку ви можете це виправити, використовуючи лише ProxyPassMatch з параметром 'timeout = 120' (або будь-яким потрібним значенням), наприклад:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

6

У мене Apache 2.4.6, але патч для його виправлення надається в Apache> = 2.4.8. Ключовим тут є негайно почати вихід, щоб Apache (mod_proxy_fcgi) вважав, що з'єднання активне.

Наприклад, я використовую PHP, а запит БД для мого дзвінка AJAX займає> 30 секунд. Оскільки я знаю, що загальна відповідь буде "Тип вмісту: додаток / json", я негайно надсилаю це заголовок.

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

2

Чи не повинно бути це:

<IfModule mod_proxy.c>

Переконайтесь, що для параметра php.ini max_execution_time також встановлено 600. (Перевірте phpinfo () на сторінці в реальному часі, щоб переконатися, що ви бачите фактичне використане значення)

Як сказала Дженні, встановіть настройку php-fpm

request_terminate_timeout 610s

(зверніть увагу на s в кінці)

Налаштовувати саме з mod_proxy_fcgi не так багато, як ви бачите на сторінці apache. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

Увімкніть також реєстрацію налагодження php-fpm, щоб ви могли бачити, де це час там. http://php-fpm.org/wiki/Configuration_File (також увімкніть catch_workers_output)

І увімкніть журнал рівня налагодження для модулів mod_proxy та mod_proxy_fcgi, оскільки ви використовуєте apache 2.4. Дуже приємна функція, увімкніть лише потрібні вам модулі: http://httpd.apache.org/docs/current/mod/core.html#loglevel

Якщо це не допомагає, опублікуйте свій конфігураційний файл php-fpm.

В крайньому випадку, можливо, якийсь демон вбиває тривалий процес?


2

Я зазначив, що ви використовуєте PHP-FPM. Я теж його використовую, але з Apache 2.4.6.

Якщо припустити, що проблема існує деякий час, здається, що значення тайм-ауту для кодуmod_proxy_fcgi є жорстким . Я записав те, що знайшов тут


1

Оскільки ви виправили налаштування тайм-ауту в apache, це не повинно бути проблемою. Друге місце, на яке слід звернутись, було б будь-яке мережеве обладнання, але оскільки ви маєте доступ до власного сервера, це також малоймовірно. Таким чином, решта, яку потрібно подивитися, - це сервер, що займає бекенд.

Я конфігураційний файл для php-pfm, шукайте

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

Це слід встановити так само, як і трохи нижче, налаштування тайм-ауту в апачі.


1
Я встановив request_terminate_timeout400, все ще не змінюється :( У мене є відчуття, що мені потрібно щось встановити mod_proxy_fcgi, але, схоже, це не було з файлами конфігурації.
wyqydsyq

0

На додаток до тайм-ауту встановіть enablereuse = вимкнено. Я виявив, що колись було прохання про те, щоб тривалі сценарії справно працювали, а інші були вбиті рано.


0

Ця посада змінила всю угоду для мене.

Схоже, що mod_reqtimeout Apache не використовує значення за замовчуванням.

Додайте наступні рядки до файлу httpd.conf :

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.