
현재 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>
이것이 귀하의 문제를 해결할 기술적인 이유는 없지만 시도해 볼 가치가 있을 수 있습니다.