- 首页 >
- 问答 >
- 云计算 >
- 如何利用CentOS PHP日志进行网站性能调优
如何利用CentOS PHP日志进行网站性能调优
小樊
45
2025-12-19 15:31:03
利用 CentOS PHP 日志进行网站性能调优
一 日志体系与关键指标
- 建议同时开启并规范以下日志,以形成从应用层 PHP-FPM、Web 服务器 Nginx/Apache到数据库 MySQL的端到端可观测性:
- PHP-FPM 错误日志:记录进程启动、回收、致命错误等,路径常见为**/var/log/php-fpm/error.log**;同时可开启PHP-FPM 访问日志以观察请求排队、响应耗时等。
- PHP 错误日志:在php.ini中通过error_log指定,用于记录语法/运行时错误与警告。
- Web 访问与错误日志:Nginx 常见为**/var/log/nginx/access.log与error.log**;Apache 常见为**/var/log/httpd/access_log与error_log**。
- MySQL 慢查询日志:在**/etc/my.cnf**中开启,用于定位执行时间过长的 SQL。
- 系统服务日志:使用journalctl -u php-fpm或journalctl -u httpd查看服务级事件与启动失败原因。
- 关键指标与日志来源映射:
- 应用脚本慢:PHP-FPM 慢请求日志(request_slowlog_timeout + slowlog)
- 请求排队/上游耗时:Nginx $request_time / $upstream_response_time
- 错误与告警:PHP 错误日志、PHP-FPM 错误日志、Nginx/Apache 错误日志
- 数据库瓶颈:MySQL 慢查询日志
- 异常流量/攻击:Nginx/Apache 访问日志中的异常路径、UA、频次
二 日志采集与配置要点
- PHP-FPM 慢日志与进程管理(定位脚本级瓶颈)
- 在**/etc/php-fpm.d/www.conf中开启慢日志并设置阈值(如1s**),便于捕获耗时函数/SQL:
- request_slowlog_timeout = 1s
- slowlog = /var/log/php-fpm/slow.log
- 结合进程管理参数(如pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers)避免过载与频繁重建进程。
- PHP 错误日志(避免生产暴露错误细节)
- 在php.ini中配置:
- log_errors = On
- error_log = /var/log/php/php_error.log
- display_errors = Off(生产环境关闭页面错误回显)
- Nginx 访问日志与慢请求分离(定位网络与上游耗时)
- 在http块定义包含**$request_time / $upstream_connect_time / $upstream_header_time / $upstream_response_time的格式;使用map $request_time $log_name { 1.000+ slow; default main; }与条件日志将>1s请求单独写入slow.log**,便于聚焦优化目标。
- MySQL 慢查询日志(定位数据库瓶颈)
- 在**/etc/my.cnf**中启用:
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow-query.log
- long_query_time = 1(单位秒,可按业务调整)
- 日志轮转与容量控制(避免磁盘被日志撑爆)
- 为 PHP-FPM 配置logrotate(示例:每日轮转、保留7天、压缩):
- /var/log/php-fpm/*.log { daily; missingok; rotate 7; compress; notifempty; create 640 root adm; postrotate /usr/sbin/php-fpm -k; endscript }
- Web 与系统日志同样建议使用logrotate或内置轮转(如 Nginx 的buffer=32k flush=300s)以降低 I/O 抖动
三 从日志发现瓶颈的实操命令
- PHP-FPM 慢日志 Top N 慢脚本
- grep -v ‘^[’ /var/log/php-fpm/slow.log | awk ‘{print $(NF-1), $0}’ | sort -nr | head -20
- 关注:脚本路径、耗时、调用栈中的file_get_contents/curl、PDO/MySQL、include/require。
- Nginx 访问日志 Top 慢请求与热点接口
- 统计 Top 10 慢请求(阈值**>1s**):
- awk ‘$NF > 1 {print $NF, $7}’ /var/log/nginx/access.log | sort -nr | head
- 统计热点接口(按请求路径计数):
- awk ‘{print $7}’ /var/log/nginx/access.log | cut -d’/’ -f1-3 | sort | uniq -c | sort -nr
- PHP-FPM 错误日志异常频次
- grep -E ‘WARNING|ERROR’ /var/log/php-fpm/error.log | cut -d’ ’ -f1-4,6- | sort | uniq -c | sort -nr
- MySQL 慢查询 Top SQL
- mysqldumpslow -s t /var/log/mysql/slow-query.log | head -20
- 实时追踪与关键字告警
- tail -f /var/log/php-fpm/slow.log | egrep ‘file_get_contents|curl_exec|PDOStatement|Exception’
- tail -f /var/log/nginx/error.log | grep --line-buffered ‘upstream timed out’
- 系统服务日志快速定位
- journalctl -u php-fpm -f
- journalctl -u httpd --since “2025-12-19 00:00:00” -p err
四 优化动作与落地闭环
- 代码与调用优化
- 对慢日志中频繁出现的外部 HTTP 调用、数据库查询、循环内 I/O进行重构:增加缓存(Redis/Memcached)、批量/异步化、减少N+1 查询、优化算法与数据结构。
- 使用Xdebug / Blackfire / New Relic对热点函数做剖析,验证优化收益。
- 配置与缓存优化
- 启用并调优OPcache(示例值,按内存与命中率微调):
- opcache.enable=1
- opcache.memory_consumption=256
- opcache.interned_strings_buffer=16
- opcache.max_accelerated_files=20000
- opcache.validate_timestamps=1
- opcache.revalidate_freq=60
- 适度调整max_execution_time / memory_limit,避免过长脚本阻塞进程池。
- 并发与进程管理
- 结合RPS/QPS、平均/95分位响应时间与CPU/内存使用率,调整 PHP-FPM 的pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers,减少排队与 502/504。
- 数据库优化
- 对慢查询日志中的 SQL 增加索引、优化JOIN/子查询、使用覆盖索引与分页优化;必要时引入读写分离/连接池。
- 监控与告警闭环
- 将PHP-FPM/Nginx/MySQL日志接入ELK/Graylog或集中式日志平台,建立Top N 慢接口/慢 SQL与错误率仪表盘,设置阈值告警,持续优化。