调整PHP-FPM的进程管理参数,避免进程数过多或过少导致资源浪费或不足。编辑/etc/php/{version}/fpm/pool.d/www.conf(如/etc/php/8.1/fpm/pool.d/www.conf),设置:
pm = dynamic:根据负载动态调整子进程数量(推荐大多数场景)。pm.max_children:根据服务器内存计算(如1GB内存可设为50,公式:(总内存 - 系统预留)/单个PHP进程内存,单个进程内存可通过ps aux | grep php-fpm估算)。pm.start_servers:启动时的子进程数(建议设为pm.max_children的1/4~1/2)。pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量(保持连接池稳定,避免频繁创建/销毁进程)。sudo systemctl restart php{version}-fpm生效。持久连接(Persistent Connections)可复用已建立的数据库连接,避免每次请求都重新建立连接的开销。
persistent=true,例如:$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$options = [PDO::ATTR_PERSISTENT => true];
$pdo = new PDO($dsn, 'user', 'password', $options);
p:,例如:$mysqli = new mysqli('p:localhost', 'user', 'password', 'test');
注意:持久连接需合理控制数量(如通过max_connections限制),避免连接泄漏。
优化MySQL的缓冲池和连接数设置,提升数据库处理能力:
innodb_buffer_pool_size:设置为物理内存的50%~70%(如8GB内存设为4~6GB),用于缓存数据和索引,减少磁盘IO。max_connections:根据应用并发需求调整(如设为200~500),避免过多连接导致MySQL崩溃。wait_timeout:设置空闲连接的超时时间(如30秒),自动关闭长期闲置的连接,释放资源。/etc/mysql/mysql.conf.d/mysqld.cnf后,重启MySQL:sudo systemctl restart mysql。使用Redis或Memcached缓存不常变化的数据(如热点商品信息、用户会话),降低数据库查询频率:
sudo apt install redis-server php-redis(PHP需安装redis扩展)。$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$data = $redis->get('hot_products');
if (!$data) {
$data = $pdo->query("SELECT * FROM hot_products")->fetchAll();
$redis->set('hot_products', json_encode($data), 3600); // 缓存1小时
}
echo json_decode($data, true);
缓存可显著减少数据库负载,提升响应速度。
通过慢查询日志定位并优化慢SQL,提升查询效率:
/etc/mysql/mysql.conf.d/mysqld.cnf中设置:slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2 # 记录执行时间超过2秒的查询
重启MySQL后,使用mysqldumpslow或pt-query-digest分析日志:mysqldumpslow -s t /var/log/mysql/slow-query.log # 按时间排序
ALTER TABLE users ADD INDEX idx_username (username))、避免SELECT *(只查询需要的字段)、重写复杂查询(如拆分子查询为JOIN)。优化系统和网络设置,减少连接延迟:
read系统调用上)。编辑/etc/sysctl.conf,添加:net.ipv4.tcp_keepalive_time = 60 # 开始探测的空闲时间(秒)
net.ipv4.tcp_keepalive_probes = 3 # 探测失败的重试次数
net.ipv4.tcp_keepalive_intvl = 10 # 每次探测的间隔(秒)
生效命令:sudo sysctl -p。ping、traceroute检查网络连通性。使用工具实时监控PHP-FPM和MySQL的性能,及时发现瓶颈:
php-fpm status(需开启pm.status_path = /status)查看进程状态,或使用htop监控CPU、内存使用。mysqladmin processlist查看当前查询,或通过Prometheus+Grafana搭建可视化监控面板。slowlog(request_slowlog_timeout = 5s)和MySQL的错误日志,定位潜在问题。