Obviously my web server doesn't have permission to create directories - and probably not to create files - in public_html or its subdirectories (like some directories under ~/public_html/wordpress).
Isso é muito provável que seja o problema. No entanto, você não precisa se trancar para fora do diretório: há muitas opções que permitem manter os arquivos nesse diretório e permitir que o servidor da Web grave nele:
-
Coloque-se no grupo
www-data
:sudo gpasswd -a $(whoami) www-data
e altere o grupo do diretório public_html:sudo chown -R $(whoami):www-data ~/public_html
. Dessa forma, você e o servidor da Web compartilharão esse diretório. -
Usando o sticky bit: isso permitirá que o servidor da Web grave arquivos no diretório enquanto carrega o grupo da pasta, permitindo que você ainda acesse o diretório de uploads como seu usuário:
chmod g+rws,o+rwx ~/public_html/wordpress/wp-content
. -
Use as ACLs para especificar permissões avançadas para permitir que o servidor grave no diretório:
setfacl -m u:www-data:rwx ~/public_html/wordpress/wp-content
. Se você seguir esse caminho, eu recomendo ler o manual para as ACLs, pois elas são muito poderosas e há muitas coisas que você pode fazer com eles.
Aviso
Note, entretanto, que nenhuma das soluções acima é realmente adequada para um ambiente de produção, já que todas permitirão que qualquer usuário no servidor que tenha permissão para executar o código PHP também tenha permissões de servidor web e, portanto, possa excluir arquivos maliciosos. seu diretório de uploads. Certifique-se de apenas tornar o diretório de uploads gravável, e também certifique-se de colocar um .htaccess que proíbe qualquer execução de código do diretório de uploads. Para servidores de produção, recomendo rodar o PHP como usuário do sistema do usuário usando suexec, php-fpm ou qualquer outra forma de executar o código PHP fora do servidor web.