LNMP如何处理并发
导读:LNMP并发处理的核心思路 通过分层优化提升吞吐与稳定性:前端用 Nginx 承载与连接管理,应用层用 PHP-FPM 多进程/多池承载动态请求,数据层用 MySQL 缓冲与索引/主从分担,配合 缓存(Redis/Memcached) 与...
LNMP并发处理的核心思路
- 通过分层优化提升吞吐与稳定性:前端用 Nginx 承载与连接管理,应用层用 PHP-FPM 多进程/多池承载动态请求,数据层用 MySQL 缓冲与索引/主从分担,配合 缓存(Redis/Memcached) 与 异步队列 削峰填谷,外层用 CDN 与 Nginx 负载均衡 扩展横向能力,最后以限流/降级保护系统不被突发流量击垮。
关键配置与落地参数
- Nginx
- 进程与连接:设置 worker_processes auto(通常等于CPU核心数);提升 worker_connections(如 1024 或更高);开启 use epoll(Linux 2.6+);放宽 worker_rlimit_nofile(如 65535)。
- 长连接与复用:配置 keepalive_timeout 65; keepalive_requests 100; 减少握手开销。
- 静态资源与压缩:对图片/CSS/JS 设置 expires 30d; add_header Cache-Control “public”; ;开启 gzip 降低传输体积。
- 反向代理缓存:配置 proxy_cache_path … keys_zone=my_cache:10m max_size=1g;在 location 中启用 proxy_cache。
- 负载均衡:使用 upstream backend { server … } + proxy_pass 分发到多台后端。
- PHP-FPM
- 进程模型:建议 pm = dynamic;根据内存与压测调 pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers(如 50/5/5/35 作为起点)。
- 执行与内存:合理设置 memory_limit、max_execution_time,避免长脚本阻塞。
- 多池隔离:按业务或接口拆分 多个 pool,避免相互影响。
- MySQL
- 缓冲与连接:设置 innodb_buffer_pool_size ≈ 物理内存的 70%(以实例总内存为基准);按负载调 max_connections。
- 查询与结构:强制使用索引、避免 *SELECT ,用 EXPLAIN 分析慢查询;必要时做主从复制分担读压力。
- 系统与内核
- 文件描述符:提升 ulimit -n 65535 与 worker_rlimit_nofile 一致。
- 网络与端口:net.core.somaxconn 65535、net.ipv4.tcp_max_syn_backlog 65535、net.ipv4.ip_local_port_range 1024 65535;开启 net.ipv4.tcp_tw_reuse=1 加速端口复用。
- 缓存与异步
- 引入 Redis/Memcached 做页面/数据缓存;将耗时任务(发邮件、生成报表)放入消息队列异步处理。
- 监控与压测
- 监控:Prometheus + Grafana、Zabbix、Nagios;日志:ELK。
- 自检:启用 Nginx stub_status 观察 Active/Reading/Writing/Waiting;MySQL 关注 Threads_connected、Slow_queries、processlist;压测用 wrk 等工具验证调优成效。
并发瓶颈定位与优化顺序
- 监控先行:同时观察 CPU/内存/负载、连接数、磁盘 IO、Nginx 状态、MySQL 连接与慢查询,用数据确定瓶颈层。
- 分层排查与优化
- 连接瓶颈:若 active connections 常触顶,先提升 worker_connections / worker_rlimit_nofile / somaxconn,并优化 keepalive 与长连接复用。
- 应用瓶颈:若 PHP-FPM 队列堆积,适度增加 max_children 或拆分 多 pool;同时优化代码与 SQL,减少阻塞。
- 数据瓶颈:若 Threads_connected 高且慢查询多,补齐索引、优化 SQL、考虑读写分离与连接池。
- 外部依赖:静态资源上 CDN,动态请求做 缓存 与 异步,避免同步依赖放大峰值。
- 压测闭环:每次调参后用 wrk 复测(如并发从 200→2000 逐步加压),以 P95/P99 延迟、超时率、RPS 为验收指标,确认优化收益。
快速配置示例
- Nginx 并发与缓存
- 进程与连接
worker_processes auto; worker_rlimit_nofile 65535; events { use epoll; worker_connections 10240; } http { keepalive_timeout 65; keepalive_requests 100; gzip on; } - 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public"; } - 反向代理缓存与负载均衡
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; upstream backend { server 10.0.0.11:9000; server 10.0.0.12:9000; server 10.0.0.13:9000; } server { location / { proxy_cache my_cache; proxy_pass http://backend; } }
- 进程与连接
- PHP-FPM 动态进程池
[www] pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 - 系统内核与文件句柄
ulimit -n 65535 sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -w net.ipv4.tcp_tw_reuse=1 - 监控自检
- Nginx 状态页
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } - 压测示例
wrk -t4 -c100 -d60s --latency http://your-domain/index.php
- Nginx 状态页
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: LNMP如何处理并发
本文地址: https://pptw.com/jishu/756987.html
