Sierra 附带的 Apache 不会停止、重新启动或接受新配置

Sierra 附带的 Apache 不会停止、重新启动或接受新配置

我最近在 MacOS Sierra 上通过 homebrew 安装了 PHP-7.1,但一切都停止了。出现奇怪的错误、权限问题等等。现在我试图停止 Apache(随 Sierra 一起提供),但 Apache 就是死不了。

杀了它:

$ sudo apachectl stop
AH00557: httpd: apr_sockaddr_info_get() failed for My-MacBook-Pro.local
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
httpd (no pid file) not running

检查它是否正在运行:

$ sudo lsof -i:80
COMMAND   PID USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
httpd    3722 _www    4u  IPv6 0x123456789abcdef      0t0  TCP *:http (LISTEN)
httpd    3724 _www    4u  IPv6 0x123456789abcdef      0t0  TCP *:http (LISTEN)
httpd    3725 _www    4u  IPv6 0x123456789abcdef      0t0  TCP *:http (LISTEN)
httpd   56048 root    4u  IPv6 0x123456789abcdef      0t0  TCP *:http (LISTEN)
httpd   56055 _www    4u  IPv6 0x123456789abcdef      0t0  TCP *:http (LISTEN)

对 Apache 进行状态检查:

$ apachectl status
Go to http://localhost:80/server-status in the web browser of your choice.
Note that mod_status must be enabled for this to work.

让我们尝试一下该链接:

$ curl http://localhost:80/server-status
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /server-status
on this server.<br />
</p>
</body></html>

好的,让我们尝试修复 httpd.conf 并重新启动 Apache:

$ sudo nano /etc/apache2/httpd.conf
$ sudo apachectl restart
AH00557: httpd: apr_sockaddr_info_get() failed for My-MacBook-Pro.local
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

哦,只是为了确认在 /etc/apache2/httpd.conf 中这两行都已取消注释:

ServerName localhost

LoadModule status_module libexec/apache2/mod_status.so

Apache 出了什么问题?我怎样才能停止它以便重新开始?

答案1

由于您已经通过 Homebrew 安装了 PHP,我相信您已经安装了多个 Apache,因此请确保您运行的是正确的 Apache。

首先,apachectl通过运行来检查的不同版本:which -a apachectl

然后检查哪个 Apache 配置文件与哪个相关联apachectl,运行:

apachectl -t -D DUMP_INCLUDES

如果您打算启动 Sierra 附带的 Apache,请在前缀中添加正确的路径,例如:

/usr/sbin/apachectl -t -D DUMP_INCLUDES
/usr/sbin/apachectl start

答案2

如果您使用命令成功停止 Apache sudo apachectl stop,您仍会看到发出命令时看到的输出apachectl status。例如,我可以看到 Apache 正在我的 OS X El Capitan 系统上使用以下命令监听端口 80网络状态命令,停止它,检查状态,它显示与您发布的相同消息,但验证 Apache 不再监听端口 80。

$ netstat -an | grep '.80' | grep -i Listen
tcp46      0      0  *.80                   *.*                    LISTEN
$ sudo apachectl stop
Password:
$ apachectl status
Go to http://localhost:80/server-status in the web browser of your choice.
Note that mod_status must be enabled for this to work.
$ netstat -an | grep '.80' | grep -i Listen
$

因此,看到该输出apachectl status并不意味着 Apache 仍在运行。您可以使用该命令验证它是否不再监听端口 80,netstat -an | grep '.80' | grep -i Listen或者检查 Apache过程httpd 正在运行,如下所示。

$ ps aux | grep httpd | grep -v grep
_www            45379   0.0  0.0  2509492   1084   ??  S     6:27PM   0:00.00 /usr/sbin/httpd -D FOREGROUND
root            45376   0.0  0.1  2511540  11292   ??  Ss    6:27PM   0:00.19 /usr/sbin/httpd -D FOREGROUND
$ sudo apachectl stop
Password:
$ ps aux | grep httpd | grep -v grep
$

“403 Forbidden”错误信息可能是由于文件权限问题。例如,如果您将某个 html 文件放在 DocumentRoot 目录中,并授予所有人读取权限,chmod 644 index.html然后尝试访问它,您会看到什么?您还可以通过检查 Apache 错误日志文件找到您遇到的问题的线索。您可以使用以下命令查看文件的位置apachectl -S。例如:

$ apachectl -S
AH00557: httpd: apr_sockaddr_info_get() failed for GSSLA15122293
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
VirtualHost configuration:
*:80                   myserver.example.com (/private/etc/apache2/extra/httpd-vhosts.conf:24)
ServerRoot: "/usr"
Main DocumentRoot: "/Library/WebServer/Documents"
Main ErrorLog: "/private/var/log/apache2/error_log"
Mutex proxy: using_defaults
Mutex default: dir="/private/var/run/" mechanism=default
Mutex mpm-accept: using_defaults
Mutex proxy-balancer-shm: using_defaults
PidFile: "/private/var/run/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="_www" id=70 not_used
Group: name="_www" id=70 not_used

上面的输出是我在系统上看到的。尽管 Apache 抱怨它“无法可靠地确定服务器的完全限定域名”,但我可以通过以下方式访问我放置在 DocumentRoot 目录中的 index.html 文件http://本地主机,虽然我设置ServerNameDocumentRoot/private/etc/apache2/extra/httpd-vhosts.conf 中的 VirtualHost 部分。“无法可靠地确定服务器的完全限定域名”并不意味着 Apache 没有监听连接。如果您在尝试访问服务器上的页面时收到“403 Forbidden”错误,则意味着 Apache 没有监听连接,因为这是 Web 服务器返回的错误消息。

相关内容