Tenho usado com sucesso o método descrito aqui:Mantido por um único usuárioe tem funcionado bem para mim. Este é o meu script para todos os meus sites:
sudo chown -R WebAdmin /var/www/example.com/
sudo chgrp -R www-data /var/www/example.com/
sudo chmod -R 750 /var/www/example.com/
sudo chmod g+s /var/www/example.com/
sudo chown www-data:www-data /var/www/example.com/Uploads/
sudo chmod -R 755 /var/www/example.com/Uploads/
Eu mantenho todos os sites nesse servidor e WebAdmin é o usuário geral que uso para FTP e também para SSH.
No entanto, recentemente mudei alguns sites Wordpress de uma empresa de hospedagem para o meu servidor e o procedimento acima não funciona. Atualizar o Wordpress ou seus temas/plugins me deu o erro:
Para realizar a ação solicitada, o WordPress precisa acessar seu servidor web. Por favor, insira suas credenciais de FTP para continuar. Se você não se lembra de suas credenciais, entre em contato com seu host.
Existem várias "correções", comoEsteque são mais como soluções alternativas e provavelmente são inseguras. Então usei o método mais seguro (AFAIK) e tornei o www-data o proprietário dos sites WordPress, mantendo os sites não WordPress como antes. Em outras palavras, eu simplesmente corri
sudo chown -R www-data /var/www/wp_example.com/
nos sites WordPress. É claro que isso funcionou, mas se torna um incômodo no que diz respeito à manutenção manual do site, porque tenho que fazer login como root para fazer isso. Eu também não seria capaz de atribuir o(s) site(s) a outra pessoa para mantê-lo no futuro. Observe que alguns dos meus sites são híbridos (parte WordPress e parte páginas personalizadas).
Então, estou me perguntando se existe uma solução melhor, mais elegante e mais geral, ou seja, que funcionará para sites WordPress e não-WordPress.
Uma possibilidade é adicionar o usuário WebAdmin ao grupo www-data. Ou talvez www-data para o grupo de usuários WebAdmin? O que faz mais sentido e o que é mais seguro?
Responder1
Se o usuário WebAdmin
diretamente e o usuário www-data
por meio do grupo www-data
precisarem gravar nesses diretórios, isso 750
não será suficiente. O que corrige seu design atual seria:
sudo chmod -R 770 /var/www/example.com/
Considerações de segurança
No entanto, em geral, isso significa que todos os sites PHP estão sendo executados no mesmo usuário e, após essa modificação, todos os sites poderão ler e gravar os arquivos de qualquer outro site. Isso significa que um comprometimento de qualquer um dos sites compromete todos eles.
Usar um usuário e um pool PHP-FPM separados para cada site dividiria os sites em compartimentos isolados, mitigando esse risco. Você pode administrar o site com o mesmo usuário que o executa:
/var/www$ ls -l
drwxr-x--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxr-x--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxr-x--- 2 example-org www-data 4096 Aug 30 7:00 example.org
Se você realmente precisa que o usuário WebAdmin
gerencie todos eles, adicione o usuário ao grupo www-data
e conceda permissões de gravação ao grupo, mas eu não recomendaria isso.
/var/www$ ls -l
drwxrwx--- 2 example-com www-data 4096 Aug 30 7:00 example.com
drwxrwx--- 2 example-net www-data 4096 Aug 30 7:00 example.net
drwxrwx--- 2 example-org www-data 4096 Aug 30 7:00 example.org
Conjuntos PHP-FPM
Como mencionei os pools PHP FPM, aqui está um pequeno exemplo de configuração. Existem vários tutoriais explicando essas etapas em detalhes.
Instale o PHP-FPM.
/etc/php/8.2/fpm/pool.d/example-com.conf
:[example-com] user = example-com group = example-com listen = /run/php/example-com.sock chdir = /var/www/example.com listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[disable_functions] = exec,passthru,shell_exec php_admin_flag[allow_url_fopen] = off php_admin_value[cgi.fix_pathinfo] = 1 security.limit_extensions =
A última linha diminui a segurança para permitir que o WordPress lide com URLs de SEO, as outras são para aumentar a segurança. Os
pm
parâmetros devem ser ajustados às suas necessidades.Habilite módulos Apache
mpm_event
,proxy
&proxy_fcgi
.Adicione o manipulador ao
<VirtualHost>
bloco Apache2 do site:<FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php/example-com.sock|fcgi://localhost" </FilesMatch> <Proxy "fcgi://localhost/"> </Proxy>
Recarregue ou reinicie os serviços Apache2 e PHP-FPM.