我在 CentOS 7 服务器上托管客户的 wordpress 网站,使用 apache 2.4.6,托管在 cloudflare 代理后面。我大约 8 个月前设置好了一切,从那时起它一直运行良好。
今天早上 5:30 左右,网站瘫痪,显示超时。我检查了日志,在/var/log/httpd/error_log
网站停止工作时发现了以下条目:
[Thu Sep 19 04:35:57.343495 2019] [mpm_prefork:notice] [pid 13447] AH00170: caught SIGWINCH, shutting down gracefully
[Thu Sep 19 04:35:58.598479 2019] [core:notice] [pid 22161] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Thu Sep 19 04:35:58.602722 2019] [suexec:notice] [pid 22161] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
AH00558: httpd: 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
[Thu Sep 19 04:35:58.638160 2019] [lbmethod_heartbeat:notice] [pid 22161] AH02282: No slotmem from mod_heartmonitor
[Thu Sep 19 04:35:58.701474 2019] [mpm_prefork:notice] [pid 22161] AH00163: Apache/2.4.6 (CentOS) PHP/5.4.16 configured -- resuming normal operations
[Thu Sep 19 04:35:58.701545 2019] [core:notice] [pid 22161] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
自此以后,唯一的条目access_log
就是来自本地的请求。
为了进行调试,我目前已禁用 cloudflare 代理(因此 DNS 现在直接指向我的服务器),并且我index.html
在 Web 根目录中只有一个文件。如果我wget mydomain.com
在机器上本地运行,我index.html
就可以正常获取测试内容,并且会出现一个条目access_log
。如果我在外部服务器上尝试同样的事情,我会收到以下错误,并且 access_log 中没有条目:
(mydomain.com)|<the server's ip>|:80... failed: Resource temporarily unavailable
我已经仔细检查了 iptables 配置,但自五月以来它就没有被修改过,所以我很确定这不是防火墙问题。
我还重新启动了 httpd、mariadb 并重新启动了服务器,但无济于事。
还有什么其他因素可能导致 Apache 出现这些问题吗?
如果有帮助的话,服务器托管在 rackspace 云中,并且配置尽可能接近默认值;我没有设置 VirtualHosts 或类似的东西。
以下是输出netstat -l -n -t -p
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1459/master
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1383/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1500/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1459/master
tcp6 0 0 :::443 :::* LISTEN 1110/httpd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::80 :::* LISTEN 1110/httpd
tcp6 0 0 :::22 :::* LISTEN 1500/sshd
nmap 输出
Not shown: 999 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
答案1
查看输出后nmap
,很明显 http(s) 端口没有暴露。通过firewall-cmd --list-all
在服务器上运行进一步证实了这一点:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
为了解决这个问题,请运行:firewall-cmd --add-service=https --permanent
。您可以通过firewall-cmd --list-all
再次运行并查看 是否http
出现在services:
部分中来确认它是否有效。
此后,apache chan 再次看到所有外部请求。