温馨提示×

Ubuntu LNMP如何实现高并发处理

小樊
42
2025-12-26 01:49:56
栏目: 智能运维

Ubuntu LNMP高并发处理实战方案

一 架构与容量规划

  • 入口与高可用:使用 Nginx + Keepalived VIP 做双机主备,统一对外入口,故障时自动切换,保障高可用与横向扩展能力。
  • 静态资源减负:将 图片/CSS/JS 等通过 CDNNginx 强缓存 处理,动态请求再回源到 PHP,显著降低后端压力。
  • 文件上传治理:用户上传建议采用 前端直传 OSS/MinIO,后端仅返回签名 URL 或做回调处理,避免本地磁盘与带宽成为瓶颈。
  • 数据库读写分离:主库写、从库读,降低单库连接与锁竞争,提升查询吞吐。
  • 缓存与异步:热点数据走 Redis/Memcached,耗时任务(发短信、生成报表)走 消息队列(RabbitMQ/Kafka) 异步化,缩短请求链路。
  • 网关层优化:对鉴权、限流、路由、日志统一在 OpenResty 层处理,利用其 LuaJIT + 全异步 I/O 提升吞吐与稳定性。
  • 监控告警:接入 Prometheus + Grafana 监控 QPS、延迟、错误率、连接数、慢查询等关键指标,结合阈值告警。

二 Nginx与系统内核优化

  • 进程与连接:设置 worker_processes auto(通常等于 CPU 核数),worker_connections 16384+;events 使用 epoll;在 events/http 层设置 use epoll; multi_accept on;
  • 文件句柄:提升系统 ulimit -n 与 Nginx worker_rlimit_nofile(如 65535),并同步调整内核 fs.file-max,避免 “too many open files”。
  • 内核网络:提升 net.core.somaxconnnet.ipv4.tcp_max_syn_backlognet.core.netdev_max_backlog;开启 net.ipv4.tcp_tw_reuse、合理设置 net.ipv4.tcp_fin_timeoutnet.ipv4.ip_local_port_range,加速连接复用与回收。
  • 静态与压缩:开启 gzip on; gzip_types text/css application/javascript application/json;对静态资源设置 expires 1y; add_header Cache-Control “public, immutable”;
  • 连接复用:开启 keepalive,如 keepalive_timeout 60; keepalive_requests 10000;;开启 open_file_cache 减少文件元数据开销。
  • 典型计算:单机理论并发 ≈ worker_processes × worker_connections;例如 8 × 16384 ≈ 131072(仍需结合内存与后端能力调优)。

三 PHP-FPM与数据库优化

  • PHP-FPM 进程池:采用 pm = dynamic,结合内存与压测调优 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers;优先使用 Unix Socketlisten.backlog 提升并发接入;启用 request_terminate_timeoutslowlog 快速定位长请求。
  • 字节码缓存:启用 OPcache,如 opcache.enable=1; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=100000; opcache.validate_timestamps=0(生产)
  • 代码与查询:精简逻辑、减少循环与递归;避免 N+1 查询,合理使用 索引批量操作;对外部调用设置 超时与降级
  • MySQL:将 innodb_buffer_pool_size 设为物理内存的 60%–70%;合理提升 max_connections 并优化 thread_cache_size;主从复制与读写分离分担压力;定期分析与优化慢查询。
  • 连接治理:应用侧使用 持久连接/连接池,避免频繁建连;对热点数据使用 Redis/Memcached 缓存,减少数据库直接访问。

四 缓存、异步与网关层优化

  • 多级缓存:采用 本地内存 L1(如 shared dict)+ Redis L2 + 回源到 PHP 的多级缓存策略,显著降低回源 QPS 与数据库压力。
  • 分布式限流:在 OpenRestyresty.limit.req 实现 令牌桶 限流,按 接口/租户/IP 维度控制速率,过载时快速失败与排队。
  • 鉴权与路由:在网关统一做 JWT 校验路由分发灰度/AB请求改写,减少业务代码重复与后端耦合。
  • 日志与观测:输出 JSON 访问日志,接入 Prometheus + Grafana 与链路追踪,便于容量评估与瓶颈定位。
  • 压测与容量:用 wrk/ab 进行基线压测,逐步调大 worker_connections / pm.max_children / innodb_buffer_pool_size,观察 P95/P99 延迟、错误率、CPU/内存/连接数,以压测结果反推配置。

五 一键落地清单与关键配置示例

  • Ubuntu 基础与高可用
    • 安装组件:sudo apt update && sudo apt install nginx php8.1-fpm php8.1-mysql php8.1-curl php8.1-xml -y
    • PHP-FPM 监听 Unix Socket:/etc/php/8.1/fpm/pool.d/www.conf 中设置 listen = /run/php/php8.1-fpm.sock
    • Keepalived VIP:MASTER priority 100,BACKUP priority 90virtual_ipaddress { 10.10.0.100/24 },健康检查脚本 systemctl is-active --quiet nginx
  • Nginx 关键配置片段
    • 进程与连接
      worker_processes auto;
      worker_rlimit_nofile 65535;
      events {
          use epoll;
          worker_connections 16384;
          multi_accept on;
      }
      
    • 静态资源缓存
      location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
          expires 1y;
          add_header Cache-Control "public, immutable";
      }
      
    • FastCGI 与压缩
      gzip on;
      gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
      
      location ~ \.php$ {
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_pass unix:/run/php/php8.1-fpm.sock;
          fastcgi_read_timeout 120s;
      }
      
  • 内核参数关键项(/etc/sysctl.conf)
    net.core.somaxconn = 32768
    net.ipv4.tcp_max_syn_backlog = 65536
    net.core.netdev_max_backlog = 32768
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.ip_local_port_range = 1024 65535
    fs.file-max = 2097152
    
    应用:sudo sysctl -p
  • 文件句柄与 PHP-FPM
    • limits.conf:* soft nofile 65535* hard nofile 65535
    • PHP-FPM(示例):pm = dynamicpm.max_children = 128pm.start_servers = 16pm.min_spare_servers = 16pm.max_spare_servers = 64listen.backlog = 4096
  • 压测与容量评估
    • 基线测试:wrk -t12 -c4000 -d60s http://10.10.0.100/
    • 观察指标:QPS、P95/P99 延迟、502/504 错误率、Nginx 与 PHP-FPM 进程/连接数、MySQL 活跃连接与慢查询,按结果逐步调优上述参数。

0