![proxy reverso nginx para php-fpm](https://rvso.com/image/1539559/proxy%20reverso%20nginx%20para%20php-fpm.png)
Estou tendo alguns problemas conceituais com uma configuração Nginx. Começando com um nginx
proxy reverso com terminação SSL, uso uma docker-compose.yml
configuração com alguns contêineres, cada um fornecendo um serviço virtual. Esses serviços são fornecidos como subdiretórios sob um único nome de host:
net --443--> nginx
| | `--- ContainerA "https://example.com/serviceA/"
| `----- ContainerB "https://example.com/serviceB/"
`------- ContainerC "https://example.com/serviceC/"
Trechos de listas de processos:
nginx:~$ ps fax
127285 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf -g daemon off;
127419 ? S 0:00 \_ nginx: worker process
127420 ? S 0:00 \_ nginx: worker process
127421 ? S 0:00 \_ nginx: worker process
ContainerA:~$ ps fax
127132 ? Ss 0:09 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
234053 ? S 8:27 \_ php-fpm: pool www
236952 ? S 8:12 \_ php-fpm: pool www
259123 ? S 6:42 \_ php-fpm: pool www
Achei que haveria ganho de eficiência executando uma única instância nginx
e usando php-fpm
em cada um dos contêineres.
EUpensarque a premissa php-fpm
seja tal que os contêineres não necessitem de nginx
processos próprios; os nginx
processos se comunicam com cada contêiner pela porta 9000 (a parte da rede funciona). Na prática, porém, estou tendo problemas, então preciso verificar se minha premissa é correta:
Essa suposição de base nginx
e php-fpm
arquitetura está correta?Alternativamente, uma infra-estrutura nginx
/ php-fpm
infraestrutura adequada deve ser usada php-fpm
em conjunto direto (mesmo host e sistema de arquivos) ou é razoável e eficiente multi-hospedagem/multi-sistema de arquivos?
(Recentemente, entrei em contato para contratar ajuda, e a primeira resposta foi "você precisa executar nginx
em cada contêiner", o que não fazia sentido para meu entendimento php-fpm
.)
(Há muitas perguntas aqui que fazem nginx.conf
perguntas específicas, não sobre esta arquitetura reconhecidamente de nível superior.)
Responder1
Esta é uma resposta fraca, mas acredito:
Sim, esta é em geral a filosofia correta, mas com algumas ressalvas. php-fpm
existe para processar .php
arquivos, mas acho que não para servir todos os arquivos (não-php). Para isso, o processo frontal nginx
precisa ver todos os arquivos, mesmo que não faça o processamento real do PHP.
Para que isso aconteça de forma inteligente usando o docker, os arquivos no php-fpm
contêiner precisam ser compartilhados explicitamente com o nginx
contêiner. A maneira preferida de fazer isso no docker é fornecer um volume nomeado e usá-lo para ambos os contêineres. Por exemplo, um docker-compose.yml
arquivo:
version: '2'
services:
serviceA:
image: ... # something served with php-fpm
volumes:
- tmpvolA:/path/to/serviceA
serviceB:
image: ... # something served with php-fpm
volumes:
- tmpvolB:/path/to/serviceB
nginx:
image: ...
volumes:
- tmpvolA:/var/www/serviceA
- tmpvolB:/var/www/serviceB
volumes:
tmpvolA:
tmpvolB:
(Muitos campos não estão incluídos ...) Os dois volumes listados no final são os "volumes nomeados" dos quais o docker fala e estão vazios por um motivo: eles devem estar vazios quando você inicia o script e irão ser preenchido por um dos recipientes. (Na verdade, pode ser preenchido por ambos ou por nenhum, dependendo de vários fatores.)
Um efeito colateral disso é que os volumespersistir.
- “Isto é bom” para a eficiência, na medida em que não é recriado desnecessariamente.
- “Isso é ruim” porque um benefício de ter serviços virtualizados é que você pode reiniciá-los e ter a garantia de uma lousa limpa. Com volumes nomeados persistentes, você não obtém (automaticamente) uma lista limpa, pois os arquivos usados na instância anterior serão usados em vez da versão austera em uma camada fs inferior.
A maneira de contornar esse "ruim" é liberar os volumes manualmente. Isso pode ser feito no desligamento com docker-compose down -v
, que de acordo com a ajuda:
-v, --volumes Remove named volumes declared in the `volumes` section
of the Compose file and anonymous volumes
attached to containers.
Também pode ser feito manualmente com docker volume rm <volume-id>
ou docker volume prune
(que remove todos os volumes não utilizados no momento, sejam temporários ou nomeados ou qualquer outro).