【问题标题】:How to configure two or multiple routes in an Apache reverse proxy setup如何在 Apache 反向代理设置中配置两个或多个路由
【发布时间】:2019-10-13 11:34:37
【问题描述】:

我继承了一个反向代理设置,它是 Apache SSL 终止 EC2 实例堆栈(带有 ALB 和 DNS)的一部分。 Apache 服务器及其配置是从 rpm 规范文件中烘焙出来的,这些文件在创建或更新期间部署在服务器上的 RPM 中。 我目前有一个映射,将请求路由到域名或主机名到私有(不在公共互联网上)后端 API。我在 S3 中有使用此 API 的静态资产,我的要求是还配置从用户友好域名到此 S3 存储桶的路由,然后希望将此后端 S3 url 设为私有。

将 API 的后端 url 与 S3 的 url 交换,我已经能够从公共域路由到 S3 存储桶。但是,我不确定如何使用相同的来源或域名设置两条路由,因为我必须使用 S3 存储桶中的 API 并验证访问这些资源的用户的证书。

这个系统就像一个黑匣子,我目前无法访问日志。在下面的代码中,我已将 S3_URL 和 /visualizer/ 映射添加到原始 API 映射中。 API 映射有效,但 S3_URL 组合在一起时无效。

#!/bin/bash

set -eu -o pipefail

API_URL=$(cat $1 | jq -r '.configuration.API_URL')
echo $API_URL

S3_URL=$(cat $1 | jq -r '.configuration.S3_URL')
echo $S3_URL

cat > /etc/httpd/conf.d/coy-httpd-includes/https_vhost/proxypass.inc <<EOF
ProxyRequests Off
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyMachineCertificateFile /etc/pki/tls/private/client_crt_rsa.pem

<Proxy *>
    Require all granted
</Proxy>

ProxyPass / ${API_URL} retry=\${CLOUD_HTTPS_PROXY_RETRY} keepalive=\${CLOUD_HTTPS_PROXY_KEEPALIVE} nocanon
ProxyPassReverse / ${API_URL}

ProxyPass /visualizer/ ${S3_URL} retry=\${CLOUD_HTTPS_PROXY_RETRY} keepalive=\${CLOUD_HTTPS_PROXY_KEEPALIVE} nocanon
ProxyPassReverse /visualizer/ ${S3_URL}
EOF

cat > /etc/httpd/conf.d/coy-httpd-includes/http_vhost/elb_health_check_proxypass.inc <<'CONFIG'
RewriteEngine on
RewriteRule / /var/www/cgi-bin/status
<Directory /var/www/cgi-bin>
  Options +ExecCGI
  SetHandler cgi-script
</Directory>
CONFIG

【问题讨论】:

    标签: apache reverse-proxy


    【解决方案1】:

    在互联网上搜索了几个小时的解决方案并了解了更多关于 Apache 和 Nginx 等类似服务器的信息后,我找到了解决方案。

    我添加了一个 Location 指令,该指令映射公共反向代理主机名上的路径,触发流量代理到后端 S3 存储桶 URL 中的静态资源,以便我可以访问 https://app.test.api.coy.co.uk/visualizer/visualize-graph.html。它仍然提出了另一个问题,即如何阻止除此特定 html 页面之外的目录浏览。

    这是应用解决方案后我的 apache 配置的样子:

    #!/bin/bash
    
    set -eu -o pipefail
    
    API_URL=$(cat $1 | jq -r '.configuration.API_URL')
    echo $API_URL
    
    S3_URL=$(cat $1 | jq -r '.configuration.S3_URL')
    echo $S3_URL
    
    cat > /etc/httpd/conf.d/coy-httpd-includes/https_vhost/proxypass.inc <<EOF
    ProxyRequests Off
    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyMachineCertificateFile /etc/pki/tls/private/client_crt_rsa.pem
    
    <Proxy *>
        Require all granted
    </Proxy>
    
    ProxyPass / ${API_URL} retry=\${CLOUD_HTTPS_PROXY_RETRY} keepalive=\${CLOUD_HTTPS_PROXY_KEEPALIVE} nocanon
    ProxyPassReverse / ${API_URL}
    
    <Location /visualizer/ >
      ProxyPreserveHost Off
      ProxyPass ${S3_URL} retry=\${CLOUD_HTTPS_PROXY_RETRY} keepalive=\${CLOUD_HTTPS_PROXY_KEEPALIVE} nocanon
      ProxyPassReverse ${S3_URL}
    </Location>
    EOF
    
    cat > /etc/httpd/conf.d/coy-httpd-includes/http_vhost/elb_health_check_proxypass.inc <<'CONFIG'
    RewriteEngine on
    RewriteRule / /var/www/cgi-bin/status
    <Directory /var/www/cgi-bin>
      Options +ExecCGI
      SetHandler cgi-script
    </Directory>
    CONFIG
    

    这些资源帮助我找到了解决方案: Getting 404 for S3 static website JS behind Apache proxy, https://www.jamescoyle.net/how-to/116-simple-apache-reverse-proxy-example,和 https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost

    【讨论】:

    • 我找到了一个解决方案,通过阻止从互联网直接访问 S3 存储桶及其内容(除了通过 Apache 反向代理)来禁用或阻止托管 S3 网站的入口 HTML 页面的目录的目录浏览.我通过在其定义 CloudFormation 代码中将存储桶的权限从 PublicRead 更改为 Private 并运行它以更新存储桶的定义来实现这一点。尝试浏览该目录将导致 S3 AccessDenied 错误消息和以 XML 格式显示的代码。
    猜你喜欢
    • 2015-04-26
    • 2019-10-15
    • 1970-01-01
    • 2021-03-05
    • 2017-10-24
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多