Como adicionar um pool ao FPM (nginx) sem recarregar / reiniciar o próprio fpm?

3

Estou construindo um ambiente (em uma máquina do Ubuntu 10.04.02) para lidar com um site com muitos (deve suportar pelo menos 1000) subdomínios, cada um deles servido por um pool diferente do FPM, com um usuário diferente.

Nada de novo; Meu problema é criar (e iniciar) um novo pool fpm sem precisar recarregar / reiniciar o FPM, o que causará um tempo de inatividade (eu sei, realmente rápido).

Eu escrevi um daemon python, quando necessário:

  1. Crie o usuário do sistema
  2. Configurar a raiz da web dos subdomínios
  3. Crie o subdomain.conf na minha pasta /etc/php5/fpm/fpm.d/

Eu pesquisei, mas não encontrei uma maneira de invocar o fpm usando um pool, que poderia ser uma solução 'temporária': a instância principal do fpm executava todos os pools, evey nova obtinha sua própria instância de fpm, depois com um cron Eu paro e recarrego o fpm toda semana / mês / dontknowyet

Se realmente importa, o servidor está rodando em nginx, configurado para usar o unix socket para fcgi, esta é a minha configuração de teste nginx:

server{
    listen          80;
    server_name     ~^(?<domain>.+)\.test\.local$; # foo.test.local > myapp_foo
    root            /var/www/myapp/subdomains/myapp_$domain/htdocs;
    location / {
        index index.php;
    }
    location ~* \.(gif|jpg|png|ico)$ {
        expires 30d;
    }
    location ~ \.php$ {
        fastcgi_pass    unix:/var/web-sock/myapp_$domain-fpm.sock;
        fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

.. e meu subdomínio-fpm.conf:

[myapp_foo]
listen = /var/web-sock/myapp_foo-fpm.sock

user = myapp_foo
group = myapp_foo

pm = dynamic
pm.max_children = 30
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 30

Eu tentei usar php5-cgi e / ou spawn-fcgi nos novos subdomínios, mas é um pouco instável e geralmente falha quando o nível de simultaneidade aumenta um pouco.

Alguma ideia?

    
por Strae 13.04.2011 / 16:38

4 respostas

0

Desculpe por minha própria pergunta, mas eu encontrei esta solução isso é exatamente o que eu estava procurando ... há 3 anos;)

Basicamente, a ideia é ter um script de inicialização para cada pool, com poucas modificações que funcionem como um charme.

Desculpe se eu não repetir os passos aqui, mas, na verdade, seria apenas copiar e colar desse link!

Outras leituras: php-fpm ondemand com systemd

Espero ajudar alguém;)

    
por 08.09.2014 / 12:11
5

Não acredito que exista uma maneira de adicionar um pool sem reiniciar / recarregar (por isto ).

Eu acho que a redundância é a melhor abordagem para isso, eu acredito, que você pode realizar o que quiser com reload . Como é um recarregamento normal , ele deve aguardar a conclusão dos processos.

Essencialmente, passe o sinal SIGUSR2 para php-fpm e ele recarregará todos os trabalhadores + recarregará o fpm conf / binary.

Eu acredito que isso equivale a

kill -USR2 'cat $php_fpm_PID'

Então, você modifica o conf - e recarrega - não deve resultar em tempo de inatividade perceptível.

Outra opção é executar um processo por usuário - você pode adicionar novos usuários sem encerrar processos existentes, mas os requisitos de recursos são significativamente maiores (e, para mais de 1.000 usuários, provavelmente não serão práticos).

Uma mais opção é criar um processo php-cgi temporário para o novo usuário e atrasar o recarregamento do servidor até mais tarde (ou seja, período de baixa carga, ou quando você tem vários usuários para adicionar). Isso reduziria o tempo de inatividade, mas ainda abriria o subdomínio do novo usuário imediatamente.

Nenhuma das opções acima é exatamente ideal, e a única solução prática para não haver tempo de inatividade seria a abordagem de vários servidores.

    
por 06.07.2011 / 20:35
2

Se você não puder pagar nenhum tempo de inatividade, a única opção é adicionar redundância

  1. permite que algum balanceador de carga seja executado na frente de 2 (ou mais) servidores.
  2. configure o hot-standby do jeito que você quiser
  3. alternar
  4. configure o "novo" hot-standby como você quiser
  5. rince e repita toda vez que precisar de uma mudança

EDIT: é muito bem possível executar uma configuração como esta com apenas uma peça de hardware. Basta adicionar mais instâncias do nginx em execução em diferentes IPs e criar uma configuração de failover entre eles. Se esta opção faz sentido para o seu caso de uso, não cabe a mim decidir.

    
por 05.07.2011 / 01:05
0

Parece que você está preso por recursos. Por que não executar dois servidores da Web no mesmo hardware?

Tente algo assim:

+---------------+
|    nginx :80  |
|   /     \     |
| :8081  :8080  |
+---------------+

Dessa maneira, seu serviço de balanceamento de carga (nginx, neste caso) pode rotear entre duas portas. Desta forma, você pode levar um serviço para cima ou para baixo quantas vezes quiser (para atualizações), etc.

Claro que você precisaria de dois pools FPM, dois usuários, etc.

    
por 06.07.2011 / 17:46