Apache ProxyПрохождение нескольких местоположений

Apache ProxyПрохождение нескольких местоположений

В настоящее время у меня возникли проблемы при попытке использовать Apache в качестве обратного прокси-сервера для интерфейса нашего приложения и API нашего бэкэнда.

Например, если пользователь нажимает на URL, https://my.app.com/он должен быть перенаправлен на наше фронтенд-приложение, обслуживаемое S3. Если вы нажмете на URL, https://my.app.com/api/helloвы получите ответ JSON от нашего бэкенд-API.

Идеальным поведением является 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

Мы убедились, что наш API действительно прослушивает этот механизм, указав Apache только на 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>

У меня нет технических оснований полагать, что это решит вашу проблему, но, возможно, стоит попробовать.

Связанный контент