我希望有人能帮我解决这个问题,因为我在其他地方都没能解决。我们正在运行一个 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>
谢谢您的帮助/想法,因为搜索这个特定问题我没有找到任何结果!
答案1
我认为有两个可能的原因:
当 Apache 2.2 尝试在 ProxyPass url 后面加载内容并且它没有响应时,有时使用此 ProxyPass 的整个 vhost 会停止工作。在默认 Apache 2.2 的 Debian Squeeze 和 Wheezy 上进行了测试。
您的服务器可能还会遇到 DNS 解析器的随机问题,这会影响 ServerName 到 vhost 的映射。
您可以尝试通过 IP 而不是 ServerName 加载 10.10.0.77:80 来测试是否是第一个原因。