Debian LAMP 下 PHP 性能提升实操指南
一 基线评估与快速检查
- 明确瓶颈:用 ab/wrk/siege 做基线压测,配合 top/htop、vmstat、iostat 观察 CPU、内存、I/O 与上下文切换;开启 PHP-FPM slowlog 定位慢脚本;开启 MariaDB 慢查询日志 找出慢 SQL。
- 版本与扩展:保持 Debian、Apache、MariaDB、PHP 为稳定最新;安装并启用 OPcache。
- 连接复用:开启 KeepAlive 并合理设置超时,减少 TCP 握手开销。
- 传输压缩:启用 mod_deflate(Gzip) 或 Brotli,降低带宽占用。
- 静态资源:配置浏览器缓存与 CDN,将图片、CSS、JS 等剥离回源。
- 安全与稳定:仅放行 80/443/SSH,避免被恶意流量干扰压测结果。
二 Apache 与 PHP 运行时优化
- 使用 PHP-FPM + Apache MPM event(高并发更省内存):
- 启用模块:sudo a2enmod proxy_fcgi setenvif;切换 MPM:sudo a2enmod mpm_event;启用 FPM 配置:sudo a2enconf php8.x-fpm;重启:sudo systemctl restart apache2。
- PHP-FPM 进程管理(/etc/php/8.x/fpm/pool.d/www.conf):
- 动态模式:pm = dynamic;按内存估算 pm.max_children(见下方“容量规划”);示例(1GB 内存、WordPress 场景):pm.max_children=5,pm.start_servers=2,pm.min_spare_servers=1,pm.max_spare_servers=2;php_admin_value[memory_limit]=128M。
- OPcache 建议(/etc/php/8.x/fpm/php.ini 或 apache2/php.ini):
- opcache.enable=1;opcache.memory_consumption=128;opcache.interned_strings_buffer=8;opcache.max_accelerated_files=10000;opcache.validate_timestamps=1(开发)/ 0(生产);opcache.revalidate_freq=60;opcache.fast_shutdown=1。
- 静态资源与压缩:启用 mod_deflate 压缩文本类资源;启用 mod_expires/mod_headers 设置 Cache-Control/Expires;必要时启用 mod_cache 做磁盘缓存。
三 MariaDB/MySQL 优化
- 内存关键参数(/etc/mysql/mariadb.conf.d/50-server.cnf):
- InnoDB 缓冲池:innodb_buffer_pool_size 建议为内存的 50%–80%(写多/缓存命中差取低值,读多取高值)。
- 查询缓存:对 WordPress 等读多写少且高并发场景,建议 query_cache_size=0、query_cache_type=0(避免锁争用)。
- 连接与会话:max_connections 与 pm.max_children 联动,避免连接风暴;tmp_table_size / max_heap_table_size 适度(如 16M)防止大临时表落盘。
- 维护与索引:定期执行 OPTIMIZE TABLE、分析慢查询(EXPLAIN、慢查询日志),补充合适索引,避免全表扫描与 N+1 查询。
四 系统层与网络优化
- 文件描述符与内核网络:提升 ulimit -n(如 65535);sysctl 优化:net.core.somaxconn=4096/65535,net.ipv4.tcp_tw_reuse=1,net.ipv4.tcp_fin_timeout=30,net.ipv4.ip_local_port_range=1024 65535,net.core.netdev_max_backlog=65535。
- 传输与压缩:启用 Gzip/Brotli;静态资源设置长期 Cache-Control/Expires;接入 CDN 分担回源。
- 内存分配器:可选 jemalloc 降低碎片、提升多线程分配效率(Debian: apt install libjemalloc2;配置 /etc/ld.so.preload 或在服务环境设置 LD_PRELOAD;用 lsof/pmap 验证进程是否加载 jemalloc)。
五 容量规划与压测闭环
- 容量规划公式(保守估算):
- PHP-FPM 最大占用 ≈ pm.max_children × php_admin_value[memory_limit](例:5 × 128MB ≈ 640MB)。
- 数据库占用 ≈ innodb_buffer_pool_size + 连接/排序/临时表等开销(例:1GB 内存机器,innodb_buffer_pool_size 可先设 512MB,视负载再调)。
- 预留 20%–30% 内存给系统与其他服务(如 Apache、OS page cache)。
- 压测与迭代:
- 基线压测 → 调整 pm.max_children / innodb_buffer_pool_size / KeepAlive / OPcache → 复测对比 P95/P99 延迟、RPS、错误率;慢脚本与慢 SQL 分别用 FPM slowlog 与 MariaDB 慢查询日志 持续优化。
- 架构升级路径:静态资源全上 CDN;高并发下考虑 Nginx 反向代理/静态分离 或 负载均衡 扩展横向能力。