我在使用 nginx 和 PHP-FPM 时遇到了一个奇怪的问题。我设置了一台服务器来为我的网站提供下载服务。它不是很强大,只有 Celeron G530 和 4GB RAM,因此,我运行 nginx 是因为它的开销很低。该服务器通常以 30-40Mbps 的速度持续传输,端口为 100Mbps。
问题是,当我通过 HTTP 从服务器请求一些 PHP 脚本时,请求经常超时。我知道 nginx 中的时间限制是 60 秒,并且我已通过日志验证它正在达到该时间并关闭连接。
我也有穆宁在服务器上运行以监控事物,虽然这仍然通过 HTTP,但在同一服务器上和在相同条件下,它非常快速且敏捷,页面加载时间不超过 150 毫秒。
在我看来,问题出在 PHP-FPM 上是合乎逻辑的(据我所知,Munin 使用 Perl),但我该如何检查呢?我该怎么做才能深入研究问题并找出实际的瓶颈是什么?
如果是 PHP-FPM,我可以做些什么来加快速度?它不会占用大量 CPU 或 RAM,并且设置为使用套接字连接,而不是使用 nginx 的 TCP 连接。
谢谢你的帮助。
答案1
您应该将慢速日志记录添加到您的 php-fpm 配置中:
request_slowlog_timeout = 10
slowlog = /var/log/php-fpm/slow.$pool.log
这将记录所有耗时超过 10 秒的请求,这样您就可以看到哪些脚本不够“敏捷”。它提供了在达到慢速记录时间限制时代码所处位置的完整堆栈跟踪。
您还可以设置 PHP-FPM 状态页面。将其添加到您的 PHP-FPM 池配置中:
pm.status_path = /www-status
并将请求通过 nginx 传递到 PHP-FPM
location ~ ^/(www-status)$ {
include %mysite.root.directory%/conf/fastcgi.conf;
fastcgi_pass unix:%phpfpm.socket%/php-fpm-www.sock;
# or IP address
# fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
allow 127.0.0.1;
allow stats_collector.localdomain;
allow watchdog.localdomain;
deny all;
}
然后转到 yoursite.com/www-status?full 将为你提供每个 php-fpm 进程的详细打印输出,例如:
pool: www
process manager: dynamic
start time: 18/Mar/2013:20:17:21 +1100
start since: 243
accepted conn: 3
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 3
active processes: 1
total processes: 4
max active processes: 1
max children reached: 0
slow requests: 0
************************
pid: 6233
state: Idle
start time: 18/Mar/2013:20:17:21 +1100
start since: 243
requests: 1
request duration: 631
request method: GET
request URI: /www-status
content length: 0
user: -
script: /documents/projects/intahwebz/intahwebz/basereality/www-status
last request cpu: 0.00
last request memory: 262144
答案2
当我通过 HTTP 从服务器请求一些 PHP 脚本时,请求经常超时
这意味着并非所有脚本都会发生这种情况 - 对于受影响的脚本来说,这种情况只会在某些时候发生 - 因此解决方案就是简单地查看脚本工作时与不工作时有什么不同,并将工作脚本与不工作脚本进行比较。另外,检查您的日志。
(如果您还没有安装,您可能需要向 munin 添加对 php-fpm 进程数量和 HTTP 连接的监控)。