在 Apache 中将机器主机名作为标头发送

在 Apache 中将机器主机名作为标头发送

我在负载平衡器后面有一组 Linux Apache 1.3 服务器,我希望能够一目了然地确定我正在访问哪个服务器。负载平衡器的监控功能非常有限,所以我想配置 Apache 以发送一个额外的标头来指示机器的主机名。

我知道我可以将标头与主机名一起硬编码到 httpd.conf 中:

Header set X-Which-Host-Am-I 'host1'

但是,所有相关服务器都使用 rsync 进行镜像,包括配置,因此无法对主机名进行硬编码。有没有办法可以调用命令hostname并将其转储到标头中?

澄清:由于这些服务器上有多个虚拟主机,因此我需要物理机器的主机名,而不是请求中的域名。

答案1

未经测试,但是如何通过 init (或其他启动) 脚本传递该行?类似这样的:

/path/to/httpd -c "Header set X-Hostname $HOSTNAME"

如果您使用的是 RH 风格的发行版,您可能能够将其挤入/etc/sysconfig/httpd或类似版本以避免编辑初始化脚本。

答案2

您需要使用 mod_env 传递环境变量:

PassEnv HOSTNAME
Header set X-Hostname "%{HOSTNAME}e"

您可以通过 envvars 文件设置 HOSTNAME 的值(我的是 /etc/apache2/envvars)

另外,如果你使用 PHP,你可以使用环境变量

答案3

我遇到了同样的问题,并使用 Apache 配置指令解决了它PassEnv,该指令将环境变量从系统 shell 导入到 Apache 配置环境中。

PassEnv HOSTNAME
Header set X-Which-Host-Am-I "%{HOSTNAME}e"

幸运的是,我发现 HOSTNAME 已在我的系统 shell 环境中设置。您可以使用printenv命令行检查 shell 环境中可用的内容。

因此,只要在每台服务器上设置不同的 HOSTNAME 环境变量,您仍然可以为所有服务器具有相同的 Apache 配置,并且每台服务器都会在标头中报告其唯一的标识。

我在装有 Apache 2.4 的 CentOS 7 上对此进行了测试。我尝试查找 V1.3 的 Apache 文档,以查看该版本中是否有相同的指令,但似乎 2.2 版之前的文档在 apache.org 上不再可用。

答案4

在 Ubuntu 18.04 上使用 Apache 2.4.9 时,这个方法对我有用

nano /etc/apache2/envvars
export HOSTNAME=$(hostname)

nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                Header set X-Hostname ${HOSTNAME}

但实际上对我和我的代理设置来说,最终起作用的是使用代理Via反而

相关内容