LNMP 架构与部署 — 上下游协议、CGI 演进、完整部署流程

概述

Day38 是 Web 应用层的实操篇,围绕 LNMP 架构(Linux + Nginx + MySQL + PHP)展开。核心脉络:上下游协议一致性原则 → LNMP 组件角色 → 静态到动态网页的演进 → CGI/FastCGI/php-fpm 的诞生逻辑 → Web 框架概念 → 完整 LNMP 部署流程(php-fpm → Nginx → MySQL → WordPress)→ 常见排错。

核心内容

上下游对接原则

集群架构中,上下游通信的核心原则:上下游不用管具体是什么软件,只要通信协议能对上就可以。 上游用什么协议封装,下游就必须用什么协议解封。

Nginx 作为上游代理支持的三种协议:

协议转发指令下游服务
HTTPproxy_pass http://地址:端口HTTP 服务器(Tomcat、uWSGI、Go 等)
FastCGIfastcgi_pass 地址:端口php-fpm(PHP 专用)
uWSGIuwsgi_pass 地址:端口uWSGI 服务(Python 专用)

LNMP 架构

LNMP = Linux + Nginx + MySQL + PHP,搭建 PHP 动态网站的经典组合。

浏览器 → (HTTP) → Nginx → (FastCGI) → php-fpm → (SQL) → MySQL
上下游协议说明
浏览器 → NginxHTTPNginx 监听 80 端口
Nginx → php-fpmFastCGIPHP 请求由 Nginx 转发
php-fpm → MySQLSQLPHP 程序读写数据库

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。

步骤概览

  1. 环境准备:关闭 SELinux、firewalld,配置静态 IP 和时间同步
  2. 部署 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
  3. 部署 Nginx:通过 EPEL 源安装 nginx,启动服务
  4. 配置 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;
    }
}
  1. 验证 PHP:创建 phpinfo() 测试页,浏览器访问验证
  2. 部署 MySQL:安装 MariaDB,启动服务
  3. 初始化数据库:创建 WordPress 库和用户
  4. 部署 WordPress:下载解压,配置 wp-config.php(DB_NAME、DB_USER、DB_PASSWORD、DB_HOST)
  5. 完成安装:修改目录权限为 nginx:nginx,浏览器访问安装向导

常见排错

错误可能原因排查方法
访问 PHP 页面空白或下载Nginx 未正确配置 FastCGI 转发检查 fastcgi_passfastcgi_param
502 Bad Gatewayphp-fpm 未启动或端口不对systemctl status php74-php-fpm,检查 9000 端口
数据库连接失败MySQL 未启动或账号错误检查 MySQL 服务状态和账号权限
无法安装插件/上传图片目录权限不足chown -R nginx:nginx
403 Forbidden索引文件缺失或权限不足检查 index.php 是否存在

交叉引用