Назад | Перейти на главную страницу

Периодическая ошибка при использовании mod_proxy для обратного прокси-сервера для службы SOAP

Я получаю эту ошибку каждые несколько минут при использовании mod_proxy в качестве обратного прокси для веб-службы SOAP. Вероятно, в секунду выполняется 3 или 4 запроса, поэтому мы говорим о 1 или 2 из каждой тысячи, в которых есть эта ошибка.

[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] (20014)Internal error: proxy: error reading status line from remote server soap1.server:8888
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] proxy: Error reading from remote server returned by /someapp/path/to/web/service

Это приводит к сбою запроса. Если у меня клиент подключается непосредственно к серверу мыла без использования прокси-сервера, успех составляет 100%, поэтому проблема, по-видимому, в прокси

Конфигурация выглядит так. Цель - переключиться на резервный сервер, если основной недоступен:

<Proxy balancer://apicluster>  
BalancerMember http://soap1.server:8888 lbset=0 
BalancerMember http://soap2.server:8888 lbset=1 
</Proxy>  

ProxyPass /someapp balancer://apicluster/someapp 
ProxyPassReverse / balancer://apicluster/someapp 

Кто-нибудь сталкивался с этим и нашел исправление? В отчетах об ошибках есть упоминания, но нет решений. Единственное, что может быть необычным, - это то, что размер клиентского запроса может составлять 100 МБ или больше, поэтому запрос может занять немного больше времени, чем вы ожидаете для вызова SOAP.

На случай, если кто-то еще столкнется с этим. Это ошибка в mod_proxy, которой можно избежать, поместив эти строки в ваш httpd.conf:

SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1

https://issues.apache.org/bugzilla/show_bug.cgi?id=37770

Для получения информации о том, что эти переменные, см. mod_proxy документация. У них есть специальный раздел «Настройка протокола», в котором рассматриваются эти переменные.

Обратите внимание на документацию Apache здесь: http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

Похоже, что в mod_proxy_http есть состояние гонки, но его можно избежать, включив:

SetEnv proxy-initial-not-pooled 1

Это предотвращает использование Apache объединенного соединения, если это первоначальный запрос.

В документе отмечается, что этот параметр приведет к снижению производительности.

Вы также можете подавить это сообщение об ошибке (AH01102: error reading status line from remote server) с помощью модуля apache mod_reqtimeout и этой директивы conf:

RequestReadTimeout header=30

Скорее всего, вам придется включить модуль reqtimeout следующим образом:

$ sudo a2enmod reqtimeout
$ sudo apache2ctl restart