我在负载平衡器后面有一组 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反而