优化Nginx + PHP-FPM以缩短响应时间(适用于Openx保存)

时间:2010-02-16 09:13:19

标签: php nginx openx

我目前正在运行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参数。

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

7 个答案:

答案 0 :(得分:70)

首先,工人太多,限制设定得过高。单独的php-fpm的最大工作人员数量会使服务器停滞不前。在服务器上取消限制不一定会加快速度,但实际上可能产生相反的效果。

  1. 工人数:20如果你没有20台处理器/核心机器就没那么有意义,你实际上会造成负面影响,因为工人会有过多的内容交换。如果您正在运行双核处理器,那么2名工作人员就足够了。

  2. 工人连接:再一次,只是向天空施加限制并不能解决你的问题。如果你的ulimit -n输出大约是1024,那么你的工作者连接需要设置为1024或更少(甚至可能是768),你不太可能有2 x 1024个同时连接,特别是像PHP这样的东西。

  3. 根位置和PHP设置,请参考http://wiki.nginx.org/Pitfalls,如果将root指令放在服务器{}级别而不是位置级别,则效果最佳。一旦你这样做,你可以使用$ 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内存的系统,那么允许每个限制为128MB的500名工作人员是没有意义的。如果您还在服务器上运行其他服务,尤其如此。

答案 1 :(得分:6)

放置也很有用:

access_log off;

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

答案 2 :(得分:4)

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

此外,您已将worker_rlimit_nofile提升为50000,我希望您知道操作系统通常将限制设置为1024(默认值),您可以尝试通过键入{来请求当前限制是什么{1}}

您可以通过在init.d或visit this other question on stackoverflow中执行此命令ulimit -n来提高NOFILE的硬限制(打开文件数),以了解如何使用ulimit -n 50000永久设置限制系统宽。

答案 3 :(得分:3)

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

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

当然,工人们也可以提到。我个人更喜欢使用xcache而不是APC来进行php操作码缓存。你应该检查一下修改后的centmin auto bash shell中的配置nginx / php-fpm安装脚本http://vbtechsupport.com/796/

答案 6 :(得分:-2)

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

HHVM使用CPU的上游a" Just in Time Compiler"并且通常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/Getting-Started

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

感谢upvoting