恋之Lnmp

专注 LNMP 架构技术研究与实战分享

LNMP 技术分析文章(点击标题展开全文)

LNMP架构原理详解:各组件通信流程分析

发布时间:2026-08-10 | 分类:LNMP基础

LNMP 是 Linux + Nginx + MySQL + PHP-FPM 的经典 Web 服务架构,是国内 PHP 业务最常用的部署方案。很多初学者容易混淆 Nginx、PHP-FPM 的角色,误以为 Nginx 可以直接解析 PHP 代码,这是理解整个架构最大的误区。

Nginx 本身是静态 Web 服务器,只能处理 html、css、js、图片这类静态文件,**不具备 PHP 代码执行能力**。当用户浏览器请求一个 index.php 文件时,请求流程如下:

  1. 用户发起 HTTP 请求,数据包到达服务器 80 端口,由 Nginx 监听接收;
  2. Nginx 判断后缀为 .php,匹配站点配置中的 fastcgi 规则,不会直接返回文件;
  3. Nginx 通过 Unix Socket 或者 TCP 连接,把请求参数、POST 数据、请求头转发给 PHP-FPM;
  4. PHP-FPM 的主进程管理多个 Worker 子进程,挑选空闲子进程解析并执行 PHP 源码;
  5. PHP 代码执行过程中如果需要读写数据库,会连接 MySQL,查询或写入数据;
  6. PHP 脚本执行完成,把生成的 HTML 文本返回给 Nginx;
  7. Nginx 将最终 HTML 内容封装为 HTTP 响应,传回浏览器。

PHP-FPM 是 PHP 的 FastCGI 进程管理器,负责维护进程池,避免每次请求都重新创建 PHP 进程带来巨大开销。Socket 通信分为两种:Unix 域套接字,速度更快,适合单机;TCP 方式支持 Nginx 和 PHP 分离部署,适合分布式场景。

理解这套链路,是排查 502 Bad Gateway、504 超时、请求卡死等 LNMP 常见故障的基础。502 大多代表 Nginx 无法连接 PHP-FPM;504 一般是 PHP 脚本执行超时没有返回结果。

PHP-FPM参数调优:LNMP高并发场景实践

发布时间:2026-08-18 | 分类:性能调优

PHP-FPM 的进程参数是 LNMP 性能调优核心,参数设置不合理会出现内存持续上涨、服务器 OOM 杀进程、高并发下大量请求排队等问题。PHP-FPM 支持三种进程管理模式:static、dynamic、ondemand。

static 静态模式:一次性创建固定数量子进程,由 pm.max_children 控制。优点是并发响应稳定,不需要动态创建进程;缺点是进程常驻,占用固定内存,小内存服务器不推荐。

dynamic 动态模式:默认常用模式。pm.start_servers 为启动时初始进程数;pm.min_spare_servers 最小空闲进程;pm.max_spare_servers 最大空闲进程。空闲进程低于最小值就新建,高于最大值就回收。适合大多数中小型业务。

ondemand 按需模式:服务启动不创建进程,有请求才创建,空闲一段时间自动销毁。适合低访问量、节省内存的站点,缺点是突发流量会有进程创建延迟。

最关键参数 pm.max_children 的估算方法:先查看单个 PHP 进程平均占用内存,假设单个进程占用 40MB,服务器分配给 PHP-FPM 的内存为 2GB,则 max_children ≈ 2048 / 40 ≈ 50。**切记不能设置过大,否则会耗尽系统内存触发OOM**。

另外两个重要参数:pm.max_requests,子进程处理多少请求后自动重启,用来解决PHP内存泄漏;request_terminate_timeout,脚本最长执行时间,防止卡死进程一直占用资源。线上业务建议开启慢请求日志,记录执行缓慢的PHP脚本,定位性能瓶颈。

Nginx反向代理与缓存策略在LNMP中的应用

发布时间:2026-08-25 | 分类:Nginx

Nginx 在 LNMP 架构中,除了作为入口 Web 服务器分发 PHP 请求,反向代理与缓存是提升网站并发能力最有效的手段。缓存分为静态资源缓存和 FastCGI 页面缓存。

静态资源缓存:图片、JS、CSS、字体文件这类内容很少变动,可以设置 expires 头,让浏览器本地缓存,减少重复请求。同时 Nginx 开启 sendfile 和 tcp_nopush,提升文件读取发送效率。静态资源请求完全不经过PHP和数据库,对服务器压力极小。

FastCGI Cache 是页面级缓存,Nginx 把 PHP-FPM 返回的页面结果缓存到磁盘。当相同请求再次到达,Nginx 直接返回缓存页面,不再调用 PHP,也不查询 MySQL,可以大幅度降低服务器压力。适合内容更新不频繁的博客、文档站点。

FastCGI Cache 使用时需要注意缓存 key 设计,区分不同用户、不同 Cookie;同时要设置缓存失效时间,还要提供手动清理缓存的方案。登录页面、提交表单、后台管理页面不能开启页面缓存,否则会出现用户串号、数据错乱。

反向代理还可以实现负载均衡,当有多台 PHP-FPM 后端服务器时,Nginx 作为入口分发流量。支持轮询、权重、ip_hash 等策略。ip_hash 可以保证同一个用户请求始终落到同一台后端,适合需要会话保持的场景。

生产环境配置缓存,一定要做好测试,避免把动态敏感页面缓存。同时监控 Nginx 缓存命中率,命中率越高,代表缓存效果越好。

LNMP环境MySQL索引优化与慢查询排查

发布时间:2026-09-01 | 分类:MySQL

很多 LNMP 项目性能瓶颈不在 Nginx 和 PHP,而是数据库。随着数据量增长,SQL 查询缓慢会拖慢整个页面响应,甚至造成 PHP-FPM 进程堆积,出现网站卡顿。慢查询日志是定位数据库问题的首要工具。

开启 MySQL 慢查询日志,可以记录执行时间超过指定阈值的 SQL 语句,一般设置阈值 1 秒。日志会记录 SQL、执行耗时、扫描行数,方便找到耗资源语句。拿到慢 SQL 之后,使用 explain 查看执行计划,分析索引使用情况。

MySQL InnoDB 使用 B+树索引。最常见错误:没有建立合适索引,导致全表扫描(type=ALL)。还有索引失效场景:索引字段使用函数、隐式类型转换、like %开头模糊查询、or 连接没有索引字段,都会放弃索引走全表扫描。

联合索引遵循最左前缀原则。建立联合索引(a,b,c),where a=1、where a=1 and b=2、where a=1 and b=2 and c=3 都可以命中索引;where b=2 无法命中。设计联合索引,把区分度高、经常作为查询条件的字段放在前面。

LNMP 业务开发中,PHP 代码也要注意:不要在循环内部执行 SQL,尽量使用 IN 或者关联查询一次性取出数据;避免 select *,只查询业务需要字段,减少 IO 和内存开销;大表分页不要使用 offset 大偏移量,可以用主键分页优化。

索引不是越多越好,索引会加快查询,但新增、更新、删除数据时需要维护索引,降低写入性能。频繁写入的表,索引数量需要控制。

LNMP安全加固:防注入、防盗链与权限最佳实践

发布时间:2026-09-06 | 分类:服务器安全

公网暴露的 LNMP 服务器,会持续受到扫描器探测、SQL注入、文件上传攻击、目录遍历等风险。一套完整的安全加固方案,需要从 Linux 系统、Nginx、PHP、MySQL 多层防护。

PHP 层面加固:php.ini 禁用危险函数,如 system、exec、shell_exec、passthru 等,防止一句话木马执行系统命令;关闭 allow_url_include,防止远程文件包含漏洞;限制上传文件大小,严格校验上传文件后缀和文件头,上传目录禁止执行 PHP。很多网站被入侵都是上传漏洞导致。

Nginx 安全配置:关闭目录浏览 autoindex;限制站点目录访问权限;配置防盗链,防止静态资源被其他网站盗刷流量;拦截恶意请求、异常User-Agent;限制单个IP请求频率,缓解CC攻击。Nginx 禁止直接访问 .env、.sql、.bak、.git 这类敏感备份文件。

MySQL 安全:数据库账号不要使用 root 对外业务连接,新建专用业务账号,只分配必要权限,禁止 drop、alter 高危权限;不要把数据库密码硬编码在代码里;禁止数据库公网直接开放,只允许本机或内网IP访问;定期备份数据库。

Linux 系统层面:使用普通用户运行网站程序,不要用 root 跑 Nginx/PHP-FPM;服务器SSH禁止密码登录,改用密钥登录;修改默认SSH端口;安装防火墙,只开放必要端口;定期更新系统补丁。

代码层面防护SQL注入:优先使用PHP PDO预处理语句,参数绑定,不要直接拼接SQL字符串;对用户输入做过滤、转义。任何用户提交的数据都不能信任,这是web安全最核心原则。

安全是多层防御,单一防护手段容易被绕过。日常要定期备份网站文件与数据库,一旦被入侵,可以快速恢复业务。

关于恋之博客

本站为技术分享博客,持续更新LNMP架构、服务器运维、PHP开发相关技术文章,记录学习过程中遇到的问题与解决方案。