怎样优化centos lnmp性能
小樊
34
2025-12-09 19:20:37
CentOS 上 LNMP 性能优化实操指南
一 系统层优化
- 提升文件句柄与进程上限:在 /etc/security/limits.conf 增加“* soft/hard nofile 65535”,并在 systemd 服务单元中设置 LimitNOFILE=65535,保证 Nginx/PHP-FPM 能打开足够多的连接与文件描述符。临时可用 ulimit -n 验证。
- 内核网络与队列:提高连接队列与回收效率,/etc/sysctl.conf 加入 net.core.somaxconn=65535、net.core.netdev_max_backlog=65535、net.ipv4.tcp_max_syn_backlog=65535、net.ipv4.tcp_fin_timeout=10、net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_keepalive_time=120 等,执行 sysctl -p 生效。
- 存储与调度:优先使用 SSD/NVMe;如为 SSD,可将 I/O 调度器设为 noop/noop(或 mq-deadline),减少调度开销。
- 内存与交换:适度降低 vm.swappiness(如 10),避免频繁 swap;确保数据库与缓存优先驻留内存。
二 Nginx 优化
- 并发与进程模型:worker_processes 设为 auto/CPU 核心数;events 使用 epoll;worker_connections 结合内存与压测逐步调大(如 16384/32768);可按需开启 worker_cpu_affinity 做亲和;设置 worker_rlimit_nofile 与系统一致。
- 传输与压缩:开启 sendfile on、tcp_nopush on、tcp_nodelay on;启用 gzip 并指定压缩类型(text/css/js/xml/json 等);静态资源设置长 Cache-Control(如 expires 30d)。
- 连接与超时:开启 keepalive(如 keepalive_timeout 65、keepalive_requests 100);按需调整 client_header_timeout、client_body_timeout、send_timeout。
- 日志与观测:定义包含 $request_time/$upstream_response_time 的日志格式;可用 map 将慢请求(如 >1s)单独记录到慢日志,便于定位瓶颈。
- 可选加速:启用 Brotli(nginx-brotli 模块)或 ngx_pagespeed 做前端优化(需额外模块编译)。
三 MySQL MariaDB 优化
- 内存与缓冲:将 innodb_buffer_pool_size 设为物理内存的 50%–80%(专用库可更高);innodb_log_file_size 设为 128M–512M;按负载调整 max_connections。
- 刷盘策略:权衡一致性与性能设置 innodb_flush_log_at_trx_commit(1 为最安全,0/2 性能更高但持久性降低);sync_binlog 设为 1 提升复制/崩溃恢复安全性(写放大更高)。
- I/O 能力:SSD 将 innodb_io_capacity 提升到 5000–20000;合理设置 innodb_flush_method=O_DIRECT 减少双缓冲。
- 连接与会话:适度增大 max_connections,并相应降低 interactive_timeout/wait_timeout,避免连接风暴与恢复缓慢。
- 维护与索引:为高频查询条件建立合适索引、覆盖索引;定期执行 ANALYZE/OPTIMIZE TABLE;使用 MySQLTuner/Percona Toolkit 持续体检;必要时引入 Redis/Memcached 做查询/页面缓存。
四 PHP 与 PHP-FPM 优化
- 启用与调优 OPcache:在 php.ini 开启 opcache,建议 memory_consumption=128–256M、interned_strings_buffer=8–16、max_accelerated_files=20000、validate_timestamps=1、revalidate_freq=60,显著提升脚本执行性能。
- PHP-FPM 进程模型:采用 dynamic,按内存与压测设置 pm.max_children、pm.start_servers、pm.min/max_spare_servers;开启 request_slowlog_timeout=1s 记录慢脚本;设置 rlimit_files=65535。
- 运行与资源:合理设置 memory_limit(如 128–256M)、max_execution_time、post_max_size、upload_max_filesize;生产环境关闭 display_errors,开启 log_errors。
- 数据与耗时优化:优先使用 持久连接/连接池;对热点数据用 Redis/Memcached 缓存;用 EXPLAIN 分析慢 SQL;借助 Xdebug/Blackfire 做性能剖析与瓶颈定位。
五 压测与监控闭环
- 压测方法:先用 ab/wrk/siege 做基线测试(如 ab -kc 1000 -n 10000),逐步增加并发,观察 RT、RPS、错误率、带宽、CPU/内存/磁盘 IO 与 502/504 比例,避免一次性上大并发。
- 观测指标:Nginx 记录 $request_time/$upstream_response_time 与慢日志;PHP-FPM 关注 slowlog 与进程占用;MySQL 关注 Threads_connected、Innodb_buffer_pool_reads/hits、Slow_queries。
- 动态调参:按压测结果逐步调整 worker_connections、pm.max_children、innodb_buffer_pool_size 等关键参数,每次只变更一个变量并留出观察窗口。
- 工具链:使用 Prometheus + Grafana 做可视化监控,结合 MySQLTuner/Percona Toolkit 定期体检与建议。