Introdução
Ok, eu tenho a questão complicada (pelo menos para mim) da minha rede de produção em breve. Estou à procura de conselhos de usuários mais experientes com o Linux, especialmente conselhos sobre formas seguras para configurar a rede que eu sou sobre o descrever. Eu ainda sou um novato com tudo isso e ainda sou responsável por configurar essa nova rede.
Atualmente, estou executando mais de 150 sites em uma configuração com um balanceador de carga, três servidores da web e um servidor de dados no apache. Tudo bem por enquanto, no entanto, estou tentando configurar uma nova rede com o nginx no novo debian por causa do enorme aumento no desempenho.
Li muitas e muitas informações sobre o nginx e o apache, executei dezenas de testes para comparar o desempenho em ambas as situações e cheguei à conclusão de que o nginx sob alta pressão (executamos quase apenas sites WordPress) lida muito mais rápido depois apache principalmente por causa dos arquivos estáticos (às vezes mais de 100 em uma página, que o navegador pode descontar, obviamente, mas ainda assim).
Configuração atual
- Debian 9
- nginx 1.10.3
- php-fpm (7.0)
- ldap 3
Eu tenho todos os dados de sites montados em um diretório / sites em cada servidor da web. Os arquivos de configuração para nginx e fpm também estão localizados em um diretório de configuração. Cada site (eu vou usar example.com) tem seu próprio usuário (autenticado através do ldap) e está nos sites do grupo (também no ldap). Portanto, cada usuário tem seu diretório inicial na pasta / sites com permissões 700 owner example.com e sites do grupo. Isso é feito para que cada site funcione em sua própria "ilha" isolada.
Isso significa que para cada configuração de site eu tenho uma configuração php fpm que usa um soquete diferente para cada usuário. Ou seja, ele só pode executar arquivos php em seu próprio diretório de sites, certo? Para o PHP isso funciona bem e eu prefiro não alterar essa configuração.
Problema
Aí vem o problema, o nginx é mais rápido porque ele serve arquivos estáticos diretamente em comparação com o apache que (como nós o configuramos anteriormente) com o módulo mpm-itk cria processos separados para cada usuário que serve arquivos estáticos ou PHP.
O Nginx faz isso de forma diferente, usando php fpm com soquetes diferentes para cada usuário que eu obtenho (pelo menos com php) da mesma forma que o módulo mpm-itk faz para o apache. No entanto nginx não pode fazer isso e tenta servir todos os arquivos estáticos como o usuário nginx é executado como (www-data como padrão). Então, a saída é gerada pelo PHP (funciona bem), mas o nginx não tem permissões para mostrar os arquivos estáticos.
Estou tentando encontrar uma solução para mais de um dia e chegou a algumas conclusões diferentes.
Executar como root
Meu colega disse que rodar o nginx como root vai resolver o problema, com certeza será, mas isso não parece seguro para mim. Pode também remover toda a política de "cada site tem seu próprio usuário" se eu fizer isso.
Adicione www-data ao grupo de websites
Se eu pudesse adicionar um usuário unix (www-data neste caso) a um grupo ldap (que aparentemente não posso) eu poderia dar ao grupo (sites) permissões de leitura (em vez dos atuais 700) para que ele possa leia arquivos estáticos em todos os lugares. O único problema é que os sites podem ler arquivos uns dos outros, o que estou tentando evitar. Então, isso não parece ser uma solução adequada.
SELinux
Eu li algumas documentações e introduções sobre o SELinux e para mim isso parece ser uma maneira complicada de corrigir esse problema. Eu nunca trabalhei com isso e executar isso em uma rede de produção como esta não parece ser uma boa idéia, já que não tenho idéia do que estou fazendo com isso.
Conclusão
Então, de onde estou agora, qual caminho um usuário mais experiente poderia seguir? Faça mais pesquisas no SELinux? AppArmor? Ou existe outra maneira mais simples de obter os mesmos apaches de segurança oferecidos pelo mpm_itk.
Este é o último problema que tenho e não estou procurando todos os arquivos de configuração para configurá-lo e os comandos exatos que preciso executar.
Espero que alguém com mais experiência possa me dar algum conselho ou me apontar na direção certa. É muito apreciado de qualquer maneira!