识别瓶颈——Nginx + PHP-FPM + Ubuntu

识别瓶颈——Nginx + PHP-FPM + Ubuntu

我有一个运行 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 压缩时,因此您一定要确保数据合适。

相关内容