我有一个运行 PHP-FPM 和 Nginx 的 Ubuntu 服务器设置——我做了一些压力测试,发现速度明显变慢。我使用 loadImpact 测试了 250 个用户。我发现在测试期间 PHP 的速度根本没有变慢——页面渲染时间从未从 0.04 秒开始波动(我认为这是因为 APC 缓存)。
资产的实际传输花费了这么长时间。不确定这是网络限制还是 Nginx 问题——我假设是 Nginx,因为服务器是 Rackspace 上的云服务器,而且我假设他们的网络非常强大(也许这是一个愚蠢的假设……)。
从命令行运行“top”显示在任何给定时间都有一个 nginx 进程在运行,我认为这就是瓶颈 - 此外,CPU 几乎没有被使用。值得注意的是,我使用的是 512MB RAM 云服务器,但 RAM 使用率也很低,所以我很确定我没有很好地配置 Nginx。我已将我的配置粘贴在下面...
我对此很陌生,所以如果我没有提供足够的信息,请提前道歉。
user www-data;
worker_processes 4; #using a quad-core VPS server
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 3;
tcp_nodelay on;
gzip on;
gzip_comp_level 1;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/x$
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server {
listen *:80;
server_name ***.com;
location / {
root /var/www/nginx-default;
index index.php;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpass;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_na$
include fastcgi_params;
}
}
这是虚拟主机配置:
server {
listen 80;
server_name dev.***.com;
access_log /***/access.log;
error_log /***/error.log;
client_max_body_size 4M;
location / {
root /***;
index index.php;
# if file exists return it right away
if (-f $request_filename) {
break;
}
# otherwise rewrite the fucker
if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php?url=$1 last;
break;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /***$fastcgi_script_name;
include fastcgi_params;
}
}
}
在此先感谢您的任何建议!
答案1
您是如何得出 0.04 秒的渲染时间的?您可能希望将 PHP 从等式中完全移除,仅针对静态文件进行基准测试。
不过,您可以采取一些措施来改善配置。首先,可以相当安全地增加 gzip 压缩级别,对 CPU 的影响很小,但将其增加到 5 可以获得较小的数据大小。我发现将其增加到 5 以上很少能带来任何好处。
您还可以轻松增加保持活动超时时间,默认值为 75。这可能对原始吞吐量没有太大帮助,但如果客户端的浏览器允许,那么它会显得更快。
之后,您可能需要使用打开文件缓存。我使用以下配置:
open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
您可以在此处找到有关该内容的文档:http://wiki.nginx.org/NginxHttpCoreModule#open_file_cache
由于您没有指定缓冲区,因此缓冲区可能不够大,因此响应暂时存储在磁盘上。您可以查看 iostat 1 是否显示较长的 iowait 时间。
有趣的缓冲区是
- 客户端主体缓冲区大小
- 输出缓冲区
客户端主体缓冲区记录在此处:http://wiki.nginx.org/NginxHttpCoreModule#client_body_buffer_size
输出缓冲区未在 wiki 中记录,但它需要两个参数,第一个是缓冲区的数量,第二个是每个缓冲区的大小。输出缓冲区主要用于 sendfile 关闭时或在将数据发送给用户之前对其进行 gzip 压缩时,因此您一定要确保数据合适。