Вопрос или проблема
У меня есть сервер обратного прокси Apache, который проксирует запросы на мой внутренний сервер Apache. Я использую версию Apache 2.4 на платформе Linux.
Я столкнулся со страницей тайм-аута и HTTP ERROR 504, когда задний сервер Apache занимает более 60 секунд (страница PHP ждет результаты запроса Mysql на заднем сервере Apache)
По умолчанию тайм-аут Apache установлен на 300 секунд.
Эта проблема возникает только при доступе к веб-сайту через обратный прокси Apache. Все работает хорошо при использовании внутреннего IP.
Я пытался установить следующие параметры для proxypass, но безуспешно.
ProxyPass / http://internal-ip:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On
Я также пытался использовать ProxyPass на несуществующий IP, который также показывает ошибку HTTP 504 через 60 секунд
Пожалуйста, помогите мне понять эту проблему.
<VirtualHost *:80>
ServerName mywebsite.example.com
ServerAlias www.mywebsite.example.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/mywebsite.example.com-error.log
CustomLog ${APACHE_LOG_DIR}/mywebsite.example.com-access.log combined
RewriteCond %{REQUEST_METHOD} !^(GET|POST)$
RewriteRule .* - [R=405,L]
ProxyPass /.static-pages !
ProxyPass / http://<Internal Apache Server IP>/
ProxyPassReverse / http://<Internal Apache Server IP>/
</VirtualHost>
С директивой ProxyPass
вы можете рассмотреть параметр connectiontimeout
.
Смотрите документацию по mod_proxy Apache httpd: https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#workers
Параметр
connectiontimeout
устанавливает количество секунд, которое Apache httpd
ждет завершения создания соединения с задним сервисом.
Значение по умолчанию для этого параметра равно 60s …
Ответ или решение
Проблема таймаута Apache Reverse Proxy через 60 секунд
Введение
Вы столкнулись с проблемой таймаута на вашем Apache Reverse Proxy сервере, который используется для проксирования запросов к внутреннему серверу Apache. При этом возникновение ошибки HTTP 504 происходит, когда запросы к бэкенду превышают 60 секунд, несмотря на то, что по умолчанию Apache настроен на таймаут в 300 секунд. В данной статье мы разберем возможные причины проблемы и предложим решения.
Причины проблемы
-
Настройки таймаута: Обратите внимание, что в Apache модуль
mod_proxy
имеет свои параметры таймаута, отличные от общих параметров сервера. Вы указали, что использовали параметрtimeout=600
, но это не влияет на настройкуconnectiontimeout
, которая по умолчанию составляет 60 секунд. -
Параметры ProxyPass: Ваша текущая настройка
ProxyPass
может потребовать дополнительной настройки времени ожидания. Параметры, такие какProxyTimeout
,connectiontimeout
, могут проявлять различные значения в зависимости от конфигурации. -
Задержка со стороны Бэкенда: Если бэкенд-сервер занимает более 60 секунд для обработки запроса, это может быть следствием длительных операций, таких как сложные запросы к базам данных или медленные внешние API.
Решения
1. Изменение параметров ProxyPass и конфигурации таймаута
Для решения проблемы с таймаутом попробуйте изменить конфигурацию следующим образом:
<VirtualHost *:80>
ServerName mywebsite.example.com
ServerAlias www.mywebsite.example.com
ProxyPreserveHost On
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/mywebsite.example.com-error.log
CustomLog ${APACHE_LOG_DIR}/mywebsite.example.com-access.log combined
RewriteCond %{REQUEST_METHOD} !^(GET|POST)$
RewriteRule .* - [R=405,L]
ProxyPass /.static-pages !
ProxyPass / http://<Internal Apache Server IP>/ connectiontimeout=600 timeout=600
ProxyPassReverse / http://<Internal Apache Server IP>/
</VirtualHost>
2. Использование ProxyTimeout
Добавьте параметр ProxyTimeout
для установки времени ожидания по умолчанию для всех запросов:
ProxyTimeout 600
3. Оптимизация Бэкенда
Проверьте производительность вашего бэкенд-сервера. Возможно, стоит оптимизировать SQL-запросы или проверить работу скриптов PHP.
4. Логирование и мониторинг
Рекомендую включить более детальное логирование для выявления узких мест. Вы можете использовать mod_log_config
для настройки детализированных логов и анализа, где именно происходят задержки.
Заключение
Корректная настройка параметров таймаута в Apache Reverse Proxy и оптимизация вашего бэкенда способны существенно улучшить пользовательский опыт и избежать ошибок таймаута. Если после внесения изменений проблема сохраняется, стоит рассмотреть возможность использования инструментов мониторинга, что позволит более глубоко анализировать производительность вашего приложения и выявить узкие места.