Prefácio:
Existem algumas razões pelas quais isso pode acontecer e a pergunta já foi feita várias vezes aqui no Stack Exchange. No entanto, nenhuma das respostas resolveu (diretamente) no meu caso ou foram baseadas em informações falsas ou desatualizadas.
Muitas dessas respostas (aceitas corretamente) dizem para alterar as permissões ou a propriedade do diretório DocumentRoot
configurado e dos arquivos e diretórios contidos recursivamente para www-data
.
Mas isso provavelmente não é mais necessário quando se fala de uma instalação local do Debian ou Ubuntu mais recente (por exemplo, para fins de desenvolvimento web básico).
Vamos dar uma olhada nos registros!
Como a própria página de erro contém apenas uma mensagem muito genérica, precisamos dar uma olhada no log de erros para obter mais informações:
sudo tail -f /var/log/apache2/error.log
O comando tail
exibirá as últimas 10 linhas de um arquivo e a opção -f
garante que a saída seja atualizada enquanto o log cresce.
O que o log informa?
client denied by server configuration: /home/johndoe/web/test
Este é fácil. Como explicado em Apache: cliente negado pela configuração do servidor , precisamos apenas atualizar nosso configuração com Require all granted
configuração - assim parece:
<VirtualHost *:80>
DocumentRoot "/home/johndoe/web/test"
ServerName test
<Directory "/home/johndoe/web/test">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
Não se esqueça de reiniciar o Apache com:
sudo service apache2 restart
O erro continua ...
Mas a mensagem de registro foi alterada:
Symbolic link not allowed or link target not accessible: /home/johndoe/web/test
Este é um pouco mais complicado, pois pode ter vários motivos. Para descobrir qual é o bom motivo, atualize nossa configuração para não usar um destino que contenha um link simbólico, mas aponte diretamente para o destino. Aqui /home/johndoe/web
foi um link simbólico para /media/johndoe/crypt1/web
, então nossa configuração agora é assim:
<VirtualHost *:80>
DocumentRoot "/media/johndoe/crypt1/web/test"
ServerName test
<Directory "/media/johndoe/crypt1/web/test">
Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
É fixo?
A mensagem de log provavelmente mudou para uma mais descritiva. No meu caso, mostrou:
access to / denied (filesystem path '/media/johndoe/crypt1') because search permissions are missing on a component of the path
Se você vir outra mensagem aqui e já tiver uma solução em funcionamento, será ótimo comentar e vincular a respectiva discussão aqui para que outras pessoas possam encontrar as informações corretas também.
E agora?
Como a mensagem informa, o caminho não é totalmente acessível para o Apache, pois um ou mais componentes dele não podem ser percorridos. Para ver qual componente pode causar isso, podemos fazer:
namei -m /media/johndoe/crypt1/web/test/
O comando namei
separa e imprime os componentes do caminho e, com a opção -m
, mostra os bits de modo de cada componente no estilo como o comando ls -l
faria.
Para mim, a saída ficou assim:
f: /media/johndoe/crypt1/web/test/
drwxr-xr-x /
drwxr-xr-x media
drwxr-x--- johndoe
drwxr-xr-x crypt1
drwxr-xr-x web
drwxr-xr-x test
Como parece, o diretório johndoe
está causando o problema aqui. Então, antes de modificarmos as permissões com chmod
, vamos dar uma olhada melhor:
ls -ld /media/johndoe/
O comando ls
com a opção -d
imprimirá as informações do diretório (e não seu conteúdo) na lista -l
style.
Parece isso para mim:
drwxr-x---+ 3 root root 4096 May 28 00:00 /media/johndoe/
E, como você pode ver, há um sinal +
que indica que Lista de controle de acesso está envolvida.
Isso finalmente me mostrou a direção certa, pois eu tinha certeza de que não configuraria nenhuma ACL por mim. Ainda mais porque eu nem mesmo configurei os pontos de montagem de mídia por conta própria, mas em vez disso usei o Nautilus para criptografar e montar a minha unidade.
Isso faz o truque:
Então, em vez de deixar o Nautilus atrapalhar meu ponto de montagem, agora o monto manualmente:
1) Desmonte-o se já estiver montado:
sudo umount /media/johndoe/crypt1
2) Crie um ponto de montagem diretamente sob /media
:
sudo mkdir /media/crypt1
3) Procure o mapeamento de dispositivos para descobrir o UUID:
ls -l /dev/mapper/
4) Monte o dispositivo de acordo com ele:
sudo mount /dev/mapper/luks-<UUID> /media/crypt1
5) Atualize a configuração do Apache e / ou o symlink adequadamente, por exemplo:
ln -s /media/crypt1/web/ ~/web
Notas:
Tenha em mente que você precisa criptografar e montar sua unidade após cada inicialização. Há muitas informações disponíveis aqui no Stack Exchange, mas posso recomendar: