Przerywany błąd podczas używania mod_proxy do wykonania odwrotnego proxy do usługi SOAP

17

Ten błąd pojawia się co kilka minut przy użyciu mod_proxy jako odwrotnego proxy do usługi sieciowej SOAP. Prawdopodobnie pojawiają się 3 lub 4 żądania na sekundę, więc mówimy około 1 lub 2 na tysiąc, które mają ten błąd.

[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

Powoduje to niepowodzenie żądania. Jeśli mam klienta łączącego się bezpośrednio z serwerem mydła bez użycia proxy, sukces wynosi 100%, więc problem wydaje się być w proxy

Konfiguracja wygląda następująco. Celem jest przejście na serwer zapasowy, jeśli podstawowy nie jest dostępny:

<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 

Czy ktoś na to wpadł i znalazł poprawkę? W raportach błędów jest kilka wzmianek, ale nie ma rozwiązań. Jedyne, co może być niezwykłe, to żądanie klienta może wynosić 100 MB lub więcej, więc żądanie może potrwać nieco dłużej, niż można by oczekiwać w przypadku połączenia SOAP.

JOTN
źródło
Odpowiedź Davida Purdue'a (SetEnv proxy-initial-not-pooled 1) jest obecnie poprawną odpowiedzią (2016).
MattBianco,

Odpowiedzi:

27

Na wypadek, gdyby wpadł na to ktoś inny. Jest to błąd w mod_proxy, którego można uniknąć, umieszczając następujące wiersze w pliku httpd.conf:

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

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

Aby uzyskać informacje na temat tych zmiennych, zobacz mod_proxydokumentację . Mają określoną sekcję Dostosowanie protokołu, która dotyczy tych zmiennych.

JOTN
źródło
5

Zapoznaj się z dokumentacją Apache tutaj: http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

Wygląda na to, że w mod_proxy_http istnieje warunek wyścigu, ale można tego uniknąć, włączając:

SetEnv proxy-initial-not-pooled 1

Co uniemożliwia Apache użycie połączenia w puli, jeśli jest to wstępne żądanie.

Dokument zauważa, że ​​to ustawienie spowoduje obniżenie wydajności.

David Purdue
źródło
1
proxy-initial-not-pooleddziała tylko, jeśli masz konkretną łatkę, która moim zdaniem nie jest częścią httpd 2.2. Nie wiem o httpd 2.4. Zobacz bz.apache.org/bugzilla/show_bug.cgi?id=37770#c88
kubańczyk
0

Można również ukryć ten powiązany komunikat o błędzie ( AH01102: error reading status line from remote server), używając modułu mod_reqtimeout modułu apache i tej dyrektywy conf:

RequestReadTimeout header=30

Prawdopodobnie będziesz musiał włączyć moduł reqtimeout w następujący sposób:

$ sudo a2enmod reqtimeout
$ sudo apache2ctl restart
Martlark
źródło