请原谅 Stack Overflow 的交叉发布,但我意识到这可能是更好的提问地点。
我最近在 AWS 上重建了我的服务器,从 Amazon Linux 升级到 Amazon Linux 2,它与 Linux 1 一样,似乎是 CentOS 的一个分支,现在是 CentOS 7。我的 vhost 配置与以前的版本相同,而所有其他配置文件都是较新的默认文件。(仅供参考,不确定是否有任何影响)。
自从重建以来,我无法再这样做systemctl restart httpd
。我收到错误The Apache HTTP Server httpd pid (NNNN) already running
。
我已经做好了很多谷歌搜索发现很多人都有这个错误,但结果总是出在某件事上不同的他们做了什么。我想不出我做了什么“不同”的事情。
我了解到,我所看到的“已在运行”且由 root 拥有的 PID 是“主进程”,而 apache 拥有的所有其他 PID 都是“工作进程”。CentOS httpd 以 root 和 apache 用户身份运行
root 4461 1 0 07:18 ? 00:00:00 /usr/sbin/httpd -k restart
apache 4467 4461 0 07:18 ? 00:00:09 /usr/sbin/httpd -k restart
apache 4468 4461 0 07:18 ? 00:00:08 /usr/sbin/httpd -k restart
apache 4471 4461 0 07:18 ? 00:00:08 /usr/sbin/httpd -k restart
apache 4477 4461 0 07:18 ? 00:00:08 /usr/sbin/httpd -k restart
apache 4498 4461 0 07:18 ? 00:00:07 /usr/sbin/httpd -k restart
apache 5236 4461 0 07:19 ? 00:00:08 /usr/sbin/httpd -k restart
apache 5248 4461 0 07:19 ? 00:00:09 /usr/sbin/httpd -k restart
apache 5987 4461 0 07:20 ? 00:00:09 /usr/sbin/httpd -k restart
apache 5993 4461 0 07:20 ? 00:00:08 /usr/sbin/httpd -k restart
apache 5994 4461 0 07:20 ? 00:00:09 /usr/sbin/httpd -k restart
# systemctl restart httpd;systemctl status httpd;
Job for httpd.service failed. See "systemctl status httpd.service" and "journalctl -xe" for details.
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: failed (Result: protocol) since Thu 2021-12-23 19:56:05 UTC; 4ms ago
Docs: man:httpd.service(8)
Process: 31799 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 31799 (code=exited, status=0/SUCCESS)
Status: "Reading configuration..."
Dec 23 19:56:04 ip-10-5-11-55.ec2.internal systemd[1]: Starting The Apache HTTP Server...
Dec 23 19:56:05 ip-10-5-11-55.ec2.internal httpd[31799]: httpd (pid 4461) already running
Dec 23 19:56:05 ip-10-5-11-55.ec2.internal systemd[1]: Failed to start The Apache HTTP Server.
Dec 23 19:56:05 ip-10-5-11-55.ec2.internal systemd[1]: Unit httpd.service entered failed state.
Dec 23 19:56:05 ip-10-5-11-55.ec2.internal systemd[1]: httpd.service failed.
Apache 错误日志中没有任何异常:
[Thu Dec 23 07:18:58.777745 2021] [suexec:notice] [pid 4460] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Dec 23 07:18:58.802753 2021] [lbmethod_heartbeat:notice] [pid 4461] AH02282: No slotmem from mod_heartmonitor
[Thu Dec 23 07:18:58.802850 2021] [http2:warn] [pid 4461] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more
[Thu Dec 23 07:18:58.847386 2021] [mpm_prefork:notice] [pid 4461] AH00163: Apache/2.4.51 () PHP/7.4.21 configured -- resuming normal operations
[Thu Dec 23 07:18:58.847414 2021] [core:notice] [pid 4461] AH00094: Command line: '/usr/sbin/httpd'
如果我杀死这个“主”PID,那么我就可以毫无问题地重新启动。
# kill 4461
# systemctl restart httpd;systemctl status httpd;
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-12-23 20:01:31 UTC; 6ms ago
Docs: man:httpd.service(8)
Main PID: 3091 (httpd)
Status: "Configuration loaded."
CGroup: /system.slice/httpd.service
└─3091 /usr/sbin/httpd -DFOREGROUND
Dec 23 20:01:31 ip-10-5-11-55.ec2.internal systemd[1]: Starting The Apache HTTP Server...
Dec 23 20:01:31 ip-10-5-11-55.ec2.internal systemd[1]: Started The Apache HTTP Server.
# ps -Af | grep httpd
root 3145 1 1 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3147 3145 0 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3153 3145 0 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3171 3145 0 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3177 3145 0 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3183 3145 0 20:01 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
大多数人的建议是“直接终止进程”,Apache 无法启动,已在运行但未匹配 pid 文件?但我需要它无人值守地工作。我还能看什么?
答案1
尽管我搜索了很多,但我没有找到针对其他 Linux 版本的答案。当我注意到 httpd 最初是用“apachectl”启动的,而我试图使用“systemctl”重新启动时,我找到了答案,并认为这可能是问题所在。当我搜索这个时,我找到了很多答案。这似乎是最简洁的:https://unix.stackexchange.com/questions/240528/apache-and-systemd
在其他情况下,你会看到与我遇到的相同的问题,即一旦你开始使用 apachectl,你就必须坚持使用它,因为 systemd 无法知道你对 apachectl 做了什么,因为它使用了不同的配置。
答案2
可以通过以 root 用户身份更改 SE Linux 策略来解决这个问题,首先输入命令
journalctl -xe
你可能会在执行的底部看到这两个
ausearch -c 'ftdc' --raw | audit2allow -M my-ftdc
semodule -i my-ftdc.pp
然后重启机器
reboot
然后启动httpd服务器
systemctl start httpd
答案3
可能是因为 /etc/httpd 中的某些 .conf 文件中存在语法错误
我的原因是因为我忘记关闭 整个错误日志<VirtualHost>
中的一个元素,我从中得到的是:/etc/httpd/conf.d/laravel.conf
journalctl -xeu httpd.service
“httpd:/etc/httpd/conf/httpd.conf 第 358 行语法错误:/etc/httpd/conf.d/laravel.conf 第 1 行语法错误:/etc/httpd/conf.d/laravel.conf:8: 未关闭。\n/etc/httpd/conf.d/laravel.conf:1: 未关闭。”错误日志
所以我去修改了内容,laravel.conf
然后httpd 处于活动状态