<!DOCTYPE html>
一、先看监控,别盲猜
做运维这几年,见过太多服务器"带不动"的情况——网站卡、数据库慢、CPU动不动就跑满。其实很多时候不是硬件不行,是没调好。今天把我这些年沉淀下来的实战优化经验整理出来,覆盖Linux系统层面、Web服务、数据库和缓存四大块,保证全是真实生产环境验证过的招。
动手之前先搞清楚瓶颈在哪。上来就改内核参数属于瞎干。
用top和htop看CPU占用:
top -c
htop
按M按内存占用排序,按P按CPU排序,几秒钟就能定位哪个进程在搞事。
用iostat看磁盘IO:
iostat -x 1 5
重点看%util列,如果长期超过80%,说明磁盘是瓶颈。
用sar看历史资源:
sar -u 1 3 # CPU
sar -r 1 3 # 内存
sar -b 1 3 # 磁盘IO
这套组合拳打下来,哪里有病心里就有数了。
二、Linux内核参数调优
有些参数默认值对服务器来说太保守了,调大了能显著提升性能。
文件描述符限制必须调: Linux默认单进程只能开1024个文件描述符,跑高并发服务根本不够用。
# 查看当前限制
ulimit -n
# 临时生效(重启失效)
ulimit -n 65535
# 永久生效,编辑 /etc/security/limits.conf
vim /etc/security/limits.conf
# 加入以下内容
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
TCP连接参数优化: 处理高并发TCP连接时,这几个内核参数必须调。
# 编辑 sysctl.conf
vim /etc/sysctl.conf
# 写入以下配置
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_fastopen = 3
# 使配置生效
sysctl -p
亲身经历:之前有个API服务经常报"too many open files",改了ulimit和sysctl.conf之后直接满血复活。
三、Nginx性能优化实战
Nginx是Linux服务器上最常见的Web服务端,把这几个地方调好,性能能翻倍。
vim /etc/nginx/nginx.conf
worker_processes auto;
worker_cpu_affinity auto;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
开启Gzip压缩:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
静态资源缓存:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
四、MySQL数据库优化
开启慢查询日志:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
用explain分析慢查询:
EXPLAIN SELECT u.username, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2026-01-01';
创建合适的索引:
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
ALTER TABLE orders ADD INDEX idx_created_at (created_at);
ALTER TABLE users ADD INDEX idx_status_created (status, created_at);
调整InnoDB缓冲池:
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
innodb_log_file_size = 1G
五、PHP-FPM调优
pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 5000
request_terminate_timeout = 30s
六、定期维护脚本
#!/bin/bash
# optimize_server.sh - 每周执行一次
find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;
sync
echo 3 > /proc/sys/vm/drop_caches
rm -rf /tmp/*
rm -rf /var/tmp/*
mysqlcheck -o -A -u root -pYourPassword
systemctl restart php8.1-fpm nginx mysql
echo "优化完成: $(date)" >> /var/log/optimize.log
# crontab -e
# 0 3 * * 0 /bin/bash /root/optimize_server.sh
总结
服务器性能优化核心就三点:先监控定位瓶颈、针对性调优、持续维护。这些经验都是我踩过坑之后总结出来的,实战能用的东西。调完之后你会发现,同样配置的机器,性能能差出两三倍。