今天早上我接到一个电话,其中一台服务器上的网络服务器无法工作。重新启动 apache2 进程解决了问题,但我无法理解崩溃的原因。
我检查了所有日志,有关事故的唯一相关信息位于error.log
:
[Tue Feb 07 06:25:39.804775 2017] [mpm_prefork:notice] [pid 16376] AH00171: Graceful restart requested, doing restart
AH00557: apache2: apr_sockaddr_info_get() failed for ourdomain.com
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
[Tue Feb 07 06:25:59.749847 2017] [unique_id:alert] [pid 16376] (EAI 2)Name or service not known: AH01564: unable to find IPv4 address of "ourdomain.com"
[Tue Feb 07 06:26:09.760784 2017] [:emerg] [pid 16376] AH00020: Configuration Failed, exiting
[Tue Feb 07 11:44:50.000663 2017] [:notice] [pid 4841] ModSecurity for Apache/2.8.0 (http://www.modsecurity.org/) configured.
[Tue Feb 07 11:44:50.001311 2017] [:notice] [pid 4841] ModSecurity: APR compiled version="1.5.1"; loaded version="1.5.1"
[Tue Feb 07 11:44:50.001317 2017] [:notice] [pid 4841] ModSecurity: PCRE compiled version="8.35 "; loaded version="8.39 2016-06-14"
[Tue Feb 07 11:44:50.001324 2017] [:warn] [pid 4841] ModSecurity: Loaded PCRE do not match with compiled!
[Tue Feb 07 11:44:50.001326 2017] [:notice] [pid 4841] ModSecurity: LUA compiled version="Lua 5.1"
[Tue Feb 07 11:44:50.001328 2017] [:notice] [pid 4841] ModSecurity: LIBXML compiled version="2.9.1"
[Tue Feb 07 11:44:50.001330 2017] [:notice] [pid 4841] Original server signature: Apache/2.4.10 (Debian) OpenSSL/1.0.1t
[Tue Feb 07 11:44:50.001364 2017] [:notice] [pid 4841] ModSecurity: StatusEngine call: "2.8.0,StanSoftWeb 6.22,1.5.1/1.5.1,8.35/8.39 2016-06-14,Lua 5.1,2.9.1,82"
[Tue Feb 07 11:44:51.420554 2017] [:notice] [pid 4841] ModSecurity: StatusEngine call successfully sent. For more information visit: http://status.modsecurity.org/
[Tue Feb 07 11:44:52.000688 2017] [core:warn] [pid 4848] AH00098: pid file /var/run/apache2/apache2.pid overwritten -- Unclean shutdown of previous Apache run?
我们肯定不是故意要求重新启动的。如果重要的话,服务器是 AWS EC2 实例。我每隔几个小时就会在日志中看到一次优雅的重新启动,但没有出现任何问题 - Web 服务器运行良好数月,在此期间没有配置更改。
AH00020: Configuration Failed, exiting
这是我无法向自己解释的台词。
我没有想法,有人可以建议崩溃的原因是什么吗?
答案1
日志中的前几行显示您的 DNS 不可用,Apache 需要可用该 DNS 才能查找您网站的完全合格域名给定您告诉其绑定的 IP 地址。 (并且它需要那以便处理 HTTP/1.1Host
标头等。)
这为您提供了几种可能的解决方案:
使用该
ServerName
指令显式为 Apache 提供 FQDN,如日志条目所示。那么你就不需要DNS了。确保您的 DNS 保持正常运行。标准做法是使用至少两个 DNS 服务器,理想情况下是地理上分开的,这样,如果一台服务器或到该服务器的路由出现故障,另一台服务器仍然可用。
当这种情况发生时,DNS 会严重减慢,因为系统会在尝试第二个 DNS 数据包之前等待第一个 DNS 数据包超时,但至少事情最终会继续进行。 DNS 缓存在这里很有帮助。
有许多公司除了为您提供辅助 DNS 之外什么都不做,因此您不必设置整个其他数据中心,或者租用整个 EC2 实例或 VPS 来建立辅助 DNS 服务器。许多其他公司提供辅助 DNS 作为其通用互联网托管服务套件之一。
使用操作系统的
/etc/hosts
文件将 IP 映射到域名,并告诉操作系统的名称解析器优先使用该信息到 DNS。这不仅比 DNS 更快,而且它的生命周期本质上与 Apache 主机的生命周期相关。让它“下降”的唯一方法是有人对/etc/hosts
.如果您选择此选项,请考虑执行上述选项。无论如何,您都需要辅助 DNS,并且没有特别的理由强制 Apache 对 IP 进行反向查找以首先找出主机名,因为它不是可能会更改的信息。