Вопрос или проблема
Я получаю следующую ошибку при попытке доступа к веб-адресу.
Прокси-сервер получил недействительный ответ от upstream-сервера.
Прокси-сервер не смог обработать запрос GET /abcef/report. Причина: Ошибка чтения с удаленного сервера Apache/2.2.15 (Red Hat) Сервер на www.abc.nl Порт 80
Я в замешательстве, потому что то же самое работает, когда я напрямую обращаюсь к IP-адресу и пытаюсь получить доступ к URL. Может кто-нибудь помочь мне разобраться с этой проблемой.
Я искал в Google эту проблему и узнал, что дело может быть в файле vhost.conf.
Мы используем AJP-трансфер с помощью mod_jk для перенаправления с порта 8080 на порт 80 и обратно. Используемые файлы – mod_jk.conf и /etc/httpd/conf/worker.properties. Имя рабочего свойства ajp13, как указано ниже, будет использоваться в конфигурации виртуального хоста
worker.list=ajp13
Я внес некоторые изменения в файлы и попытался проверить, но ничего не работает.
Ниже приведен мой файл vhosts.conf:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName aa.bb.cc.dd
<ifModule mod_headers.c>
Header set Connection keep-alive
</ifModule>
RewriteEngine on ....
Пожалуйста, найдите файл httpd.conf
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 300
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
TraceEnable off
<IfModule prefork.c>
StartServers 20
MinSpareServers 5
MaxSpareServers 100
ServerLimit 512
MaxClients 512
MaxRequestsPerChild 0
</IfModule>
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
файл mod_jk:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /zwr* ajp13
workers.properties:
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.socket_keepalive=true
worker.ajp13.connection_pool_size=10000
worker.ajp13.connect_timeout=5000000
worker.ajp13.prepost_timeout=5000000
Вы пробовали использовать mod_proxy_ajp от httpd вместо mod_jk? Вот краткое сравнение обоих коннекторов (и не только их).
Что вы имеете в виду под “прямым IP”? IP рабочего (в обход прокси)?
Кроме этого, вы можете попробовать прослушать AJP-коммуникацию с помощью утилиты командной строки tcpdump, а затем просмотреть ее, например, в Wireshark. Это покажет вам, если, например, есть неправильно отформатированные заголовки или другие проблемы, которые могут затруднить ваш httpd-обратный прокси, но которые допускаются вашим браузером.
Также обратите внимание на директиву ProxyTimeout от httpd.
Ответ или решение
Ошибка Прокси-Сервера: Получен недействительный ответ от серверов верхнего уровня
Обзор проблемы
Вы столкнулись с ошибкой, указывающей на то, что прокси-сервер получил недействительный ответ от upstream-сервера. Основные выводы из сообщения об ошибке:
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /abcef/report.
Reason: Error reading from remote server Apache/2.2.15 (Red Hat) Server at www.abc.nl Port 80
Вы отметили, что доступ к URL работает при прямом обращении по IP-адресу, что указывает на возможные проблемы конфигурации прокси или сетевого взаимодействия.
Возможные причины и решения проблемы
-
Конфигурация
vhosts.conf
:- Убедитесь, что конфигурация вашего виртуального хоста правильная. Проверьте, нет ли несоответствий и разрешены ли все необходимые маршруты. Обратите внимание на наличие директив Rewrite и других условий. Рекомендуется включить полные журналы ошибок для отслеживания доступа.
-
Использование
mod_jk
:- Поскольку вы используете
mod_jk
для работы с AJP, убедитесь, что у вас правильно настроены свойства работника. Посмотрите, настроены ли таймауты и порты. В вашем файлеworkers.properties
, вы настроилиworker.ajp13.port=8009
, однако в конфигеmod_jk
он должен соответствовать конфигурации сервера приложений, обычно это 8009.
- Поскольку вы используете
-
Проблема с соединением:
- Убедитесь, что сервер приложений (например, Tomcat) работает и прослушивает необходимый порт (8009). Используйте команду
netstat -tuln
для проверки.
- Убедитесь, что сервер приложений (например, Tomcat) работает и прослушивает необходимый порт (8009). Используйте команду
-
Таймауты:
- Проверьте настройки таймаутов, как на стороне Apache, так и на стороне вашего приложения. Подумайте о добавлении или изменении директивы
ProxyTimeout
в вашемhttpd.conf
. Например:ProxyTimeout 600
- Проверьте настройки таймаутов, как на стороне Apache, так и на стороне вашего приложения. Подумайте о добавлении или изменении директивы
-
Анализ трафика:
- Если проблема остается нерешенной, рассмотрите возможность использования инструментов анализа трафика, таких как
tcpdump
илиWireshark
, для диагностики возможных проблем в AJP-соединении. Например, вы можете захватить трафик следующим образом:tcpdump -i any -s 0 -w capture.pcap port 8009
- Затем проанализируйте полученный файл в Wireshark, чтобы убедиться в целостности заголовков и данных.
- Если проблема остается нерешенной, рассмотрите возможность использования инструментов анализа трафика, таких как
-
Попробуйте
mod_proxy_ajp
:- Если проблема не разрешается, стоит рассмотреть возможность переключения с
mod_jk
наmod_proxy_ajp
. Этот модуль является встроенным в Apache и может предложить более простое и стабильное решение для проксирования запросов к AJP-сервисам.
- Если проблема не разрешается, стоит рассмотреть возможность переключения с
Заключение
Проблема с недействительным ответом от upstream-сервера может возникать из-за различных факторов, включая конфигурацию сервера, проблемы с соединением или настройки AJP. Постепенное устранение неполадок, начиная с проверки конфигураций и мониторинга трафика, зачастую приведет к успешному решению проблемы. Если указанные решения не помогают, возможно, стоит рассмотреть возможность обращения к профессиональному IT-специалисту или обратиться на форумы поддержки для получения более детальной помощи.