Configure php5-fpm para muitos usuários simultâneos

3

EDIT: Adicionadas algumas configurações e um esclarecimento sobre quantas são "muitas", conforme solicitado pelo anthonysomerset.

EDIT 2: Adicionou o fastcgi_cache na configuração do nginx, como sugerido por SleighBoy.

Eu gerencio um servidor para o site de um amigo que agora recebe grandes picos de tráfego, com cerca de 200 a 300 usuários simultâneos. Entre os picos, o servidor tem cerca de 70-80 usuários simultâneos e lida com o tráfego sem problemas.

O site está executando o WordPress com W3 Total Cache em um servidor com Debian Squeeze, nginx, PHP5-FPM + APC (128MB), MySQL 5, memcached (128MB) e Varnish (1GB). A quantidade na parênteses é o quanto eu aloquei para o respectivo cache. A memória nunca ultrapassa os 1,8 GB de afaik, mas pode ser um pouco overbooking. Geralmente não causa nenhum problema ...

O que causa o problema é sempre usar o PHP5-FPM com 100% da CPU por um tempo e depois travar, resultando em erros no nginx 502-out. Log sugere aumentar a quantidade máxima de filhos, mas acho que alcancei o limite de quantos filhos o servidor pode suportar. Eu tenho corrido com pm.max_requests em 0 (ilimitado), mas agora configuro em 1000 para ver se respawning de vez em quando pode ajudar.

/etc/php5/fpm/pool.d/www.conf

[www]
listen = /var/run/php5-fpm.sock

user = www-data
group = www-data

pm = dynamic
pm.max_children = 200
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 60
pm.max_requests = 1000

/etc/nginx/nginx.conf

user www-data;
worker_processes 8;
pid /var/run/nginx.pid;

events {
        worker_connections 1024;
}

http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

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

        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_comp_level 9;
        gzip_buffers 16 8k;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        fastcgi_cache_path /var/cache/nginx levels=1:2
        keys_zone=PHP5FPMCACHE:10m
        inactive=5m;

        fastcgi_cache_key "$scheme$request_method$host$request_uri";

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

/etc/nginx/sites-available/website.com

upstream php5-fpm {
    server unix:/var/run/php5-fpm.sock;
}

server {
        server_name website.com *.website.com;
        server_name_in_redirect off;
        root /var/www/website.com;
        listen 8080;
        client_max_body_size 64M;
        access_log /var/log/nginx/website.com.access.log;
        error_log /var/log/nginx/website.com.error.log;

        keepalive_timeout 75;

        location / {
                index index.php;
                rewrite ^.*/files/(.*) /wp-includes/ms-files.php?file=$1 last;
                if (!-e $request_filename) {
                        rewrite ^(.+)$ /index.php?q=$1 last;
                }

        }

        location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
                expires 30d;
                access_log off;
        }

        location ~ \.php$ {
                fastcgi_pass php5-fpm;
                fastcgi_cache   PHP5FPMCACHE;
                fastcgi_cache_valid   200 302  1h;
                fastcgi_cache_valid   301      1d;
                fastcgi_cache_valid   any      1m;
                fastcgi_cache_min_uses  1;
                fastcgi_cache_use_stale error  timeout invalid_header http_500;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

}

/etc/varnish/website.vcl

backend default {
.host = "127.0.0.1";
.port = "8080";
}

sub vcl_recv {
# Normalize Content-Encoding
    if (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$") {
            remove req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {
            remove req.http.Accept-Encoding;
        }
    }
# Remove cookies and query string for real static files
    if (req.url ~ "^/[^?]+\.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.*|)$") {
       unset req.http.cookie;
       set req.url = regsub(req.url, "\?.*$", "");
    }
# Remove cookies from front page
    if (req.url ~ "^/$") {
       unset req.http.cookie;
    }
}

É um VPS com 4 núcleos e hyperthreading (então "8 núcleos") e 2GB de RAM. Eu sei que o nó de hardware (servidor físico) está longe de ser reservado em excesso e mal utilizado (desde que trabalhei para a empresa de hospedagem até um mês atrás), então é praticamente um servidor dedicado.

Se você precisar de especificações sobre qualquer coisa, é só pedir.

    
por jgabor 13.10.2011 / 11:00

2 respostas

1

Eu suspeito que o seu cache de verniz não está fazendo cache em nenhum lugar perto o suficiente dos hits

aqui está o que eu faria em sua situação:

Menores de php max para 100 ou até 50 (se o verniz faz o seu trabalho corretamente, você não precisa deles) também remove a linha de pedidos max para permitir que o processo do php não reapareça muito rapidamente e assim evitar que o APC seja limpo muito rapidamente, o que também é ruim

também SE não é bom de acordo com o nginx - link

Eu mudaria essa linha:

            if (!-e $request_filename) {
                    rewrite ^(.+)$ /index.php?q=$1 last;
            }

para:

try_files $uri $uri/ /index.php?$args;

Se a sua versão do nginx for compatível (se você tem certeza de que sua versão do nginx é > 0.7.51, então ela é compatível)

você também deve procurar inserir as regras nginx do w3tc diretamente no seu arquivo vhost para habilitar o armazenamento em cache de páginas melhorado (o que é mais rápido que o cache APC com nginx)

Dê uma olhada no seguinte verniz vcl que eu uso para sites - você precisará ler e editar algumas coisas para o seu site - ele também assume que seus sites WP apenas no servidor e apenas um site no servidor , pode ser facilmente modificado para mais sites (dê uma olhada na seção de cookies)

genérico vcl: link

Com esta configuração eu diria para remover o fastcgi_cache para evitar quaisquer possíveis problemas com uma cadeia de cache ocorrendo, por meio do qual tentar localizar qualquer entrada de cache obsoleta e obsoleta é mais difícil

diga também ao w3tc que o verniz está em 127.0.0.1 e irá apagá-lo para você;)

Eu implantei isso para um servidor na noite de quarta-feira (com algumas modificações específicas do domínio) que estava lidando com 2.500 visitantes ativos do site e reduziu a carga para menos de 1 e o número aproximado de crianças php em execução ficou em torno de 10-20 depende do número de usuários logados e outros fatores, como cookies) este servidor tinha muito mais memória ram, mas o princípio é o mesmo, você deve ser capaz de lidar facilmente com o número de visitantes que você recebe em picos

    
por 14.10.2011 / 14:59
1

APC e nginx fastcgi_cache vão te ajudar muito.

    
por 13.10.2011 / 19:04