23

我目前正在运行 Nginx + PHP-FPM 在 OpenX 上投放广告。目前我的响应时间很糟糕,即使在低负载时也是如此。但是,我的 CPU 和内存资源都很好,所以我似乎无法弄清楚瓶颈是什么。

我当前对 nginx 和 php-fpm 的配置是:

worker_processes 20;
worker_rlimit_nofile 50000;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  15000;
    multi_accept off;
    use epoll;
}

http {
    include       /etc/nginx/mime.types;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    tcp_nopush     off;

    keepalive_timeout  0;
    #keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_comp_level 2;
    gzip_proxied    any;
    gzip_types    text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

server {
    listen   80;
    server_name  localhost;
    access_log  /var/log/nginx/localhost.access.log;

# Default location
    location / {
        root   /var/www;
        index  index.php;
    }

## Parse all .php file in the /var/www directory
    location ~ .php$ {
        fastcgi_pass   localhost:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
        fastcgi_ignore_client_abort     off;
    }

PHP-FPM:
rlimit_files = 50000
max_children = 500

我只包括了我为 PHP-FPM 更改的 PHP-FPM 参数。

有没有人对我如何优化它有任何提示,以便我可以满足更多请求?我现在看到可怕的响应时间。

4

7 回答 7

73

首先,工人太多,限制设置过高。仅 php-fpm 的最大工作人员数量会使您的服务器陷入相当多的困境。取消对服务器的限制不一定会加快速度,但实际上可能会产生相反的效果。

  1. 工人数量:如果您没有 20 个处理器/核心机器,则 20 毫无意义,您实际上会造成负面影响,因为工人将进行过多的内容交换。如果您运行的是双核处理器,则 2 个工作人员就足够了。

  2. 工人联系:再一次,只是把限制扔到天堂并不能解决你的问题。如果您的 ulimit -n 输出类似于 1024,那么您的工作连接将需要设置为 1024 或更少(甚至可能是 768),您不太可能同时拥有 2 x 1024 个连接,尤其是使用 PHP 之类的连接。

  3. 根位置和 PHP 设置,请参阅http://wiki.nginx.org/Pitfalls,如果您将根指令放在服务器 {} 级别而不是位置级别,效果最好。一旦你这样做了,你可以使用 $document_root$fastcgi_script_name 作为 SCRIPT_FILENAME 值,因为 $document_root 将自动传播到它下面的位置块。

  4. 您可能希望直接处理静态文件,换句话说:

    location ~* \.(ico|css|js|gif|jpe?g|png)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    
  5. 使用 PHP 加速器,即 APC(在 php.ini 中使用 apc.enabled=1)或 XCache,并注意您的 php 设置,例如 memory_limit。例如,如果您的系统只有 2GB 内存,那么允许 500 个工作人员每个人限制为 128MB 是没有意义的。如果您还在服务器上运行其他服务,则尤其如此。

于 2011-03-28T08:07:02.687 回答
8

放置也很有用:

access_log off;

我想您并不真正关心这些请求的日志生成。

于 2011-06-04T13:22:02.493 回答
4

你绝对应该减少工人的数量,因为我怀疑你有 20 个内核/处理器。另外,我会查看您的数据库服务器,问题很可能存在。

此外,您已经提高了worker_rlimit_nofileto 50000,我希望您知道操作系统通常将限制设置为 1024(默认),您可以尝试通过键入来请求当前限制是多少ulimit -n

ulimit -n 50000您可以通过在 init.d 中执行此命令来提高 NOFILE(打开文件的数量)的硬限制,或者访问 stackoverflow 上的其他问题以了解如何使用limits.conf在系统范围内永久设置限制。

于 2010-08-02T10:46:38.153 回答
3

使用 nginx 和 php5-fpm 真正将性能推到最大是一门艺术。它需要真正了解您所服务的内容类型。

例如,我在您的配置中看不到任何 try_files 用法或任何类型的缓存。你知道 nginx 自带了内置的 memcache 支持吗?您可以缓存图像和 html/css,以及 php 页面。如果您主要关心点击次数,那么即使显示不计入这些点击次数仍然会被计算在内。

把你的banner放在tmpfs挂载上,不记录access_log或error_log,禁用php中不需要的模块,使用最新版本的mysql,使用innodb减少表锁定,使用innodb的flush方法减少磁盘写入,增加 mysql 中的最大内存表,以减少通过 SQL 请求连接时在磁盘上创建临时文件等。

Nginx 只是一个庞大而复杂的公式的一部分。我什至没有提到内核参数来优化 TCP 堆栈和网卡性能、交换使用、内存使用或您可能通过 OpenX 提供的 HTML/CSS 的 gzip 压缩(如果您是的话)。

是的,就像我上面提到的其他人一样,您的设置看起来过多,并且缺乏对基本优化概念的理解。换句话说,聘请专业人士:-)

于 2013-01-25T04:15:31.910 回答
1

你的机器上有 20 个处理器或内核吗?也可以尝试使用您的操作系统默认的事件...也许更多 fcgi 进程而不是更多 nginx...可能从 2 - 4 个 nginx 工作人员开始就足够了...

于 2010-02-23T22:34:27.117 回答
0

正如人们提到的那样,工人当然也可以。我个人更喜欢 xcache 而不是 APC 用于 php 操作码缓存。您应该检查修改后的 centmin auto bash shell nginx/php-fpm install script http://vbtechsupport.com/796/中的配置

于 2011-05-20T16:49:18.503 回答
-2

使服务器系统更快的最有效方法是使用 Facebook 的 HipHop 虚拟机 (HHVM) 而不是 PHP(不再必须安装 PHP)。

HHVM 在 CPU 上游使用“即时编译器”,执行通常 PHP 代码的速度比 PHP 本身快 5 到 10 倍,它可以与较少数量的服务器或较小的服务器相处并降低功耗本质上。维基百科使用 HHVM 将 CPU 服务器负载降低了 5 倍: http ://www.golem.de/news/php-facebooks-hhvm-macht-wikipedia-schneller-1501-111515.html

它可以作为 Linux 包与 Nginx 一起安装,并且很容易像 FastCGI 一样包含在 Nginx 中,几分钟后就可以通过一个小的“Hello World”PHP 文件进行测试: https ://github.com/facebook /hhvm/wiki/入门

根据基准测试,新的 PHP7 PHPNG 实际上应该只快 30%。

感谢您的支持

于 2015-02-28T03:13:03.647 回答