为了更快的响应时间(用于Openx广告服务),优化Nginx + PHP-FPM

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参数。

有没有人有什么建议,可以让我优化它,以便我可以处理更多的请求?我现在看到的响应时间非常可怕。


1
如果你想要 PHP 更快的响应时间,你应该使用 Apache。Nginx+php-fpm 适用于高流量网站,但对于 90% 的网站来说,它比 Apache+mod_php 更慢。^^ - Thomas Decaux
7个回答

73
首先,工作进程过多,而且设置的限制过高。单独针对php-fpm的最大工作进程数量会让服务器负担很重。解除服务器上的限制并不一定会加快速度,反而可能会产生相反的效果。
  1. 工作进程数量:如果你没有一个20处理器/核心的机器,那么20个工作进程就没有意义,因为工作进程会出现过度的内容交换,从而导致负面影响。如果你正在运行双核处理器,则2个工作进程应该足够。

  2. 工作连接数:同样,将限制值随意设定得很高并不能解决问题。如果你的ulimit -n输出结果是1024,那么你的工作连接数需要设置为1024或更少(甚至可能是768),特别是当使用PHP时,不太可能有2 x 1024个同时连接。

  3. 根目录和PHP设置,请参考http://wiki.nginx.org/Pitfalls,最好将根指令放在server {}级别而不是location级别。这样做后,你可以使用$document_root$fastcgi_script_name作为SCRIPT_FILENAME的值,因为$document_root会自动传递到其下方的location块中。

  4. 你可能希望直接处理静态文件,也就是说:

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

8

还有一点很有用,那就是添加:

access_log off;

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


4

考虑到你可能没有20核/处理器,建议减少工作人员的数量。此外,我建议检查一下数据库服务器,问题可能出在那里。

此外,你将worker_rlimit_nofile提高到了50000,我希望你知道操作系统通常将限制设置为1024(默认值),你可以尝试通过输入ulimit -n来请求当前限制。

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


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压缩等核心参数。

是的,像其他人提到的那样,您的设置看起来过度并显示了对基本优化概念的缺乏理解。换句话说,雇佣一个专业人士 :-)


1

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


0

绝对有太多的工人,正如其他人所说。我个人更喜欢xcache而不是APC来进行php opcode缓存。您应该查看修改后的centmin自动bash shell nginx/php-fpm安装脚本中的配置http://vbtechsupport.com/796/


-3

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

HHVM使用CPU上游的“即时编译器”,并将通常的PHP代码执行速度提高5到10倍,这使得可以使用更少的服务器或更小的服务器,并且可以大幅降低功耗。维基百科使用HHVM将CPU服务器负载减少了5倍: http://www.golem.de/news/php-facebooks-hhvm-macht-wikipedia-schneller-1501-111515.html

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

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

感谢您的点赞


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接