当我尝试启动 httpd 时,出现以下错误:
# service httpd start || journalctl -xn
..
[so:warn] [pid 425] AH01574: module ssl_module is already loaded, skipping
httpd[425]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443
httpd[425]: no listening sockets available, shutting
语法没问题:
# httpd -t
[so:warn] [pid 917] AH01574: module ssl_module is already loaded, skipping
Syntax OK
好的。所以ssl_module.so
被加载了两次。但它不是:
# grep -ir ssl_module /etc/httpd/*
/etc/httpd/conf.d/ssl.conf:LoadModule ssl_module modules/mod_ssl.so
它还说有东西正在监听端口 443。但实际上并没有:
# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 336/sshd
tcp6 0 0 :::22 :::* LISTEN 336/sshd
我只在我的 httpd 配置中监听一次:
# grep -ir 443 /etc/httpd/*
/etc/httpd/conf.d/ssl.conf:Listen 443
/etc/httpd/conf.d/ssl.conf:<VirtualHost *:443>
apache 没有运行任何服务:
# top -u apache
..
(nothing)
这看起来好像 apache 正在加载其他某个conf,该conf正在加载 ssl_module.so 并侦听端口 443,因为出现警告和错误,表明套接字已在使用中。
但问题是..它在哪里?
这是来自运行 CentOS Linux 版本 7.2.1511 的 VPS 配置。
答案1
问题最终是 httpd.conf 中的重复行导致 ssl.conf 加载两次。
有一行:
Include conf.d/*.conf
然后再往下:
IncludeOptional conf.d/*.conf
第一个已被删除,问题已解决。
答案2
apache2 -X
最简单的调试方法是在调试模式下或httpd -X
根据您的构建从终端会话运行服务器。您可以使用该标志来增加详细程度-e
。命令-S
标志将转储配置。页面中记录了其他标志man
。
该-M
标志将列出已加载的模块。 SSL 通常作为模块提供,需要在启用 HTTPS 之前加载。