“Linux + LNMP 慢”是一个很常见但原因很分散的问题。LNMP 指 Linux + Nginx + MySQL/MariaDB + PHP,任何一层都可能成为瓶颈。下面按常见原因 → 排查方法 → 解决建议系统说明。
常见问题:
worker_processes 太低worker_connections 太小sendfile / tcp_nopush✅ 检查:
ps aux | grep nginx
ulimit -n
✅ 建议:
worker_processes auto;
worker_connections 10240;
sendfile on;
tcp_nopush on;
例如:
.js、.css、图片也进了 PHPlocation 精确匹配✅ 建议:
location ~* \.(js|css|png|jpg|gif)$ {
expires 30d;
}
表现:
502 或响应时间陡增✅ 检查:
ps aux | grep php-fpm
✅ 关键参数(www.conf):
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
⚠️ pm.max_children 太小是最常见慢因
file_get_contents() 访问外网✅ 排查:
php -m
使用:
PHP 每次都重新编译脚本。
✅ 检查:
php -i | grep opcache
✅ 开启:
opcache.enable=1
opcache.memory_consumption=128
opcache.revalidate_freq=60
表现:
✅ 检查:
SHOW PROCESSLIST;
✅ 开启慢日志:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
✅ 用 EXPLAIN 分析 SQL
典型:
WHERE user_id = ?
ORDER BY created_at
没建联合索引。
例如:
innodb_buffer_pool_size 太小✅ 建议(2G内存示例):
innodb_buffer_pool_size = 1G
✅ 查看:
top
free -h
✅ 检查:
iostat -x 1
PHP 中:
gethostbyname()
mail()
✅ 解决:
✅ 建议:
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
✅ 建议:
listen 443 ssl http2;
# 1. 系统负载
top
# 2. 内存
free -h
# 3. PHP-FPM
ps aux | grep php-fpm
# 4. MySQL
mysql> SHOW PROCESSLIST;
# 5. Nginx 日志
tail -f /var/log/nginx/access.log
你可以补充:
我可以直接帮你定位是哪一层慢。