ATUALIZADO PARA MAIS CLAREZA:
De acordo comhttp://expressionengine.com/user_guide/installation/installation.html, diz:
Para a maioria dos hosts Unix, o seguinte é típico, mas você pode verificar com seu host se permissões mais restritivas podem ser usadas parapermitir que o PHP grave em arquivos (666) e pastas (777). Em servidores Windows, o seguinte não se aplica, mas você precisará garantir que os arquivos e pastas possam ser gravados pelo ExpressionEngine. Pode ser necessário entrar em contato com seu anfitrião para isso.
Não tenho certeza do que isso significa. Posso alterar os arquivos e pastas específicos para 666 e 777, respectivamente, onde sou o chown'er, mas o que foi dito acima parece que preciso permitir que o PHP faça isso também?
PERGUNTA ORIGINAL:
Preciso garantir que o PHP possa gravar em arquivos (666) e pastas (777) específicos.
Como eu faço isso?
Responder1
Completarei as respostas de rahmu e MV com uma solução técnica. Tudo o que se segue é válido apenas para sistemas do tipo UNIX.
Passe pela seção chmod/chown para ver um exemplo usando ACLs - uma ferramenta mais poderosa que os modos de arquivo UNIX.
Encontrando o nome de usuário do seu servidor web
Primeiro, você precisará saber o nome de usuário com o qual seu servidor web é executado. Se você estiver usando Apache, pode ser apache
ou httpd
, www-data
, etc. Na maioria dos sistemas do tipo Debian, Apache é www-data
. Para nginx, geralmente, também é www-data
.
Para conferir, tente:
ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1
Certifique-se de que o nome de usuário que este comando retorna seja coerente(por exemplo, eu uso nginx 99% do tempo, mas este comando retorna tomcat7
um servidor web Java que instalei uma vez).
Dando permissões ao servidor web: usando chmod
echown
Fazer um chmod
666 ou 777 (a solução ideal para esse tipo de problema em documentações/tutoriais ruins) pode fazer as coisas funcionarem magicamente, mas é inseguro. Conceder permissões 666 ou 777 dará acesso a "outros". Portanto, não apenas o Apache, mas também grandmother
e nsa
(desde que essas contas de usuário existam em sua máquina - mas não, evite fazer isso, a menos que seja apenas para teste/solução de problemas).
É melhor ser mais específico e dar permissões apenas para você e o Apache. Altere o grupo de seus arquivos para dar controle total sobre seus arquivos ao servidor web. Para fazer isso, altere o proprietário recursivamente:
chown -R www-data:www-data your/folder/
Mas provavelmente você deseja manter o acesso total aos seus arquivos alterando apenas o grupo:
chown -R yourusername:www-data your/folder/
Em seguida, faça o apropriado chmod
para conceder ao grupo www-data
as mesmas permissões que você. Por exemplo, se o modo atual for 640(6 para você, 4 para www-data, 0 para outros, traduzindo para -rw-r-----), defina-o para 660(6 para você, 6 para www-data, 0 para outros, traduzindo para -rw-rw----). Veja a resposta de rahmu para saber mais sobre os modos de arquivo, é um mecanismo antigo, porém elegante.
Para evitar a manipulação de números misteriosos chmod
, você também pode usar esta sintaxe:
chmod -R g+rw your/folder/
Significa "ao grupo ( g
), adicione ( ) permissões +
de leitura e gravação ( ) na pasta , recursivamente ( )".rw
your/folder/
-R
Em 90% dos casos, isso deveria ser suficiente.
Meu método preferido: usando ACLs (Lista de Controle de Acesso)
Às vezes a primeira solução não é suficiente. Vou pegar o exemplo deEstrutura Symfonyque registra e armazena em cache muitos dados. Portanto, é necessário acesso de gravação à pasta apropriada.
E o método chmod
/ chown
pode não ser suficiente, quando você estiver usando em paralelo o Symfony Console na CLI (na minha conta de usuário) e na Web (usuário do servidor web). Isso causa muitos problemas porque o Symfony modifica constantemente as permissões.
Neste caso, usaremos a ACL (Access Control List), que é uma forma mais avançada de gerenciar permissões em muitos sistemas UNIX.
Aqui estão os comandos dados pela documentação oficial do Symfony (por favor mude app/cache
e app/logs
de acordo com suas necessidades):
Em um sistema compatível chmod +a
(ou seja, não Debian/Ubuntu)
sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
Em um sistema que não suporta chmod +a
(mais comum)
Você precisará da setfacl
ferramenta; talvez esteja instalado em seu sistema por padrão, então tente setfacl -v
ver se o comando está disponível.
Se o comando não estiver disponível,evocê está usando o Ubuntu 14.04+, basta instalar a ferramenta:
sudo apt install acl
Caso contrário, siga a documentação do seu sistema operacional, pois pode ser necessário alterar a forma como sua partição é montada (Documentação do Ubuntu aqui).
E aí estamos nós:
sudo setfacl -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
Nunca tive problemas com esse método, satisfeito ou seu dinheiro de volta.
Responder2
Não importa quem é o proprietário dos arquivos, 666 permissões e 777 seriam suficientes: o último dígito garante quetodousuário no sistema tem acesso. Embora esta seja a maneira mais fácil de fazer isso, definitivamente não é a mais segura exatamente por esse motivo.
Uma maneira melhor de fazer isso
A primeira coisa que você precisa entender écomo funcionam as permissões Unix. Para entender a resposta que dei neste link, observe que as permissões podem ser traduzidas em números:
- 0:
---
- 1:
--x
- 2:
-w-
- 3:
-wx
- 4:
r--
- 5:
r-x
- 6:
rw-
- 7:
rwx
A chmod 666
é então equivalente a alterar as permissões para rw-rw-rw
.
Em seguida, você precisa descobrir qual é o usuário que está executando o script PHP. Normalmente esse seria o usuário executando seu servidor web.Aqui está um exemplo de como fazer isso(você pode substituir Apache pelo nome do seu servidor web).
Depois de saber qual é o usuário que está executando os scripts e qual é o proprietário dos arquivos mencionados, cabe a você definir as permissões apropriadas. Lembre-se de que conceder acesso de gravação (até mesmo leitura) atodousuário em seu sistema pode ser potencialmente desastroso.
Responder3
O Expression Engine é como muitos outros aplicativos da web PHP que precisam de acesso de leitura e gravação a alguns arquivos e diretórios. Por exemplo, EE requer acesso de gravação aos seus arquivos config.php e database.php e acesso de gravação aos seus diretórios de upload de arquivos.
O que a documentação está afirmando é que, como a maioria dos servidores executam PHP como mod_php (e então rodam com as permissões do servidor web), e como você provavelmente fará upload de seus arquivos com FTP (ou similar) usando seu próprio usuário, esses arquivos e os diretórios precisarão receber permissões 666 (todos podem ler e escrever) e 777 (todos podem ler, escrever e navegar).
Essa não é a forma mais segura, mas certamente é a mais fácil, principalmente se você estiver utilizando um serviço de hospedagem.
Porém, como afirmam as instruções do EE, pergunte ao seu provedor de hospedagem, pois alguns não usam mod_php, mas sim um fastcgi, suphp ou versão diferente. Esses servidores executam PHP como seu próprio usuário, portanto, todos os arquivos que você carrega já podem ser lidos e gravados pelo PHP e por qualquer arquivo criado pelos scripts EE. Nesse caso, os arquivos e diretórios acessados pelo PHP precisariam receber acesso 600 e 700. Outros arquivos a serem acessados diretamente pelo servidor web (não pelo tempo de execução do PHP) ainda precisariam de acesso 666 e 777).