Apache通过mod_php将PHP嵌入自身进程直接解析,需TS版PHP和LoadModule配置;Nginx则依赖php-fpm作为外部FastCGI服务处理PHP请求,需NTS版PHP及fastcgi_pass转发配置,二者架构本质不同,不可混用。

Apache 和 Nginx 都能运行 PHP,但底层机制完全不同——不是“怎么配”,而是“为什么必须这么配”。选错 PHP 版本或通信方式,轻则 502/500 报错,重则服务完全不响应。
Apache:PHP 是它自己的“内置引擎”
Apache 直接把 PHP 编译成模块(如 php8apache2_4.dll),请求进来后由 Apache 进程自己解析 PHP 代码,无需额外进程调度。
- Windows 下必须用 Thread Safe(TS)版本的 PHP,因为 Apache 的 winnt MPM 是多线程模型,共享内存需线程安全保护
- 配置核心是两行:
LoadModule php_module modules/php8apache2_4.dll
AddType application/x-httpd-php .php - 无需启动独立 PHP 进程,也不依赖 php-fpm;修改 php.ini 后重启 Apache 即生效
Nginx:PHP 是“外包协作者”,靠 FastCGI 沟通
Nginx 自身不能执行 PHP,所有 .php 请求都转给外部的 php-fpm 进程池处理,走的是 Unix socket 或 TCP 网络通道。
- 必须使用 Non-Thread Safe(NTS)版本的 PHP,因为 php-fpm 是多进程模型,每个 worker 是独立进程,无共享内存,不需要线程锁
- 关键配置在 server 块内:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} - 要单独管理 php-fpm 服务(start/stop/reload),且 php.ini 和 www.conf 需分别生效
常见踩坑点直击
很多问题其实源于混淆了二者本质:
立即学习“PHP免费学习笔记(深入)”;
- 把 Apache 用的 TS 版 PHP 直接丢进 Nginx + php-fpm —— 会启动失败或报 “Segmentation fault”
- 在 Nginx 配置里漏写 fastcgi_param SCRIPT_FILENAME —— 导致 $_SERVER['SCRIPT_FILENAME'] 为空,框架路由失效
- Apache 开启了 mod_php,又手动启了 php-fpm 并试图转发 —— 多余且易冲突
- Windows 上硬套 Linux 的 Nginx + php-fpm 方案,却忽略 php-fpm 在 Win 下稳定性差、官方不推荐
怎么选?看实际需求
不是谁“更好”,而是谁“更合适”:
- 本地开发、小项目、需 .htaccess 重写或复杂 Auth 模块 → 优先 Apache + mod_php
- 生产环境、高并发静态+动态混合、做反向代理或负载均衡 → Nginx + php-fpm 更轻量可控
- Windows 服务器部署 → Apache + TS PHP 最稳妥;Nginx 可用,但 php-fpm 需额外编译或谨慎选用第三方包



















