Apache + MOD_JK:通过 AJP 重写 URL + ProxyPassing

Apache + MOD_JK:通过 AJP 重写 URL + ProxyPassing

我有一个部署了 Apache 2.4.23 + OpenSSL 1.0.2j 的前端服务器。

然后我有另一台安装了 Tomcat 7 的服务器。

这个想法是 Apache 在 *:443 上有一个 VHOST,它使用 ProxyPass 根据指定的 URL 通过 AJP 将请求发送到 Tomcat 服务器。

这是我的 vhosts.conf 文件(它具有 SSL 配置,因为我不想使用 httpd-ssl.conf 文件,因为我必须在其上更改很多内容),根据此站点:

https://mozilla.github.io/server-side-tls/ssl-config-generator/

##################################################################################################################
# VHOSTS HTTP

# redirect all HTTP to HTTPS (optional)
<VirtualHost *:80>

    ServerAlias *
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]

</VirtualHost>

##################################################################################################################
# VHOSTS HTTPS

Listen 443

# modern configuration, tweak to your needs
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol        all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLProxyCipherSuite     ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

SSLPassPhraseDialog     builtin

SSLSessionCache        "shmcb:c:/ap24/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300

# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling                      on
SSLStaplingResponderTimeout         5
SSLStaplingReturnResponderErrors    off
SSLStaplingCache                    "shmcb:c:/ap24/logs/ocsp(128000)"

<VirtualHost *:443>

    SSLEngine on
    SSLCertificateFile "conf/xin.foo.com/xin.crt"
    SSLCertificateChainFile "conf/xin.foo.com/bundle.crt"
    SSLCertificateKeyFile "conf/xin.foo.com/xin.key"

    # Uncomment the following directive when using client certificate authentication
    #SSLCACertificateFile    /path/to/ca_certs_for_client_authentication

    # HSTS (mod_headers is required) (15768000 seconds = 6 months)
    Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass /bar ajp://X.X.X.X:XXXX/bar/
    ProxyPass /bar/ ajp://X.X.X.X:XXXX/bar/bar.html

</VirtualHost>

现在,正如您所看到的,根据 URL 的情况,我有 2 个代理密码。这是因为我有一个“管理”/后端区域和一个用户区域。第一个代理密码是针对管理区域的,第二个是针对用户区域的。

现在,对于这些网站,我需要这些 URL:

行政: https://xin.foo.com/bar/bar

用户: https://xin.foo.com/bar/bar?app=personal

我现在在“本地”环境中使用 Apache 服务器,这意味着我还没有一个带有 Apache 服务器公共 IP 的 TLD 子域。因此,在办公室的本地计算机上,我编辑了“windows/system32/drivers/etc”上的“hosts”文件,并添加了以下行:

xin.foo.com Y.Y.Y.Y (which is the IP address of the Apache frontal server).这样,我就可以从我的机器上模拟来自 inet 的公共访问。

说了这么多,现在来说说事情:

Inet 人员将通过https://xin.foo.com。 就是这样。

我想 ”https://xin.foo.com“直接访问用户区

还有类似的东西https://xin.foo.com/admin,访问ADMIN 后端区域

那么,我猜有两件事需要考虑:

  • AJP 代理通行证
  • 是否可以先使用参数或其他东西进行 mod-rewrite,以强制已配置的代理密码工作?由于该应用程序安装在 Tomcat 服务器上,因此需要一些参数 (?app=personal) 来显示用户区域。并且没有参数 = 管理区域。

也许我必须删除 Proxypasses 并对其执行一些 mod_proxy_ajp?

正确的做法是什么?怎么做?我很感激最终的解决方案,因为 mod_rewrite 和 Porxypass 不是我的专长...而且我确信即使这两个代理密码也是错误的,但这就是他们给我的。

根据评论进行编辑:

总而言之,现在一切都运行正常,但我需要按照前面的说明编写 URL,以访问正确的区域。我想要的是根据逻辑更改服务器的行为,让简单的 TLD URL 转到用户区域,让“/admin”转到后端区域。我添加了从 http 到 https 的重写,效果很好。现在我想我可以添加一个重写,内容如下:

“如果https://xin.foo.com然后https://xin.foo.com/bar/bar?app=personal

“如果https://xin.foo.com/admin然后https://xin.foo.com/bar/bar

这样一来,我猜 AJP 程序应该还能正常工作。A+ 级的评分标准是不要修改浏览器上的 URL,这样人们才能继续阅读“https://xin.foo.com“寻找真实与隐藏”https://xin.foo.com/bar/bar?app=personal“。

非常感谢大家,并致以亲切的问候。

相关内容