优化Nginx + PHP-FPM以缩短响应时间(用于Openx广告服务)

2022-08-30 17:59:55

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

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


答案 1

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

  1. Worker Count:如果您没有20个处理器/核心计算机,则20没有多大意义,您实际上会造成负面影响,因为Worker将有过多的内容交换。如果您运行的是双核处理器,则 2 个 worker 应该就足够了。

  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 RAM的系统,那么允许500个工作线程(每个限制为128MB)是没有意义的。如果您还在服务器上运行其他服务,则尤其如此。


答案 2

放进去也很有用:

access_log off;

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


推荐