我希望有人能够阐明这个我在其他地方没有解决的问题。我们正在运行一个用于基本负载平衡的 Apache (2.2.15) 服务器,但最终将 ProxyPass 指令用于我们的各种后端服务器。
问题似乎是 Apache “随机”不再正确加载特定的虚拟主机文件(或者更有可能是我们在不知不觉中造成了这种情况),并且我们看到 Apache 出现 404 或代理错误。
error_log 中没有错误,我还确认 httpd -S 仍然显示 vhost 已加载,但奇怪的是,如果我发出 httpd reload,它会再次开始工作。服务器有约 2GB 的可用内存。
我们的 httpd.conf 文件中有一个 Include vhosts/active 指令,并且在该目录中是指向实际 vhost 配置文件的符号链接(不要相信这是相关但想披露),我们正在加载大约 40 个不同的 vhost配置。下面是一个相对频繁发生的例子(值得一提的是,它似乎只是像这样的某些 vhost 文件):
<VirtualHost 10.10.0.77:80>
ServerName url.mysite.com
ServerAlias url
Options +FollowSymLinks
ProxyPreserveHost On
ProxyPass / http://hostname.internaldomain.local:8081/
ProxyPassReverse / http://hostname.internaldomain.local:8081/
</VirtualHost>
<VirtualHost 10.10.0.77:443>
ServerName url.mysite.com
ServerAlias url
RewriteEngine On
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLCertificateFile /etc/httpd/conf/ssl/mycert.com.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/mycert.key
SSLCertificateChainFile /etc/httpd/conf/ssl/mycert_chain.crt
Options +FollowSymLinks
ProxyPreserveHost On
ProxyPass / http://hostname.internaldomain.local:8081/
ProxyPassReverse / http://hostname.internaldomain.local:8081/
</VirtualHost>
来自 httpd.conf:
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1
Include vhosts/active/*.active
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from .mydomain.com
</Location>
<IfModule mod_headers.c>
RequestHeader unset Expect early
</IfModule>
感谢您的帮助/想法,因为搜索这个特定问题让我无处可去!
我看到两个可能的原因:
当 Apache 2.2 尝试加载 ProxyPass url 后面的内容并且它没有响应时,有时使用此 ProxyPass 的整个 vhost 会停止工作。使用默认 Apache 2.2 在 Debian Squeeze 和 Wheezy 上进行测试。
您的服务器可能还会遇到 DNS 解析器的随机问题,这会影响 ServerName 到 vhost 的映射。
如果是第一个原因,您可以尝试通过 IP 而不是 ServerName 加载 10.10.0.77:80 来测试。