macOS无法移除默认Apache,XAMPP本地服务被占用求助
我花了两天时间排查这个问题,至今毫无头绪。在macOS上用XAMPP跑Apache服务器,但localhost被某个进程占用,无法访问我XAMPP里的项目。
浏览器输入localhost显示的是“It works!”,不是我在XAMPP文件夹里编写的PHP代码。用XAMPP的直接IP能正常访问,而且我已经在XAMPP里开启了转发到localhost的选项。
我试过网上各种卸载系统预装Apache的命令:
sudo apachectl stop sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
但执行任何一条都报错:
/System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find specified service
Unload failed: 113: Could not find specified service
还试过这两条命令:
sudo killall httpd && sudo launchctl unload /.System/Library/LaunchDaemons/org.apache.httpd.plist sudo killall httpd
结果都是提示:No matching processes found。
感觉我机器上有个清不掉的“幽灵”Apache服务器,除了重装系统,还有别的解决办法吗?
以下是80端口的连接日志(来自sudo lsof -i 80):
关闭屏幕时间前:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME webfilter 789 root 1208u IPv4 0x5706a7f639e7fa1f 0t0 TCP localhost:64814->localhost:http (CLOSED) webfilter 789 root 1210u IPv4 0x5706a7f639ec1f77 0t0 TCP localhost:64816->localhost:http (CLOSED) webfilter 789 root 1215u IPv4 0x5706a7f639ec14cf 0t0 TCP localhost:64818->localhost:http (CLOSED) webfilter 789 root 1216u IPv4 0x5706a7f639dc6a1f 0t0 TCP localhost:49951->localhost:http (CLOSED) webfilter 789 root 1235u IPv6 0x5706a7eca5697817 0t0 TCP localhost:65520->localhost:http (CLOSED) webfilter 789 root 1236u IPv4 0x5706a7f639e7c4cf 0t0 TCP localhost:49953->localhost:http (CLOSED) webfilter 789 root 1240u IPv4 0x5706a7f639de3f77 0t0 TCP localhost:49955->localhost:http (CLOSED) webfilter 789 root 1251u IPv4 0x5706a7f639d37a1f 0t0 TCP localhost:49626->localhost:http (CLOSED) webfilter 789 root 1254u IPv4 0x5706a7f639dd0f77 0t0 TCP localhost:49628->localhost:http (CLOSED) webfilter 789 root 1257u IPv4 0x5706a7f639e96a1f 0t0 TCP localhost:49630->localhost:http (CLOSED) webfilter 789 root 1258u IPv4 0x5706a7f639e6af77 0t0 TCP localhost:49640->localhost:http (CLOSED) webfilter 789 root 1260u IPv6 0x5706a7eca569be17 0t0 TCP localhost:65523->localhost:http (CLOSED) webfilter 789 root 1263u IPv6 0x5706a7eca569b017 0t0 TCP localhost:65525->localhost:http (CLOSED) webfilter 789 root 1264u IPv4 0x5706a7f63a224a1f 0t0 TCP localhost:49642->localhost:http (CLOSED) webfilter 789 root 1265u IPv4 0x5706a7f639d5df77 0t0 TCP localhost:49644->localhost:http (CLOSED)
关闭屏幕时间后:
COMMAND PID USER FD TYPE DEVICE SIZE/OFFNODE NAME httpd 9042 root 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9046 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9047 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9048 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9049 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9050 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9095 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9109 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN) httpd 9110 daemon 7u IPv6 0x1d7fb05cf9c725c1 0t0 TCP *:http (LISTEN)
解决步骤
1. 强制终止占用端口的httpd进程
从关闭屏幕时间后的日志可以看到,确实有httpd进程在监听80端口,但系统默认的launchctl找不到对应服务,说明这是第三方安装或非常规启动的Apache。
直接通过PID终止这些进程:
sudo kill -9 9042 9046 9047 9048 9049 9050 9095 9109 9110
如果后续还有新的httpd进程自动启动,批量终止所有相关进程:
sudo pkill -9 httpd
2. 检查第三方Apache服务(比如Homebrew)
很多开发者会用Homebrew安装Apache,先检查Homebrew的服务列表:
brew services list
如果看到httpd或apache2处于started状态,立即停止:
brew services stop httpd
如果不需要该服务,可以直接卸载:
brew uninstall httpd
3. 修改XAMPP Apache监听端口(备选方案)
如果找不到占用80端口的根源,直接修改XAMPP的端口避免冲突:
- 打开XAMPP控制面板,点击Apache的
Config按钮,选择Apache (httpd.conf) - 找到
Listen 80,修改为Listen 8080(或其他未被占用的端口) - 找到
ServerName localhost:80,修改为ServerName localhost:8080 - 保存文件后重启XAMPP的Apache服务,之后通过
localhost:8080访问项目
4. 检查自定义Launch服务
系统默认服务在/System/Library/LaunchDaemons,但第三方服务可能在/Library/LaunchDaemons或~/Library/LaunchAgents目录下,检查这些位置的httpd相关plist文件:
ls /Library/LaunchDaemons | grep httpd ls ~/Library/LaunchAgents | grep httpd
如果找到对应文件,先卸载服务再删除文件:
sudo launchctl unload -w /Library/LaunchDaemons/[对应的plist文件名] sudo rm /Library/LaunchDaemons/[对应的plist文件名]
5. 排查屏幕时间的影响
从日志来看,关闭屏幕时间后出现了httpd进程,说明屏幕时间的webfilter服务可能和Apache存在冲突,或者触发了某种代理服务。可以尝试完全关闭屏幕时间,或者在屏幕时间设置中排除XAMPP相关程序。
内容的提问来源于stack exchange,提问作者Jarod Rakoff

