PHP 体系架构
架构总览
浏览器
↕ HTTP
Nginx(Web 服务)
↕ FastCGI 协议(fastcgi_pass)
PHP-FPM(FastCGI 进程管理器)
↕ PHP 代码执行
PHP Web 应用(Laravel / ThinkPHP 等)
LNMP 架构
LNMP = Linux + Nginx + MySQL + PHP,搭建 PHP 动态网站的经典架构组合。
组件角色
| 组件 | 角色 | 监听端口 |
|---|---|---|
| Linux | 操作系统,提供运行环境 | — |
| Nginx | Web 服务 / 上游代理,接收 HTTP 请求 | 80(HTTP) |
| PHP (php-fpm) | 应用服务器,执行 PHP 代码 | 9000(FastCGI) |
| MySQL (MariaDB) | 数据库,存储数据 | 3306(SQL) |
数据流
浏览器
↕ HTTP(TCP 80)
Nginx
↕ FastCGI 协议(TCP 9000)
php-fpm(内嵌 PHP 解释器)
↕ SQL 协议(TCP 3306)
MySQL(MariaDB)
上下游通信的三段协议
| 段 | 上下游 | 协议 | 说明 |
|---|---|---|---|
| 1 | 浏览器 → Nginx | HTTP | 用户通过浏览器访问 Nginx |
| 2 | Nginx → php-fpm | FastCGI | Nginx 将 PHP 请求转发给 php-fpm |
| 3 | php-fpm → MySQL | SQL | PHP 程序通过 SQL 读写数据库 |
LNMP 的精髓在于 三段上下游 + 三种不同协议,每一层只负责自己擅长的领域。
PHP-FPM
是什么
PHP-FPM(PHP FastCGI Process Manager)是基于 FastCGI 协议实现的进程管理器。它不是协议,而是具体的程序实现。
进程模型
PHP-FPM
├── Master 进程:监听端口/Unix Socket,接收请求,指派 Worker
└── Worker 进程池(多个)
├── Worker 1:嵌入 PHP 解释器,执行 PHP 代码
├── Worker 2:嵌入 PHP 解释器,执行 PHP 代码
└── Worker N:嵌入 PHP 解释器,执行 PHP 代码
- Master:负责监听端口,接收 Web 服务器的请求,分配 Worker
- Worker:每个 Worker 内嵌 PHP 解释器,实际执行 PHP 代码
- 可根据访问压力动态调整 Worker 数量(动态/静态/按需模式)
关键特性
| 特性 | 说明 |
|---|---|
| 动态进程管理 | 根据压力自动创建/销毁 Worker 进程 |
| 平滑重载 | 重载 PHP 配置时不中断现有请求 |
| Unix Socket | 支持 Unix Socket 通信,无需配置 TCP 端口 |
| 状态输出 | 提供详细的状态页和 slow log |
| 502 错误诊断 | 提供更详细的错误信息 |
重要:PHP-FPM 不支持 HTTP 协议,不能直接充当 Web 服务。它只支持 FastCGI 协议,必须搭配 Nginx/Apache 使用。
Nginx 与 FastCGI 的协作
Nginx 本身无法直接与 FastCGI 程序通信,需要启用 ngx_http_fastcgi_module 模块。
基本配置
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}负载均衡配置
upstream php {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_pass php;
fastcgi_index index.php;
include fastcgi.conf;
}PHP 体系数据流
用户请求 example.com/index.php
↓
DNS 解析 → Nginx 接收请求
↓
Nginx 解析 HTTP 协议
├── 静态请求(.html/.css/.png)→ 直接返回文件
└── PHP 动态请求(.php)→ fastcgi_pass 转发
↓
FastCGI 协议(127.0.0.1:9000)
↓
PHP-FPM Master 接收请求
↓
指派 Worker 进程
↓
PHP 解释器执行业务逻辑
↓
返回 HTML 给 Nginx → 返回给浏览器
部署提示
LNMP 部署顺序
php-fpm(先部署,准备 FastCGI 端口)
→ Nginx(配置 fastcgi_pass 转发)
→ MySQL(数据库存储)
→ WordPress(PHP 应用,配置数据库连接)
核心配置要点
Nginx 中转发 PHP 请求的关键配置:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # php-fpm 监听地址
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}| 配置项 | 说明 |
|---|---|
fastcgi_pass 127.0.0.1:9000 | 将 PHP 请求转发给本机 php-fpm(9000 端口) |
fastcgi_param SCRIPT_FILENAME | 告诉 php-fpm 要执行的 PHP 文件完整路径 |
include fastcgi_params | 加载 FastCGI 协议默认参数 |
常见排错
| 错误 | 可能原因 | 排查方法 |
|---|---|---|
| 访问 PHP 页面空白或下载 | Nginx 未正确配置 FastCGI 转发 | 检查 fastcgi_pass 和 fastcgi_param |
| 502 Bad Gateway | php-fpm 未启动或端口不对 | systemctl status php74-php-fpm,检查 9000 端口 |
| 数据库连接失败 | MySQL 未启动或账号错误 | 检查 MySQL 服务状态、账号权限和密码 |
| 无法安装插件/上传图片 | 目录权限不足 | chown -R nginx:nginx /usr/share/nginx/html/wordpress |
| 403 Forbidden | 索引文件缺失或权限不足 | 检查 index.php 是否存在,Nginx 用户有读取权限 |
排错核心思路
- 查端口:
netstat -tlnp | grep 端口号确认服务是否在监听 - 查日志:
/var/log/nginx/error.log、/var/log/php-fpm/等 - 查状态:
systemctl status确认服务运行状态
参见
- Web 应用架构基础 — CGI / FastCGI 协议原理
- 架构对比总结 — PHP vs Python
- Python 体系架构 — WSGI / ASGI / uWSGI
- Nginx — Web 服务器 / 反向代理
- PHP-FPM — 实体页面
- LNMP 架构与部署 — 完整部署流程与排错
- LNMP 部署实操 — WordPress 步进式部署指南