Nginx反向代理PHP应用指将HTTP请求转发给外部PHP服务(如Swoole、Octane),而非Nginx直连PHP-FPM;需确认后端监听端口,配置upstream与proxy_pass,设置X-Forwarded头,并区分FastCGI网关模式。

Nginx反向代理PHP应用,核心是把HTTP请求从Nginx转发给实际运行PHP的后端服务(比如PHP-FPM、Swoole HTTP Server或独立PHP进程),而不是让Nginx自己解析PHP文件。这适用于PHP以非FastCGI方式运行(如Hyperf/Swoole监听9501端口)、多技术栈共存、或需统一入口做HTTPS终止等场景。
关键点:不是所有PHP部署都叫“反向代理”
只有当PHP代码由外部服务(非Nginx直连PHP-FPM)提供时,才属于真正意义上的反向代理。若直接用fastcgi_pass调本地PHP-FPM,则属于FastCGI网关模式,不属于反向代理范畴。
一、确认PHP后端已就绪
确保你的PHP应用已启动并监听某个TCP端口(常见如 127.0.0.1:9501、127.0.0.1:8000 或内网IP+端口):
- Hyperf/Swoole项目:执行
php bin/hyperf.php start后默认监听127.0.0.1:9501 - Laravel Octane:
php artisan octane:start --server=swoole --port=8000 - 自研PHP HTTP服务:确认能用
curl http://127.0.0.1:8000/health正常响应
✅ 验证命令:
netstat -tuln | grep ':8000'或ss -tuln | grep ':9501'
二、基础反向代理配置(HTTP)
在 /etc/nginx/conf.d/your-site.conf 中写入:
立即学习“PHP免费学习笔记(深入)”;
upstream php_backend {
server 127.0.0.1:9501;
keepalive 16;
}
server {
listen 80;
server_name example.com;
location / {
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://php_backend;
proxy_redirect off;
}
}-
upstream定义后端地址,支持多实例负载均衡(可加weight=2等) -
proxy_http_version 1.1和Connection ''是必须项,否则Swoole等长连接服务可能断连 -
X-Forwarded-*头用于PHP中识别真实IP和协议(如Laravel/Hyperf需启用TrustProxies中间件)
三、HTTPS支持(SSL终止)
将 listen 80 改为 listen 443 ssl http2,并添加证书路径:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
✅ Let's Encrypt证书可用
certbot --nginx自动申请;宝塔用户在网站设置 → SSL 页面一键部署
四、子路径代理与API隔离(可选)
如需将 /api 转发到PHP服务,其余路径走静态资源或其他服务:
location /api/ {
proxy_pass http://127.0.0.1:9501/; # 注意末尾斜杠,避免路径重复
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; # 支持WebSocket
}-
proxy_pass http://.../末尾带/表示截断前缀/api/,否则会原样拼接导致404 - WebSocket支持需额外配置
Upgrade和Connection头
五、验证与排错要点
- 检查Nginx语法:
nginx -t - 重载配置:
nginx -s reload - 查看错误日志:
tail -f /var/log/nginx/error.log - 常见报错定位:
-
502 Bad Gateway→ 后端未运行、端口不通、防火墙拦截 -
504 Gateway Timeout→ 后端响应慢,可加proxy_read_timeout 60; - PHP中获取不到真实IP → 确认是否启用信任代理中间件(如Hyperf的
TrustProxies、Laravel的App\Http\Middleware\TrustProxies) - 静态资源404 → 检查PHP服务是否自身处理静态文件,或Nginx是否误代理了
.js/.css请求(可加location ~ \.(js|css|png|jpg)$ { try_files $uri @php_backend; })
-
不复杂但容易忽略细节。



















