LNMP 架构与部署 — 上下游协议、CGI 演进、完整部署流程
概述
Day38 是 Web 应用层的实操篇,围绕 LNMP 架构(Linux + Nginx + MySQL + PHP)展开。核心脉络:上下游协议一致性原则 → LNMP 组件角色 → 静态到动态网页的演进 → CGI/FastCGI/php-fpm 的诞生逻辑 → Web 框架概念 → 完整 LNMP 部署流程(php-fpm → Nginx → MySQL → WordPress)→ 常见排错。
核心内容
上下游对接原则
集群架构中,上下游通信的核心原则:上下游不用管具体是什么软件,只要通信协议能对上就可以。 上游用什么协议封装,下游就必须用什么协议解封。
Nginx 作为上游代理支持的三种协议:
| 协议 | 转发指令 | 下游服务 |
|---|---|---|
| HTTP | proxy_pass http://地址:端口 | HTTP 服务器(Tomcat、uWSGI、Go 等) |
| FastCGI | fastcgi_pass 地址:端口 | php-fpm(PHP 专用) |
| uWSGI | uwsgi_pass 地址:端口 | uWSGI 服务(Python 专用) |
LNMP 架构
LNMP = Linux + Nginx + MySQL + PHP,搭建 PHP 动态网站的经典组合。
浏览器 → (HTTP) → Nginx → (FastCGI) → php-fpm → (SQL) → MySQL
| 上下游 | 协议 | 说明 |
|---|---|---|
| 浏览器 → Nginx | HTTP | Nginx 监听 80 端口 |
| Nginx → php-fpm | FastCGI | PHP 请求由 Nginx 转发 |
| php-fpm → MySQL | SQL | PHP 程序读写数据库 |
CGI 协议演进
静态网页时代:Nginx 直接返回 HTML/CSS/图片文件,无后端逻辑。
动态网页时代:需处理登录、支付、查询等功能,后端脚本既要解析 HTTP 又要写业务逻辑,开发效率低。
CGI(Common Gateway Interface):定义 Web 服务器与后端脚本之间的数据传递标准,将 HTTP 协议解析和业务逻辑分离。
CGI 的缺点:每次请求新建进程,处理完后销毁,高并发下性能堪忧。
FastCGI:仍是 CGI 协议,但核心改进是常驻进程——处理完请求不关闭,可继续处理下一个,避免进程创建/销毁开销。
php-fpm:FastCGI 协议的具体实现。对外暴露 FastCGI 端口(默认 9000),Nginx 通过 FastCGI 协议与之通信。php-fpm 与 PHP 程序之间不走任何协议,直接是本地调用。
Web 框架
Web 框架将开发中的重复性代码提取出来,帮开发者搭好应用基本架子,开发者只需填充业务逻辑。类比:框架搭好房子骨架(地基、承重墙),开发者做内部装修。
常见框架:PHP(Laravel、ThinkPHP)、Python(Django、Flask)、Java(Spring Boot)。
LNMP 部署流程
主机规划:CentOS 7 / RHEL 7,Nginx(80 端口)、php-fpm(9000 端口)、MariaDB(MySQL)、WordPress。
步骤概览:
- 环境准备:关闭 SELinux、firewalld,配置静态 IP 和时间同步
- 部署 php-fpm:
- 添加 EPEL 和 Remi 仓库
yum install php74-php-gd php74-php-pdo php74-php-mbstring php74-php-cli php74-php-fpm php74-php-mysqlnd- 启动 php-fpm,默认监听
127.0.0.1:9000
- 部署 Nginx:通过 EPEL 源安装
nginx,启动服务 - 配置 Nginx FastCGI 转发:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}- 验证 PHP:创建
phpinfo()测试页,浏览器访问验证 - 部署 MySQL:安装 MariaDB,启动服务
- 初始化数据库:创建 WordPress 库和用户
- 部署 WordPress:下载解压,配置
wp-config.php(DB_NAME、DB_USER、DB_PASSWORD、DB_HOST) - 完成安装:修改目录权限为
nginx:nginx,浏览器访问安装向导
常见排错
| 错误 | 可能原因 | 排查方法 |
|---|---|---|
| 访问 PHP 页面空白或下载 | Nginx 未正确配置 FastCGI 转发 | 检查 fastcgi_pass 和 fastcgi_param |
| 502 Bad Gateway | php-fpm 未启动或端口不对 | systemctl status php74-php-fpm,检查 9000 端口 |
| 数据库连接失败 | MySQL 未启动或账号错误 | 检查 MySQL 服务状态和账号权限 |
| 无法安装插件/上传图片 | 目录权限不足 | chown -R nginx:nginx |
| 403 Forbidden | 索引文件缺失或权限不足 | 检查 index.php 是否存在 |