UDP 53端口被占用导致DNS解析失败,需优先排查DNS服务冲突而非直接杀进程;用sudo lsof -iU:53或sudo ss -ulpn | grep ':53'确认UDP监听者,常见为dnsmasq、PhpWebStudy或Docker,避免误杀mDNSResponder,并通过停用非必要服务、检查/etc/resolver/配置及验证dig/nslookup来安全释放端口。
macos 开发中遇到“端口被占用”报错(比如 eaddrinuse: address already in use :::53),**不一定是 tcp 端口冲突,很可能是 dns 服务占用了 udp 53 端口**——这是开发环境(如 phpwebstudy、dnsmasq、docker 容器、甚至某些 ide 插件)和系统 dns 服务抢同一端口的典型表现。排查要从“dns 是否在监听 53”开始,而不是直接杀进程。
确认 UDP 53 端口是否真被占用
终端执行:
sudo lsof -iU:53
或
sudo ss -ulpn | grep ':53'
重点关注输出中的 PROTO(必须是 UDP)、PID 和 COMMAND。常见占用者包括:
-
systemd-resolved(Linux 常见,Mac 不会出现) -
dnsmasq(Homebrew 安装、Docker Desktop 内置、Vagrant 等常用) -
mDNSResponder(macOS 自带,但默认不监听0.0.0.0:53,只绑定127.0.0.1或本地链路) -
PhpWebStudy、laragon、localwp等本地开发工具
区分:是系统服务冲突,还是开发工具自占
运行以下命令看 macOS 是否主动启用了 DNS 监听:
sudo lsof -i4UDP:53 | grep -v '127.0.0.1'
如果无输出,说明 mDNSResponder 没对外暴露 UDP 53;若有非 127.0.0.1 的地址(如 *:53 或 192.168.x.x:53),说明有第三方服务已接管该端口。
再查开发工具是否在后台运行:
- PhpWebStudy:检查菜单栏图标是否常驻,或运行
ps aux | grep phpwebstudy - Docker Desktop:偏好设置 → “General” → 关闭 “Use the Docker CLI to pull and push images”(有时会启用内置 DNS)
- Homebrew dnsmasq:
brew services list | grep dnsmasq,若显示started,就需停用
安全释放 UDP 53 端口(不伤系统功能)
不要直接 kill -9 所有含 53 的进程——可能误杀 mDNSResponder 导致 AirDrop、隔空播放失效。推荐按优先级操作:
- 先停用非必要开发服务:
brew services stop dnsmasq或关闭 PhpWebStudy GUI - 若 Docker 占用:
docker stop $(docker ps -q)+ 关闭 Docker Desktop - 确认无开发服务后仍被占?检查
/etc/resolver/下是否有自定义配置触发了本地 DNS 转发(如dev文件),临时重命名该目录测试 - 最后才考虑临时禁用系统 DNS 监听(极少需要):
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist(重启后自动恢复)
验证 DNS 解析是否恢复且端口可用
两步验证缺一不可:
-
端口空闲:再次运行
sudo lsof -iU:53,应无任何输出 -
DNS 正常:执行
dig @1.1.1.1 google.com +short应返回 IP;再试nslookup github.com 8.8.8.8确认外网解析通
此时再启动你的开发服务(如 PhpWebStudy),53 端口就能正常绑定。











