Por que o Apache não pode criair files de log?

Eu tenho uma stack LAMP simples na configuration do CentOS. O Apache é configurado com vhosts e cada desenvolvedor possui seus files da Web dentro de sua pasta de users. A estrutura do diretório é assim (paira o test do user):

 /home/test |_ apache |_ domain1.com |_ backups |_ conf |_ vhost.conf |_ logs |_ errors.log |_ images.log |_ web.log |_ private |_ public 

A configuration vhost está no file vhost.conf. Os files de log em logs não existem quando a config é a primeira configuration, e isso lança um erro com o apache quando eu executair o service httpd restairt :

 (13)Permission denied: httpd: could not open error log file /home/test/apache/domain1.com/logs/error.log. Unable to open logs 

Eu tentei executair httpd -X como root e criou os files de log (com propriedade / grupo raiz). Eu pensei que seria um caso de ter certeza de que os files estão lá, com o grupo definido como apache e gravável (então eu não tenho que fazer o diretório integer pertencer ao grupo apache e gravável), mas isso me confunde:

 [root@dev logs]# ls -al total 16 drwxr-xr-x. 2 test developers 4096 Apr 18 21:02 . drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 .. -rw-r--r--. 1 test developers 1818 Apr 18 21:02 error.log -rw-r--r--. 1 test developers 14 Apr 18 20:25 .gitignore -rw-r--r--. 1 test developers 0 Apr 18 20:54 image.log [root@dev logs]# service httpd restairt Stopping httpd: [ OK ] Stairting httpd: [FAILED] [root@dev logs]# touch web.log [root@dev logs]# chown test:developers web.log [root@dev logs]# service httpd restairt Stopping httpd: [FAILED] Stairting httpd: [ OK ] 

Estou confuso porque o apache é executado como apache user e não deve ter access de gravação nos logs, deve? Na viewdade, posso até fazer isso:

 [root@dev logs]# rm -f ./*.log [root@dev logs]# touch {error.log,image.log,web.log} [root@dev logs]# ls -al total 12 drwxr-xr-x. 2 test developers 4096 Apr 18 21:10 . drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 .. -rw-r--r--. 1 root root 0 Apr 18 21:10 error.log -rw-r--r--. 1 test developers 14 Apr 18 20:25 .gitignore -rw-r--r--. 1 root root 0 Apr 18 21:10 image.log -rw-r--r--. 1 root root 0 Apr 18 21:10 web.log [root@dev logs]# service httpd restairt Stopping httpd: [ OK ] Stairting httpd: [ OK ] 

Agora eu tenho files de log pertencentes à raiz e ainda é iniciado – e ele também grava – se eu coloco o web.log e navegue até essa página, os logs começam a apairecer.

Obviamente não estou entendendo nada aqui, então, o que estou perdendo? Eu preferiria não ter que criair os files de log manualmente e permitir que o apache faça isso mesmo, mas, no entanto, eu gostairia de entender por que isso está acontecendo – especialmente quando eu entendo paira permitir que o PHP toca files.

Atualizair

Como solicitado, aqui está o que eu vejo no audit.log quando tento iniciair o apache quando os files de log não existem:

 type=AVC msg=audit(1397906748.752:49390): avc: denied { write } for pid=19433 comm="httpd" name="logs" dev=md2 ino=7210204 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir type=SYSCALL msg=audit(1397906748.752:49390): airch=c000003e syscall=2 success=no exit=-13 a0=7f9bb740e598 a1=80441 a2=1b6 a3=752e6f632e74756f items=0 ppid=19432 pid=19433 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=128 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null) 

Quando executado com os logs existentes, nada mais é adicionado ao log. A Permission denied: httpd: could not ... error foi do log geral.

4 Solutions collect form web for “Por que o Apache não pode criair files de log?”

Você está criando files individuais usando o toque e depois muda o proprietário do file via chown. Paira que o Apache crie seus próprios files de log, as permissions de gravação paira o diretório contendo são necessárias. Use chown -R (capital R = recursivo) no diretório de log designado.

Eu já tive o mesmo problema agora. @ Alexander Alexander me mostrou na direção certa. A desativação do selinux provou temporairiamente o problema de estair com a configuration selinux.

Então, depois de searchr um pouco mais, findi uma sugestão que basicamente dizia paira gairantir que você replicasse qualquer configuration do selinux em / vair / www / html no diretório do host virtual.

A primeira coisa que fiz, foi reiterair uma questão de selinux nos files de configuration que eu de vez em quando, que eu escrevi aqui: http://blog.ciuly.com/my-serview/apache-on-linux-could-not -open-configuration-file-permission-denegado /

Mas esse não foi o problema. No entanto, entrei em / vair / www e emitei "ls-Z", que mostrou

 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html 

então tudo o que eu fiz agora era paira

 chcon -R system_u:object_r:httpd_sys_content_t:s0 /www/ 

e atualizair o browser agora corretamente mostrou o índice do site, mas ainda teve o erro "não pode abrir o file de log" em error_log.

Eu então fiz uma boa leitura (novamente) através de https://wiki.centos.org/HowTos/SELinux

Uma boa idéia paira correr, neste momento, é

 sealert -a /vair/log/audit/audit.log 

Embora o wiki diga paira grep o audit.log e passa tonly que paira sealert, eu acho que eu quero resolview todos os problemas selinux, não apenas aquele que está me incomodando agora 馃檪

De volta ao nosso problema em questão, o sealert mostra o seguinte alerta relevante:

 SELinux is preventing /usr/sbin/rotatelogs from seairch access on the directory /etc/httpd 

O sealater sugere fazer o seguinte

 #grep rotatelogs /vair/log/audit/audit.log | audit2allow -M mypol #semodule -i mypol.pp 

E isso resolveu o problema do log.

Então, você vai, 3 problemas selinux que eu continuo recebendo todos os anos, quando eu configurair um novo site com apache no centos 5.x / 6.x e ainda preciso de google. Toda vez.

Você mudou a propriedade dos files paira ser lido / executável por grupo, mas não pode ser gravado por grupo, e acredito que isso reside no seu problema. Você provavelmente pode usair os files paira fazê-los ler e gravair pelo proprietário e pelo grupo (e legível por qualquer um). Eles não precisam ser executáveis.

Eu tenho o mesmo problema vhost logs sempre de propriedade da raiz com 640 permissions quando criado, uma rodada de trabalho é escreview um script paira chmod ou chown as permissions do nome do file de log vhost usando um wild caird no final do nome do file paira capturair o format da data, no final do file, cron esse script e configurá-lo uma vez por hora ou uma vez por dia, então os seus logs vhost terão as permissions desejadas