温馨提示×

LNMP如何实现高并发

小樊
35
2025-12-21 23:15:04
栏目: 编程语言

LNMP高并发优化与落地方案

一 架构与容量规划

  • 分层解耦:前端用 Nginx 承载静态资源与反向代理,动态请求转发到 PHP-FPM;数据库采用 MySQL 主从读写分离;文件上传建议直传到 OSS/MinIO,避免本地磁盘成为瓶颈与单点。
  • 入口高可用:两台 Nginx 节点配合 Keepalived VIP 实现故障自动切换,保证入口稳定。
  • 容量基线:以“并发连接数 ≈ worker_processes × worker_connections”估算,结合业务 RT(响应时间)峰值QPS 规划进程/连接与后端池大小;静态资源占比高的场景优先上 CDN
  • 典型实践:混合流量(约80%静态 + 20%动态)的站点,通过 Nginx 静态资源服务 + PHP-FPM 动态处理 + MySQL 读写分离 + OSS 直传,可稳定支撑 5,000+ QPS

二 Nginx与静态资源优化

  • 并发模型:设置 worker_processes auto(通常等于CPU核心数);启用 epoll;每个进程连接数 worker_connections(如 1024/更高);放宽 worker_rlimit_nofile(如 65535)。
  • 长连接:开启 keepalive(如 keepalive_timeout 65;upstream keepalive 32/64),复用后端连接,降低握手开销。
  • 静态资源:对图片/CSS/JS 设置 expires 30dCache-Control: public;启用 gzip 压缩减少传输体积。
  • 缓存加速:启用 proxy_cache 缓存反向代理结果;对纯静态站点可使用 FastCGI/Cache(如 fastcgi_cache)进一步降低 PHP 压力。

三 PHP与数据库优化

  • PHP-FPM:启用 OPcache(如 memory_consumption=128、interned_strings_buffer=8、max_accelerated_files=4000);进程池用 dynamic,合理设置 pm.max_children / start_servers / min_spare_servers / max_spare_servers;与 Nginx 通信优先 Unix Socket(性能优于 TCP)。
  • 数据库:将 innodb_buffer_pool_size 调至物理内存的较大比例(如约70%);合理提升 max_connections;建立有效索引、避免 SELECT *、用 EXPLAIN 分析慢查询;部署 主从复制 做读写分离,必要时引入中间件简化路由。
  • 连接治理:启用 连接池/长连接 与超时控制,减少频繁建连开销;对耗时任务采用 消息队列(RabbitMQ/Kafka) 异步化,避免阻塞请求线程。

四 系统与网络调优

  • 文件句柄与进程限制:提升 ulimit -n(如 65535),Nginx 设置 worker_rlimit_nofile 与之匹配。
  • 内核网络:调大 net.core.somaxconn(如 65535)、net.ipv4.tcp_max_syn_backlog(如 65535)、开启 net.ipv4.tcp_tw_reuse,扩大 net.ipv4.ip_local_port_range(如 1024–65535),提升并发建连与端口复用能力。
  • 存储与内存:优先 SSD/NVMe;适度降低 vm.swappiness,减少换页;确保数据库与缓存热点数据可装入内存。

五 流量治理与压测监控

  • 流量治理:对外接口配置 限流(如基于 IP/接口/用户等级的速率限制),高负载时启用 服务降级/熔断,保障核心链路稳定。
  • 监控告警:建设 Prometheus + Grafana 监控面板,跟踪 QPS、RT、5xx、连接数、慢查询、缓存命中率 等;日志接入 ELK 做检索与问题定位。
  • 压测方法:使用 webbench、ab、wrk 等工具进行基线压测,结合 top、free、iostat、sar -n DEV 定位 CPU、内存、IO、网络瓶颈,按指标回滚与迭代参数。

0