我最近在 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://本地主机,虽然我设置ServerName
了DocumentRoot
/private/etc/apache2/extra/httpd-vhosts.conf 中的 VirtualHost 部分。“无法可靠地确定服务器的完全限定域名”并不意味着 Apache 没有监听连接。如果您在尝试访问服务器上的页面时收到“403 Forbidden”错误,则意味着 Apache 没有监听连接,因为这是 Web 服务器返回的错误消息。