Apache Proxy여러 위치 전달

Apache Proxy여러 위치 전달

현재 Apache를 사용하여 애플리케이션의 프런트 엔드와 백엔드 API에 대한 역방향 프록시 역할을 하는 데 문제가 있습니다.

예를 들어, 사용자가 URL을 누르면 https://my.app.com/S3에서 제공되는 프런트엔드 애플리케이션으로 이동해야 합니다. URL을 누르면 https://my.app.com/api/hello백엔드 API로부터 JSON 응답을 받게 됩니다.

이상적인 동작은 https://my.app.com/에 역방향 프록시되는 것입니다 http://s3app.private.

마찬가지로 우리는 https://my.app.com/api/hello역방향 프록시를 원할 것입니다.http://myapi.private/api/hello

현재 Apache 구성은 다음과 같습니다.

Listen 443                                                                                                                                                                        
<VirtualHost *:443>                                                                                                                                                               
    ServerName my.app.com                                                                                                                                               
    ErrorDocument 404 /index.html                                                                                                                                                
    ProxyErrorOverride On                                                                                                                                                        

    RequestHeader set X-Forwarded-Proto https                                                                                                                                     

    SSLEngine on                                                                                                                                                                  
    SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"                                                                                                                 
    SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"                                                                                                                  
    SSLProtocol TLSv1.2                                                                                                                                                           

    ProxyAddHeaders On                                                                                                                                                            

    <Location "/">                                                                                                                                                                
        ProxyPass "http://s3app.private/" retry=0                                                                                                                      
    </Location>                                                                                                                                                                   
    <Location "/api">                                                                                                                                                             
        ProxyPreserveHost On                                                                                                                                                      
        ProxyPass "http://myapi.private/api" retry=0                                                                                                                             
    </Location>                                                                                                                                                                   
</VirtualHost> 

현재 동작은 우리가 히트할 때 https://my.app.com/프론트엔드 애플리케이션을 보는 것입니다. 그러나 우리가 공격을 하면 서버에서 오류가 https://my.app.com/api/hello발생합니다 .503

Apache 로그에는 다음 줄이 표시됩니다.

[proxy:error] The timeout specified has expired: AH00957: HTTP: attempt to connect to <internal_ip>:80 (api.private) failed
[proxy_http:error] AH01114: HTTP: failed to make connection to backend: myapi.private, referer: https://my.app.com/
"GET /api/hello HTTP/1.1" 503 299

우리는 다음과 같이 Apache가 API만 가리키도록 함으로써 API가 실제로 이 메커니즘을 통해 수신 대기하고 있음을 확인했습니다.

Listen 443                                                                                                                                                                        
<VirtualHost *:443>                                                                                                                                                               
    ServerName my.app.com                                                                                                                                               
    ErrorDocument 404 /index.html                                                                                                                                                
    ProxyErrorOverride On                                                                                                                                                        

    RequestHeader set X-Forwarded-Proto https                                                                                                                                     

    SSLEngine on                                                                                                                                                                  
    SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"                                                                                                                 
    SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"                                                                                                                  
    SSLProtocol TLSv1.2                                                                                                                                                           

    ProxyAddHeaders On                                                                                                                                                            

    <Location "/api">                                                                                                                                                             
        ProxyPreserveHost On                                                                                                                                                      
        ProxyPass "http://myapi.private/api" retry=0                                                                                                                             
    </Location>                                                                                                                                                                   
</VirtualHost> 

그렇게 하면 https://my.app.com/api/hello예상되는 JSON 응답을 확인하고 확인할 수 있습니다. 그러나 이는 다른 위치 블록이 없는 경우에만 성공합니다.

그만한 가치가 있는 경우 내부 DNS는 Route53에서 제공되고 API는 ECS에서 호스팅됩니다.

모든 도움을 주시면 대단히 감사하겠습니다!

답변1

두 개의 가상 호스트를 사용하면 도움이 될 수 있지만 가장 이상적인 솔루션은 아닐 수도 있습니다.

Listen 443
<VirtualHost *:443>
    ServerName my.app.com 
    ErrorDocument 404 /index.html
    ProxyErrorOverride On

    RequestHeader set X-Forwarded-Proto https

    SSLEngine on
    SSLCertificateFile "/usr/local/apache2/certs/certificate.crt"
    SSLCertificateKeyFile "/usr/local/apache2/certs/private.key"
    SSLProtocol TLSv1.2

    ProxyAddHeaders On

    <Location "/">
        ProxyPass "http://s3app.private/" retry=0
    </Location>
    <Location "/api">
        ProxyPreserveHost On
        ProxyPass "http://localhost:8443/api" retry=0
    </Location>
</VirtualHost>

Listen 8443
<VirtualHost *:8443>
    ServerName localhost
    <Location "/api">
        ProxyPreserveHost On
        ProxyPass "http://myapi.private/api" retry=0
    </Location>
</VirtualHost>

이것이 귀하의 문제를 해결할 기술적인 이유는 없지만 시도해 볼 가치가 있을 수 있습니다.

관련 정보