PHP 8.3 与 Nginx 集成的核心是确保 .php 请求准确转发至 PHP-FPM(Linux)或 php-cgi.exe(Windows),需严格区分系统:Linux 用 fastcgi_pass unix:/run/php/php8.3-fpm.sock 并检查 socket 权限,Windows 用 fastcgi_pass 127.0.0.1:9000 并以 -b 参数启动 php-cgi.exe,同时校准 SCRIPT_FILENAME 路径与 root 一致,否则触发 502 或 404。

PHP 8.3 和 Nginx 配合,核心不是“装两个软件”,而是让 Nginx 把 .php 请求准确转给 PHP-FPM 处理。Windows 和 Linux 路径、启动方式、配置细节差异极大,搞混就卡在 502 或 404;直接按系统区分更省事。
Linux 下用包管理器装 PHP-FPM + Nginx(推荐新手)
Ubuntu/Debian 系统最省心:先确保源已更新,再一次性装好带 FPM 的 PHP 8.3 及常用扩展:
sudo apt update && sudo apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-mbstring php8.3-xml php8.3-zip -y- 装完立刻检查服务状态:
systemctl status php8.3-fpm,必须是active (running) - Nginx 默认不自动识别 PHP-FPM 套接字路径,要确认它连的是
/run/php/php8.3-fpm.sock(Ubuntu)或/var/run/php-fpm/www.sock(CentOS),别硬套旧教程的路径 - 在 Nginx server 块里写死
fastcgi_pass指向这个 socket 文件,同时确保fastcgi_param SCRIPT_FILENAME拼出的路径和root一致,否则404或File not found
Windows 下用 php-cgi.exe 启动 FastCGI(别碰 php-fpm)
Windows 官方 ZIP 包根本不带 php-fpm.exe,强行找第三方编译版或改源码极易崩溃。正确做法是用 php-cgi.exe 拉起 FastCGI 进程:
- 下载 Non Thread Safe(NTS)版本,解压到
C:\php,复制php.ini-production改名php.ini - 编辑
php.ini,必须取消注释这两行:extension_dir = "ext"和cgi.fix_pathinfo=1,否则 Nginx 转发会出错 - 启动命令必须带
-b参数绑定地址端口:C:\php\php-cgi.exe -b 127.0.0.1:9000 -c C:\php\php.ini,不能只敲php-cgi - Nginx 配置里
fastcgi_pass必须写成127.0.0.1:9000,不能写localhost:9000(DNS 解析延迟可能触发超时)
location ~ \.php$ 规则里最容易漏掉的三件事
这段配置看着简单,但少一个字符就报 502 或空白页:
立即学习“PHP免费学习笔记(深入)”;
-
root和fastcgi_param SCRIPT_FILENAME的路径必须严格对齐。比如root /var/www/html;,那SCRIPT_FILENAME就得是$document_root$fastcgi_script_name,不能写成/var/www/html$fastcgi_script_name(硬编码路径易出错) -
try_files $uri $uri/ =404;要放在location /块里,不是location ~ \.php$里;PHP 路由(如 WordPress 固定链接)依赖它兜底,否则点文章链接直接 404 - Windows 下若用
php-cgi.exe,Nginx 日志里常出现recv() failed (10054: An existing connection was forcibly closed by the remote host)—— 这是 php-cgi 进程意外退出,需用RunHiddenConsole.exe或xxfpm.exe包裹启动,避免窗口关闭导致进程终止
验证 PHP 8.3 是否真被 Nginx 调用
别只信 php -v 或浏览器打开 phpinfo() 就算成功。要确认请求流完整走通:
- 在 Nginx 配置里加一行:
error_log /var/log/nginx/php_test.log notice;,然后访问一次test.php - 立刻查日志:
tail -f /var/log/nginx/php_test.log,看到类似*123456 fastcgi sent in stderr: "Primary script unknown"就说明SCRIPT_FILENAME拼错了;看到upstream timed out就回头查 PHP-FPM 是否在运行、socket 是否可读写 - Linux 下用
ss -tlnp | grep ':9000'或ls -l /run/php/看 socket 文件是否存在且权限为www-data用户可访问;Windows 下用netstat -ano | findstr :9000确认端口被php-cgi.exe占用
最常被忽略的是:PHP 8.3 的 opcache 默认启用但未调优,高并发下可能因共享内存不足而静默降级;还有 Windows 下 php-cgi.exe 没有守护机制,关掉控制台窗口就停服——这些不会报错,但会让服务突然不可用。



















