systemctl restart httpd 启动失败 Apache HTTP 服务器 httpd pid 正在运行

systemctl restart httpd 启动失败 Apache HTTP 服务器 httpd pid 正在运行

请原谅 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.confjournalctl -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 处于活动状态

相关内容