LNMP(Linux + Nginx + MySQL/MariaDB + PHP)性能优化是一个系统工程,需要从操作系统、Nginx、PHP、MySQL、缓存、代码等多个层面入手。下面给你一套实战向、可落地的优化思路,从基础到进阶。
ulimit -n
建议设置为:
* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf)net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
vm.swappiness = 10
执行:
sysctl -p
systemctl disable firewalld --now # 有云安全组可关
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
use epoll;
}
keepalive_timeout 65;
client_max_body_size 50m;
client_body_buffer_size 128k;
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/css application/javascript application/json;
location ~* \.(js|css|png|jpg|gif|ico|woff2)$ {
expires 30d;
access_log off;
}
access_log off;
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
建议:
pm = staticdynamicmemory_limit = 256M
max_execution_time = 30
upload_max_filesize = 50M
post_max_size = 50M
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
innodb_buffer_pool_size = 60% 内存
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
max_connections = 500
wait_timeout = 60
interactive_timeout = 60
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
$redis->get('user:1');
proxy_cache_path /data/cache levels=1:2 keys_zone=phpcache:100m inactive=60m;
✅ 减少数据库查询
✅ 使用 索引
✅ 避免 SELECT *
✅ 减少循环内 SQL
✅ 使用批量操作
ab -n 10000 -c 200 http://example.com/
wrk -t4 -c200 -d30s http://example.com/
| 现象 | 原因 |
|---|---|
| CPU 100% | PHP 计算重 |
| 内存不足 | FPM 进程过多 |
| 磁盘 IO 高 | MySQL 未缓存 |
| 并发上不去 | Nginx/FPM 配置 |
4核8G服务器
你可以直接告诉我:
我可以给你一套完全定制的 LNMP 优化方案。