我运营一个流量很大的网站。我使用 nginx 和 php fast-cgi。但是,在浏览器中加载简单的 php 文档时,页面加载需要长达 5-6 秒的时间。有时甚至只会导致“404 未找到”nginx 错误。
在 Debian 上使用“htop”时,我根本用不完服务器的资源。那么到底是怎么回事?是 nginx 吗?还是 PHP-fast-cgi?我不知道瓶颈在哪里。
我的 nginx 配置片段:
用户 www-数据 www-数据; 工作进程2; 事件 { 工人连接4048; } http { 包括 mime.types; 默认类型应用程序/八位字节流; 发送文件; #tcp_nopush 开启; 保持活动超时 10; 包括/usr/local/nginx/sites-enabled/*; ... }
我的 fast-cgi 配置片段:
EXEC_AS_USER=www-数据 # FASTCGI-Listener 的主机和 TCP 端口(默认值:localhost:9000) FCGI_HOST=本地主机 FCGI_PORT=9000 # 环境变量,由 PHP 处理 PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=0
非常感谢!!
答案1
多少流量才算很多?以下是一些提示:
- 尽可能使用缓存
- 工作进程的数量可以等于 CPU 核心的数量
- 尽早关闭实时连接或完全禁用它们(尝试一下
keepalive_timeout 5
) - 每个连接都需要一个文件句柄
worker_rlimit_nofile 20000;
- 1 秒内可以服务的用户总数(大约)
= worker_processes * worker_connections/ (keepalive_timeout * 2)
- 禁用访问日志,除非你真的需要它们
- 使用平衡器(如果一台服务器不可行)
答案2
让服务器安静下来,对所有 php 和 nginx 进程进行 strace 操作,尝试一个请求并观察它在哪里等待。
或者,寻找一个 php 的分析工具并用它收集一些数据。
答案3
- 尝试将 FastCGI 配置为 unix 套接字而不是 internet 套接字。在某些情况下,这可以节省高达 20% 的时间。
- 您可以将 worker_processes 推高至可用核心的数量。
- 检查你的 php-fpm 配置,因为它有足够的选项来:
- 终止运行时间非常长的请求;
- 关于长期运行请求的报告。
- 将 PHP_FCGI_MAX_REQUESTS 更改为相关值,例如 1000。以防内存损坏的情况。