FrankenPHP与Nginx不可同时监听同一80/443端口,必须明确前端角色:若需Nginx作反向代理,则FrankenPHP改内网端口(如:8000)并用proxy_pass转发;若仅运行PHP项目,可停Nginx后直接启动FrankenPHP。

FrankenPHP 和 Nginx 同时监听 80 或 443 端口时,必然冲突——两者不能共存于同一地址+端口组合,必须明确谁做前端、谁退让。
查清谁在监听 80/443(Windows)
管理员权限运行 CMD 或 PowerShell:
netstat -ano | findstr :80
若输出末尾 PID 是 4,基本是 Windows 的 HTTP.sys 驱动(System 进程),不是 Nginx;若 PID 是其他数字(如 1234),再执行:
tasklist | findstr "1234"
看进程名是否为 nginx.exe。常见误判点:
立即学习“PHP免费学习笔记(深入)”;
- PID=4 时杀
taskkill /f /pid 4会蓝屏或断网,绝对禁止 - Nginx 常以
svchost.exe形式托管(尤其用 Windows 服务安装时),需进services.msc查 “Nginx” 服务名 - 宝塔面板的
btpanel或phpsite服务也可能静默占用 80
停 Nginx 还是改 FrankenPHP?看角色定位
FrankenPHP 不是 Nginx 替代品,而是「Web Server + PHP 运行时」二合一;如果你本就需要 Nginx 做反向代理、限流、WAF 或多站点分发,那就该让 Nginx 留在前端,FrankenPHP 改为监听内网端口(如 :8000),再由 Nginx proxy_pass http://127.0.0.1:8000 转发。
反之,若你只是想快速跑个 Laravel/Symfony 项目且不需要复杂代理逻辑,直接停掉 Nginx 更省事:
- 命令行停:
nginx -s stop(Linux/macOS)或nginx.exe -s stop(Windows 二进制) - 服务方式停:
sudo systemctl stop nginx(Linux)或services.msc中停止 Nginx 服务(Windows) - 确认已释放:
netstat -ano | findstr :80应无输出
FrankenPHP 改端口配置(CLI 模式)
不用改系统服务或重装,只需调整启动参数或配置文件:
- 命令行启动时加
--addr :8080:frankenphp php-server --addr :8080 --document-root public - 若用
frankenphp.toml,确保有:[server] address = "127.0.0.1:8080"
- Docker 启动时注意
-p映射匹配:docker run -p 8080:8080 ...,而非-p 8080:80 - 改完后 curl 测试必须用新地址:
curl http://localhost:8080/index.php,硬编码在 JS 或 .env 中的http://localhost也要同步更新
别忽略 Nginx 的 fastcgi_pass 配置残留
如果保留 Nginx 并让它代理 FrankenPHP,常见错误是仍按传统 PHP-FPM 方式配 fastcgi_pass 127.0.0.1:9000——FrankenPHP 不走 FPM 协议,它暴露的是 HTTP 接口,必须用 proxy_pass:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
此时 fastcgi_* 系列指令完全无效,留着反而容易误导后续维护。
端口冲突的本质是资源独占,而不是配置“没写对”。真正难处理的永远是那些看不见的服务:HTTP.sys、W3SVC、甚至 MicrosoftEdgeUpdate.exe。动手前先 netstat,比反复重启服务有用得多。



















