У меня есть простой стек LAMP в настройке CentOS. Apache настроен с помощью vhosts, и у каждого разработчика есть свои веб-файлы внутри своей пользовательской папки. Структура каталогов такая (для пользователя test
):
/home/test
|_ apache
|_ domain1.com
|_ backups
|_ conf
|_ vhost.conf
|_ logs
|_ errors.log
|_ images.log
|_ web.log
|_ private
|_ public
Конфигурация vhost находится в файле vhost.conf. Файлы журнала в журналах не существуют при первой настройке конфигурации, и это вызывает ошибку с apache, когда я запускаю service httpd restart
:
(13)Permission denied: httpd: could not open error log file /home/test/apache/domain1.com/logs/error.log.
Unable to open logs
Я пробовал бежать httpd -X
как root, и он создал файлы журнала (с root-владельцем / группой). Я подумал, что это будет случай убедиться, что файлы там, с группой, установленной как apache
и записываемый (поэтому мне не нужно, чтобы весь каталог принадлежал apache
group и записываемый), но это меня смущает:
[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 restart
Stopping httpd: [ OK ]
Starting httpd: [FAILED]
[root@dev logs]# touch web.log
[root@dev logs]# chown test:developers web.log
[root@dev logs]# service httpd restart
Stopping httpd: [FAILED]
Starting httpd: [ OK ]
Я сбит с толку, потому что apache работает как пользователь apache
и не должен иметь права записи в журналы, не так ли? Фактически, я могу даже это сделать:
[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 restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
Теперь у меня есть файлы журнала, принадлежащие пользователю root, и он все еще запускается - и записывает в них тоже - если я просматриваю web.log и перехожу на эту страницу, журналы начинают появляться.
Я явно не совсем понимаю здесь что-то, так что мне не хватает? Я бы предпочел не создавать файлы журналов вручную и позволять apache делать это самому, но, тем не менее, я просто хотел бы понять, почему это происходит, особенно когда я позволяю PHP возиться с файлами.
Обновить
По запросу, вот что я вижу в audit.log
когда я пытаюсь запустить apache, когда файлы журнала не существуют:
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): arch=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)
При работе с существующими журналами больше ничего не добавляется в журнал. В Permission denied: httpd: could not ...
ошибка была из общего журнала.
Только что у меня была такая же проблема. @ Тим Александр указал мне в правильном направлении. Отключение selinux временно подтвердило, что проблема связана с конфигурацией selinux.
Итак, немного погуглив, я нашел предложение, в котором в основном говорилось, что нужно обязательно реплицировать любую конфигурацию selinux, которая находится в / var / www / html в каталоге виртуального хоста.
Первое, что я сделал, - повторил проблему с selinux в файлах конфигурации, которые у меня возникали время от времени, о чем я писал здесь: http://blog.ciuly.com/my-server/apache-on-linux-could-not-open-configuration-file-permission-denied/
Но проблема была не в этом. Однако я зашел в / var / www и выдал "ls -Z", который показал
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
поэтому все, что я сделал сейчас, это
chcon -R system_u:object_r:httpd_sys_content_t:s0 /www/
и обновление браузера теперь правильно показало индекс сайта, но по-прежнему содержала ошибку «не удается открыть файл журнала» в error_log.
Затем я хорошо прочитал (снова) через https://wiki.centos.org/HowTos/SELinux
На данном этапе хорошей идеей будет запустить
sealert -a /var/log/audit/audit.log
Хотя в вики говорится, что нужно grep the audit.log и передать это в sealert, я обнаружил, что хочу решить все проблемы с selinux, а не только ту, которая меня сейчас беспокоит :)
Возвращаясь к нашей проблеме, запечатывающее устройство показывает следующее соответствующее предупреждение:
SELinux is preventing /usr/sbin/rotatelogs from search access on the directory /etc/httpd
уплотнитель предлагает сделать следующее
#grep rotatelogs /var/log/audit/audit.log | audit2allow -M mypol
#semodule -i mypol.pp
И это действительно решило проблему журнала.
Итак, три проблемы с selinux, которые я получаю каждый год или около того, когда я настраиваю новый сайт с apache на centos 5.x / 6.x, и мне все еще нужно его погуглить. Каждый раз.
Вы создаете отдельные файлы с помощью touch, а затем меняете владельца файла с помощью chown. Чтобы Apache мог сам создавать свои лог-файлы, права на запись в содержащие каталог нужны. Использовать chown -R
(заглавная R = рекурсивный) в указанном каталоге журналов.
Вы изменили владельца файлов, чтобы они были доступны для чтения / выполнения группой, но не были доступны для записи группой, и я считаю, что в этом заключается ваша проблема. Вы, вероятно, можете изменить 664 файлы, чтобы сделать их доступными для чтения и записи владельцем и группой (и доступными для чтения всем). Они не обязательно должны быть исполняемыми.
У меня такая же проблема, что журналы vhost всегда принадлежат root с разрешениями 640 при создании, рабочий раунд состоит в том, чтобы написать сценарий для chmod или chown разрешений имени файла журнала vhost, используя подстановочный знак в конце имени файла для захвата формат даты, в конце файла, затем cron этот скрипт и установите его один раз в час или один раз в день, тогда ваши журналы vhost будут иметь разрешения, которые вы хотите