Apache httpd 프록시에서 연결 오류가 발생했지만 특정 가상 호스트에서만 발생했습니다.

Apache httpd 프록시에서 연결 오류가 발생했지만 특정 가상 호스트에서만 발생했습니다.

여러 가상 호스트에 요청을 제공하기 위해 CentOS 7 시스템에 Apache v2.4 역방향 프록시를 설정했습니다. 그중에는 Atlassian 애플리케이션 서버가 있습니다.

프록시의 개인 IP 주소는 10.0.0.77이고, 공용 IP 주소는 77.77.77.77이며, 여러 DNS A 레코드는 공용 IP를 다양한 FQDN 등에 매핑합니다 foo.example.com.bar.example.com

NAT가 있습니다.

77.77.77.77:10080 -> 10.0.0.77:80
77.77.77.77:10443 -> 10.0.0.77:443

이는 프록시의 공용 IP 주소가 다른 서비스에도 사용되기 때문에 필요합니다. 다음으로 설정이것은 또 다른 질문입니다.

다음은 가상 호스트 구성의 단순화된 예입니다 /etc/httpd/conf.d/foo.conf.

<VirtualHost *:80>
    ServerName foo.example.com
    ProxyRequests       Off
    ProxyPreserveHost   Off
    SetEnv proxy-nokeepalive 1
    Redirect "/" "https://foo.example.com:10443/"
</VirtualHost>

<VirtualHost *:443>
    ServerName foo.example.com
    ServerSignature On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    SSLEngine On
    SSLProtocol ALL -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    # SSLCipherSuite shortened here for simplicity
    SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384"
    SSLCertificateFile      /etc/httpd/ssl/proxy.crt
    SSLCertificateKeyFile   /etc/httpd/ssl/proxy.key
    SSLCACertificateFile    /etc/httpd/ssl/proxy.ca.crt
    ProxyRequests           Off
    ProxyPreserveHost       On
    ProxyPass           "/" "http://foo.example.com:8080/" 
    ProxyPassReverse    "/" "http://foo.example.com:8080/"
</VirtualHost>

이 구성은 두 개의 Jira 서버, Stash 서버, Confluence v6.10 서버 및 기타 여러 서버에서 작동합니다. 그러나 웹 브라우저는 프록시 Bamboo v6.4 서버 가상 호스트 및 Question2Answer 플랫폼을 로드할 수 없습니다.

Firefox에서 보고된 오류는 입니다 NS_ERROR_NET_TIMEOUT. IE에서 오류는 다음과 같습니다:

일시적인 DNS 오류가 발생했습니다. 페이지를 새로 고쳐보세요.
오류 코드: INET_E_RESOURCE_NOT_FOUND

실패한 각 가상 호스트에 대한 httpd 액세스 로그에는 심지어 에도 아무 것도 없으므로 LogLevel trace8요청이 프록시에 도달하지 않은 것 같습니다.

프록시를 통해 컬에서 Bamboo에 액세스할 수 있습니다( -LBamboo가 302를 제공하기 때문에 플래그가 필요함).

[root@proxy]# curl -XGET http://bamboo.example.com:8085/

[root@proxy]# curl -v -XGET http://bamboo.example.com:8085/
* About to connect() to bamboo.example.com port 8085 (#0)
*   Trying 10.0.0.11...
* Connected to bamboo.example.com (10.0.0.11) port 8085 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: bamboo.example.com:8085
> Accept: */*
> 
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< X-ASEN: SEN-4619603
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Vary: Accept-Encoding
< Set-Cookie: JSESSIONID=E4D13B8AD7D4D172F4E5F834D1E89710; Path=/; Secure; HttpOnly
< Cache-Control: no-store
< Location: /userlogin!doDefault.action?os_destination=%2Fstart.action
< Content-Language: en-US
< Content-Length: 0
< Date: Mon, 01 Oct 2018 15:06:19 GMT
< 
* Connection #0 to host bamboo.example.com left intact

[root@proxy]# curl -L -XGET http://bamboo.example.com:8085/
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Log in as a Bamboo user</title>
    <meta http-equiv="X-UA-Compatible" content="IE=EDGE" />

    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="-1" />

    <meta name="application-name" content="Bamboo" />
    (...)

대상 서버의 방화벽은 서버에서 에이전트로 열려 있습니다. Atlassian 애플리케이션은 TCP/8080에서 콘텐츠를 제공하는 Jira와 같은 비표준 포트에서 실행됩니다.

거의 모든 다른 웹 호스트가 완벽하게 작동하기 때문에 혼란스럽습니다. 또한 URL 경로를 다시 확인했는데 정확했습니다.

  • 이 문제의 원인은 무엇입니까?

  • HTTP 요청을 추적하는 더 좋은 방법이 있습니까? 저는 현재 Firefox의 추가 기능인 HTTP Header Live를 사용하고 있으며 좀 더 정교한 도구를 찾고 싶습니다.

답변1

구성에 문제가 있는 경우 Apache 오류 로그에서 실패한 요청의 내용을 볼 수 있습니다. 보통 그들은 /var/log/apache2/error.log비슷한 장소나 어딘가에 있습니다 . 시간 초과는 구성의 백엔드 서버에 연결할 수 없음을 나타냅니다. 컬을 사용하여 접근할 수 있으므로 이는 구성 문제일 수 있습니다.

해당 항목에 아무것도 없거나 요청에 대한 액세스 로그(동일한 위치)가 없다면 애초에 프록시에 도달하지 않았을 가능성이 높습니다. Bamboo.example.com의 DNS 구성이 올바르고 예상대로 프록시를 가리키는지 확인하겠습니다.

외부 액세스 프록시를 사용하여 curl진행 상황을 더 자세히 확인할 수 있습니다. 이름이 예상한 IP로 확인되는지 먼저 확인해 dig보세요 .nslookup

내 생각엔 클라이언트 -> 프록시 사이에 문제가 있는 것 같습니다. 프록시 -> 백엔드 시간이 초과되면 브라우저에 504 오류 코드가 표시될 수 있기 때문입니다.

답변2

IE가 보고한 오류에서 힌트를 얻었습니다. 실패한 가상 호스트의 DNS A 레코드는 프록시 서버를 가리키는 것이 아니라 서버의 개인 IP를 가리킵니다.

Firefox는 일반적인 시간 초과만 보고했기 때문에 문제를 더 빨리 파악하지 못했습니다.

관련 정보