apache httpd 根据服务器名称重定向 URL

apache httpd 根据服务器名称重定向 URL

我工作的地方有 Jira 和 Confluence 系统。两者都在同一台服务器上运行。访问 Jira 和 Confluence 的实际 URL 是:

http://foauslxapp05:8080/jira
http;//foauslxapp05:8090/confluence

或者使用完全限定的主机名:

http://foauslxapp05.foservices.corp:8080/jira
http://foauslxapp05.foservices.corp:8090/confluence

为了简化一切,我设置了一个代理规则来允许用户这样做:

http://foauslxapp05/jira  <-- Accessing Jira
http://foauslxapp06/wiki  <-- Accessing Confluence

我们的技术人员为 创建了一对服务器别名foauslxapp05,以便:

http://jira/jira     <-- Accessing Jira
http://jira.foservices.corp/jira  <-- Accessing Jira
http://wiki/wiki     <-- Accessing Confluence
http://wiki.foservices.corp/wiki  <-- Accessing Confluence

我真正想做的是将其提升到下一步:

http://jira    <-- Accessing Jira
http://jira.foservices.corp  <-- Accessing Jira
http://wiki    <-- Accessing Confluence
http://wiki.foservices.copr  <-- Accessing Confluence

当然,问题在于 DNS 名称吉拉维基百科仅仅是foauslxapp05。我需要检测用户输入的 URL(即用户请求的主机),然后根据该 URL,我需要将用户重定向到正确的应用程序。

我甚至不太确定我应该看什么:这是 VirtualHost 吗?mod_rewrite?mod_proxy?或者,这是完全不同的东西。我无法想象这样的事情会太难做。不幸的是,我对 Apache httpd 不太熟悉。

答案1

您可以通过在虚拟主机配置中使用 ServerAlias 变量来实现这一点,此配置项可以支持服务器名称/别名列表:

http://httpd.apache.org/docs/2.0/vhosts/name-based.html

答案2

您需要的是基于名称的虚拟主机。由于您可能会收到很多关于如何构建虚拟主机的错误建议,因此我建议采用以下方法,因为这种方法既好又清晰(可能略有重复)。

但在我开始之前,我想说:Crowd 在这幅图中的位置在哪里(Crowd 是将 Jira 和 Confluence 很好地结合在一起的 SSO 部分)。在我们的部署中,我们有 jira.example.com/jira、jira.example.com/confluence,/crowd 和 /servicedesk 也是如此,以及接下来会出现的一切。你可能想考虑一下你的解决方案将如何发展(我不是说你的解决方案很糟糕,甚至比我们的更糟糕,但这是需要牢记的事情)。

好的,开始配置。您需要告诉 Apache 您在 HTTP 和 HTTPS 上使用基于名称的虚拟托管。

# Look in /etc/httpd/conf/httpd.conf
NameVirtualHost *:443
NameVirtualHost *:80

假设您已经安装了 mod_ssl,并且安装了 mod_proxy_ajp 来反向代理回为您提供 Jira/Confluence 等的 tomcat servlet。

希望你熟悉如何设置 mod_ssl,这样你就可以拿到证书等。我没有使用 SNI 的经验(而且如果您仍在使用 RHEL5,这实际上不是一个选项,但您没有说您使用的是哪个版本的 RHEL),所以我假设您有一个 SAN 证书,其名称如下:

  • jira.example.com(或者更确切地说是 jira.foservices.corp,但我以后将使用 example.com)
  • confluence.example.com
  • crowd.example.com(你没有说你是否在使用它......)

如果您使用的是 RHEL5 或 RHEL6,您将需要service httpd stop;编辑 /etc/sysconfig/httpd 并启用工作 MPM(取消注释 HTTPD 行),这将为您提供更好的可扩展性;然后service httpd start。RHEL7 默认使用 httpd 2.4 并具有较新的事件 MPM,我相信这比之前任何一个都要好。

编辑 /etc/httpd/conf/httpd.conf 并注释掉不需要的任何模块(LoadModule ...)。如果您不知道,请一次执行几个并用来apachectl configtest测试您的配置,因为默认配置将需要其中的一些。

当您在那里时,我建议启用 KeepAlives;这将大大提高性能。

我正在将所有这些虚拟主机放入 /etc/httpd/conf.d/sites.conf 中。我希望您能理解其中存在一些明显的重复,但通过将每个名称/服务分成不同的 VirtualHost 节可​​以增加很多清晰度。

我将从显示所有站点(jira 和 confluence)的基本结构开始,然后充实 jira 的虚拟主机(其他的将非常相似)。

<VirtualHost *:80>
    ServerName jira.example.com
</VirtualHost>

<VirtualHost *:443>
    ServerName jira.example.com
</VirtualHost>

<VirtualHost *:80>
    ServerName confluence.example.com
</VirtualHost>

<VirtualHost *:443>
    ServerName confluence.example.com
</VirtualHost>

好的,这已经相当高级了;让我们仔细看看 jira 虚拟主机。首先,我为 HTTP 访问定义了一个虚拟主机,该主机仅重定向到 HTTPS。

<VirtualHost *:80>
    ServerName jira.example.com

    ErrorLog ...
    CustomLog ...

    Redirect 301 / https://jira.example.com/
</VirtualHost>

HTTPS 站点是所有操作发生的地方:

<VirtualHost *:443>
    ServerName jira.example.com

    SSLEngine On
    SSLProtocol all -SSLv2 -SSLv3

    # The following could be tigher...
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

    # If using a SAN certificate, the following would be the same for crowd
    SSLCertificateFile /etc/pki/tls/certs/jira_etc.pem
    SSLCertificateKeyFile /etc/pki/tls/private/jira_etc.key
    SSLCertificateChainFile /etc/pki/tls/certs/jira_etc.pems

    ErrorLog ... # don't forget log rotation
    CustomLog ...

    # Enough boilerplate, down to Jira specifics. Check which ports are
    # used for each or jira/confluence etc. The command (as root or as 
    # the account running the apps) may be helpful. You want the AJP port;
    # not the HTTP port.
    #
    #    'lsof -Pni | grep LISTEN | grep java'

    # Speed boost
    AddOutputFilterByType DEFLATE text/html text/plain text/xml

    ProxyPass          / ajp://127.0.0.1:8009/jira
    ProxyPassReverse   / ajp://127.0.0.1:8009/jira
</VirtualHost>

提示:要考虑的一件事是:如果人们去说http://foauslxapp05.foservices.corp/ (默认站点),还是直接发送到服务器的 IP 地址?我建议您使用 404(未找到)或 403(禁止)进行响应。这里有一个片段供您作为家庭作业进行整合。使用它httpd -S可以获得一个非常有用的摘要,了解您当前配置中定义了哪些站点(不是正在运行的配置,而是当前的配置文件),并注意顺序很重要(这也是我将其全部放在 conf.d/sites.conf 中而不是 conf.d/jira.conf 和 conf.d/confluence.conf 等中的另一个原因)。

<VirtualHost _default_:80>
    RewriteEngine On
    RewriteRule ^ - [R=404,L]
</VirtualHost>

我建议您对 conf.d/ssl.conf 中的默认 https 站点执行类似操作

希望您发现这篇文章有用且信息丰富。

干杯,卡梅伦

相关内容