Tutorial configurar pool PHP-FPM distinta para cada website

Objetivos

  • Entender o que é o PHP-FPM
  • Quais casos é interessante configurar uma pool distinta para cada site ou conjunto de sites
  • As necessidades para seguir este tutorial
  • Passo a passo para criar uma pool independente para cada site com o PHP-FPM

O que é o PHP-FPM

A sigla FPM do PHP-FPM vem do inglês “FastCGI Process Manager” sendo uma alternativa ao Apache 2.0 handler mod_php e SUPHP baseados no método CGI tradicional.

Uma característica do PHP-FPM é que sua implementação possui um desempenho superior e a possibilidade de parametrização com propósito de otimizar o uso de recursos disponíveis no servidor.

O PHP-FPM já vem como padrão no Servidor Http Nginx, mas se estiver utilizando o Servidor HTTP Apache, é necessário instalar e configurar o mesmo.

Quais casos é interessante configurar uma pool distinta para cada site ou conjunto de sites

  • CASE 1:
    Servidor de páginas precisa ser dividido para 2 empresas. É necessário que o usuário e grupo de execução do PHP seja diferente para cada conjunto de websites. Ou seja, cada empresa precisa ter sua própria pool do php-fpm configurada desta forma.
  • CASE 2:
    Servidor dividido para 2 empresas novamente, mas agora cada empresa deseja utilizar uma versão diferente do PHP para seus websites. Novamente, basta instalar a versão do php-fpm que cada empresa deseja utilizar e configurar uma pool definindo qual versão do php cada empresa vai utilizar.
  • CASE 3:
    Servidor dividido para 2 ou mais empresas, mas cada empresa tem preferência distinta para uso dos recursos do servidor na execução de arquivo php. Necessário então configurar pools diferentes para cada conjunto de websites, para que cada empresa tenha os recursos acordados.
  • CASE 4:
    Servidor dividido para um grupo de 10 amigos, mas cada um gerencia seu próprio website no servidor. Desta forma, para garantir uma melhor gestão de permissão de arquivos, é necessário criar uma pool para cada pessoa/website e configurar o usuário de cada um para ser o responsável de executar o php no seu website.

Os requisitos para seguir este tutorial

Este tutorial leva em conta que já possui o PHP-FPM instalado no seu servidor. Caso ainda não tenha, basta verificar este tutorial e verificar os passos da instalação: Tutorial instalar e configurar servidor web (HTTP) com PHP-FPM
Caso esteja utilizando o servidor Nginx, você já possui o PHP-FPM instalado.

Passo a passo para criar uma pool independente para cada site com o PHP-FPM

Passo 1

Primeiro passo é verificar qual versão do PHP-FPM possui instalado, ou quais versões, pois pode ter mais de uma instalada.

grep "php-fpm: master process"

Aqui no meu exemplo tenho a saída:

root       74015  0.0  1.4 242116 14332 ?        Ss   Mar21   0:12 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)

Verificando a saída acima, vemos que o php-fpm que temos em funcionamento é o da versão 8.1.

Então, as Pool’s da versão instalada do PHP-FPM são configuradas na pasta:

etc/php/8.1/fpm/pool.d/

Passo 2

Agora vamos pensar no seguinte setup de utilização do servidor:

Temos 2 usuários que são webmasters e precisam mexer em websites distintos. Vamos supor então que eles possuem o nome de usuário de login:

  • webmaster1
  • webmaster2

Eles podem ser responsáveis por um conjunto de websites distintos. Mas neste exemplo, vamos supor de forma resumida, que cada um possui acesso a 1 website distinto apenas, então estes websites são:

  • website1
  • website2

Passo 3

Precisamos então criar uma pool para cada usuário, e esta pool eles vão utilizar no conjunto de websites que tiverem acesso. Neste exemplo porém, cada 1 terá apenas acesso a 1 website.

Então vamos utilizar a pool padrão como modelo e fazer uma cópia alterando o nome:

sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/webmaster1.conf
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/webmaster2.conf

Passo 4

Agora vamos alterar a pool do webmaster1.

sudo nano /etc/php/8.1/fpm/pool.d/webmaster1.conf

Encontre a linha que define o nome da pool “[www]” e altere para:

[webmaster1]

PHP-FPM - criando uma nova pool e definindo seu nome

Encontre a linha “user = www-data” e altere para:

user = webmaster1

PHP-FPM - definindo usuário responsável por execução de arquivos php nesta pool

Encontre a linha:

listen = /run/php/php8.1-fpm.sock

Altere para:

listen = /run/php/php8.1-fpm-webmaster1.sock

PHP-FPM - definindo o nome do socket pra funcionamento do php-fpm

Passo 5

Agora vamos alterar a pool do webmaster2.

sudo nano /etc/php/8.1/fpm/pool.d/webmaster2.conf

Encontre a linha que define o nome da pool “[www]” e altere para:

[webmaster2]

Encontre a linha “user = www-data” e altere para:

user = webmaster2

Encontre a linha:

listen = /run/php/php8.1-fpm.sock

Altere para:

listen = /run/php/php8.1-fpm-webmaster2.sock

Passo 6

Agora em cada arquivo de configuração de um domínio, precisamos informar qual pool deverá ser utilizado para execução do php-fpm.

Costumo ter 3 arquivos de configuração por domínio, um para acesso http, um para acesso ssl, e outro para acesso ssl com subdomínio www. Se no seu setup utiliza de outra forma, não tem problema.

Configuração do Website1

Mas para fim de exemplo, para o website1, vou editar estes 3 arquivos (exemplo utilizando servidor apache):

sudo nano /etc/apache2/sites-available/website1.com.br.http.conf
sudo nano /etc/apache2/sites-available/website1.com.br.ssl.conf
sudo nano /etc/apache2/sites-available/website1.com.br.ssl.www.conf

Dentro da diretiva de virtualhost, é necessário inserir o seguinte texto:

 <FilesMatch \.php$>
  SetHandler "proxy:unix:/run/php/php8.1-fpm-website1.sock|fcgi://localhost"
 </FilesMatch>

Segue o exemplo abaixo de como ficaria dentro do arquivo de configuração:


Configuração do Website2

Da mesma forma, para o website2, temos os arquivos:

sudo nano /etc/apache2/sites-available/website2.com.br.http.conf
sudo nano /etc/apache2/sites-available/website2.com.br.ssl.conf
sudo nano /etc/apache2/sites-available/website2.com.br.ssl.www.conf

E precisamos inserir dentro da diretiva de virtualhost o texto:

 <FilesMatch \.php$>
  SetHandler "proxy:unix:/run/php/php8.1-fpm-website2.sock|fcgi://localhost"
 </FilesMatch>

As mesmas modificações precisam ser realizadas, como já destacamos os exemplos do website1, não vamos repetir aqui, mas é o mesmo processo.

Passo 7

Um passo opcional é desligar a pool padrão “[www]”. Eu particularmente deixo a mesma ligada, para utilização quando acesso algum site do servidor pelo IP. Mas, caso não seja seu caso, é possível desligar a pool padrão mudando seu nome:

sudo mv /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/www.conf-desligada

Passo 8

Agora, para que as modificações que realizamos tenham efeito, é preciso reiniciar tanto o servidor apache, quanto o PHP-FPM.

Ao reiniciar o PHP-FPM, ele vai verificar os novos arquivos de configuração das pool’s dentro do diretório e irá criar as mesmas, assim como os arquivos .sock. Tenho preferência em reiniciar o PHP-FPM primeiro e em seguida o servidor apache (executar os comandos abaixo um de cada vez).

sudo service php8.1-fpm restart
sudo service apache2 restart

Considerações Finais

O processo de setup das pools é bem simples. Lembrando que para ter um desempenho otimizado, é possível ainda realizar algumas modificações nos arquivos de configuração, visando as necessidades da sua aplicação php. É possível configurar mais workers, etc.

Tem alguma dúvida ou sugestão? Escreve aí nos comentários!