프록시 오류 502 Apache 2.2.3 (Debian) mod_proxy 및 Jetty 6.1.18에서“이유 : 원격 서버에서 읽는 중 오류”


80

Apache는 포트 : 80에서 요청을 수신하고 포트 : 8080에서 Jetty로 프록시합니다.

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

내 딜레마 : 모든 것이 잘 작동 일반적으로 (초 길이의 요청을 신속하게 요청, 몇 초 또는 몇 십 처리됩니다 확인 ). 요청 처리 시간이 오래 걸리면 (몇 분) 문제가 발생합니다 .

포트 : 8080에서 Jetty에 직접 요청 을 보내면 요청이 정상적으로 처리됩니다. 따라서 mod_proxy 사용하는 Apache와 Jetty 사이에 문제가 있을 수 있습니다. 이것을 해결하는 방법?

나는 이미 KeepAlive 설정과 관련된 몇 가지 "트릭" 을 운없이 시도했습니다 . 여기 내 현재 구성, 제안이 있습니까?

#keepalive Off                     ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1  ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1        ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20                       ## I have tried this, does not help
KeepAliveTimeout 600               ## I have tried this, does not help
ProxyTimeout 600                   ## I have tried this, does not help

NameVirtualHost *:80
<VirtualHost _default_:80>
    ServerAdmin webmaster@mydomain.fi

    ServerName www.mydomain.fi

    ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com

    ProxyRequests On
    ProxyVia On
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
    ProxyPassReverse / http://www.mydomain.fi:8080/

    RewriteEngine On
    RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
    RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

</VirtualHost>

다음은 실패한 요청의 디버그 로그입니다.

74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::

안녕 .. 나는 아직도 이것에 붙어 있습니다. 위의 모든 설정을 시도하고 jetty maxIdleTime을 늘리는 것도 도움이되지 않았습니다. 다음에 시도 할 사항이 있습니까?
Martin

답변:


91

나는 문제를 해결했다. 을 Keepalive=On삽입해야 ProxyPass설정 라인 :

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

저것 좀 봐

Keepalive=On

그곳에? 중요합니다.)


9
본인의 답변을 수락 됨으로 표시 할 수 있다고 생각합니다. 다른 사람이 찾을 수 있도록 시스템에서 질문이 해결 된 것으로 표시됩니다.
sysadmin1138

정확히 어디에 두어야합니까?
AlxVallejo

1
@AlxVallejo 설정 파일은 /etc/apache2/sites-enabled/[sitename].conf에서 찾을 수 있습니다
Steven

1
프록시 오류는 정확히 동일합니다. 그들은 매우 드물게 발생합니다 (천 번의 요청 중 하나). 정확히 Keepalive=On중요합니까?
dokaspar

그것은하지 될 수 timeout=600또는 retry=1이를 대신 고정? (또는 콤보)
MattBianco

4

설정을 시도 했습니까 setenv proxy-initial-not-pooled 1?

여기 참조


아니요, 도움이되지 않았습니다. 그런 다음 경쟁 조건에 관한 것이 아니며 오랜 지연이며 사이에 문제가 있습니다 (Jetty와 mod_proxy 사이의 오해).

4

프록시 URL을로 끝내지 않으면이 오류가 발생할 수도 있습니다 /. 두 경로 모두 /또는로 끝나지 않아야합니다.


1

로그를 보면 5 분 (= 300 초)에 시간 초과되는 것이 있습니다. 응답을 기다리는 데 오랜 시간이 걸렸습니다. Jetty 서버에 직접 액세스 할 때이 자원이 실제로 응답하는 데 시간이 오래 걸립니까?

5 분이 실제로 가능한 응답 시간 내에있는 경우 ProxyTimeout 구성 지시문을 조정할 수 있습니다.

네트워크 설정에 따라 keepalive 시스템을 사용하려고 시도 할 이유가 없을 수도 있습니다 (앱 서버와 프록시 사이에 방화벽이있어 너무 오래 유휴 상태 인 세션을 삭제하도록 구성되어 있습니까?). 그러나 ProxyTimeout은 프록시 자체의 동작에 영향을줍니다.

동일한 프록시가 다른 백엔드를 제공하는 경우 현재 ProxyTimeout을 유지하고 ProxyPass 지시문에서 시간 초과를 구성하는 것이 좋습니다 (mod_proxy 설명서 참조).

그러나 프록시가없는 응답이 5 분보다 훨씬 적은 값이 여기에서 차단 한계로 간주되는 경우 프록시와 앱 서버간에 약간의 간섭이있을 수 있지만 그것이 무엇인지 식별하기위한 가치.


"Jetty 서버에 직접 액세스 할 때이 자원이 실제로 응답하는 데 시간이 오래 걸립니까?" -- 예. 이 ProxyTimeout을 600으로 설정하려고했습니다. 도움이되지 않습니다. 프록시와 부두 사이에는 방화벽이 없습니다. 시간 초과는 ProxyPass에서도 구성됩니다.

"당신은 그것이 무엇인지 식별하기 위해 어떤 가치도 제공하지 않습니다": 나는 그것이 무엇인지 알 수 없습니다. 내가받는 것은 서버에서 오류 메시지입니다. 프록시 오류 프록시 서버가 업스트림 서버에서 잘못된 응답을 받았습니다. 프록시 서버가 GET / 요청을 처리 할 수 ​​없습니다. 이유 : 원격 서버에서 읽는 중 오류

프록시 시간 초과를 늘리는 경우 502 오류가 발생하기 전에 브라우저가 회전 한 시간도 변경 되었습니까?

그런 다음 애플리케이션 서버에서 무슨 일이 일어나고 있는지 알아내는 방법 : 몇 개의 스레드 덤프를 가져 와서 브라우저가 대기 중일 때 실행중인 것을 볼 수 있습니다. 또는 코드를 추적하여 느려짐의 원인을 찾아 낼 수 있도록 충분한 디버그 로깅 문을 추가하십시오.

왜 느린 지 알고 있습니다. 아파치 프록시가 마침내 준비되었을 때 응답을 거부하는 이유를 모르겠습니다.

0

Transfer-Encoding" (binary)내 서버 응용 프로그램 (PHP)에서 호출 된 헤더 값을 제거하면 다음과 같은 문제가 해결되었습니다.

[proxy_http : error] [pid 17623] (22) 잘못된 인수 : [client 127.0.0.1:44929] AH01102 : 원격 서버 0.0.0.0:80에서 상태 표시 줄을 읽는 중 오류가 발생했습니다.

다른 모든 제안은 좋아 SetEnv proxy-initial-not-pooled하거나 Keep-Alive하지 않았습니다.


0

위의 솔루션이 작동하지 않으면 시도 할 수있는 한 가지 방법은 모든 아파치 모듈을 활성화하여 우발적으로 비활성화 된 모듈이 없는지 확인하는 것입니다.

예를 들어, 문제의 원인을 발견 한 방법은 모든 Apache 구성 파일에서 #LoadModule의 모든 인스턴스를 LoadModule로 바꾸는 것입니다. 그로 인해 문제가 해결되었으므로 내 문제가 "KeepAlive"지시문이 누락 된 것이 아니라 내 문제가 종속성이 없다는 것을 알았습니다.

.so 파일은 기본적으로 정적 라이브러리이기 때문에 기억하십시오. 모듈이 활성화되었다고해서 사용된다는 의미는 아니지만 사용할 수 없다는 것은 모듈을 사용할 수 없으므로 해당 모듈에 의존하는 모든 것이 반드시 실패한다는 것을 의미합니다.

참고 :이 답변은 초기 답변이 모든 모듈을 영원히 활성화 상태로 유지하는 것으로 보였기 때문에 약간의 투표를 받았습니다. 이론적으로는 아무 것도 깨지 않고 그렇게 할 수 있지만 분명히 모범 사례 솔루션은 아닙니다.

따라서 최종 해결책이 아니라 문제 해결 단계로 제안하는 것입니다.

또한 참고 : 특수 로컬 프로젝트를 사용하여 로컬 컴퓨터의 모든 아파치 구성 파일을 추적합니다. 그렇게하면 아파치 설정 작업 디렉토리에서 문제 해결 단계로 이러한 종류의 전역 검색 및 교체 작업을 수행 할 수 있습니다. 모든 모듈을 활성화하면 성공한 상태로 유지해야하는 모듈을 찾을 때까지 하나씩 다시 비활성화하고 아파치를 다시 시작하십시오. 일단 알아 낸 후에는 저장소를 원래 상태로 다시 설정하고 활성화 된 상태로 유지해야하는 하나의 모듈 만 활성화하십시오.

또한 git을 사용하여 아파치 구성 파일을 추적하면 더 이상 구식 .bak 및 .default 파일이 필요하지 않으므로 디렉토리를 정리합니다.


1
각 라이브러리는 프록시와 관련이없는 다른 기능을 제공합니다
Arnold Roa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.