Я использовал Webmin для создания следующего виртуального хоста:
<VirtualHost *:80>
DocumentRoot "/var/www/whatever"
ServerName whatever.ourdomain
<Directory "/var/www/whatever">
allow from all
Options +Indexes
</Directory>
</VirtualHost>
И при перезапуске Apache получаю
Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist
Дело в том, что каталог абсолютно ЕСТЬ. Я смотрю прямо на это. pwd
показывает мне, что это мой текущий каталог и т. д. Это не так сложно написать правильно. Я не могу найти никаких других ошибок или предупреждений в журналах httpd. apache: apache владеет каталогом и всеми подкаталогами / файлами. Здесь нет никаких символических ссылок или чего-либо еще. Что мне не хватает или на что еще следует обратить внимание, чтобы определить, почему это происходит?
ОС - CentOS 6.0
Вот учебный подход к случаю SELinux:
Узнайте, активен ли SELinux:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
Если да, то может помочь сравнительная проверка. Например, сервер имеет DocumentRoot по умолчанию в /var/www/html
, но мы хотим его где-нибудь еще, например /path/to/document/root
.
Если SELinux не возится активно с ресурсом, ls -dZ
в каталоге будет отображаться что-то вроде:
$ ls -dZ /path/to/document/root
? /path/to/document/root/
С другой стороны, если применяются контексты SELinux, ls -dZ
больше похоже:
$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root
Если сравнить с рабочим DocumentRoot, это будет выглядеть примерно так:
$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
В _r
и _t
относится к -r
(--role
и -t
(--type
) аргументы chcon
. Вот сокращенная страница руководства:
NAME
chcon - change file security context
SYNOPSIS
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
DESCRIPTION
Change the security context of each FILE to CONTEXT. With --reference,
change the security context of each FILE to that of RFILE.
--reference=RFILE
use RFILE's security context rather than specifying a CONTEXT value
-R, --recursive
operate on files and directories recursively
На первый взгляд может показаться, что следующее работает, а может и нет.
$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root
Если веб-сервер по-прежнему не видит DocumentRoot, обратите внимание, что контекст имеет значение вплоть до root:
$ sudo chcon -R -t httpd_sys_content_t /path/to/document
$ sudo chcon -R -t httpd_sys_content_t /path/to
$ sudo chcon -R -t httpd_sys_content_t /path
На этом этапе веб-сервер может видеть каталог.
Да, сегодня вечером я узнал на собственном горьком опыте.
ПРИМЕЧАНИЕ: использование chcon концептуально имеет обратную сторону согласно документации RedHat (5.6.1. Временные изменения: chcon), в котором говорится:
The chcon command changes the SELinux context for files. However, changes
made with the chcon command do not survive a file system relabel, or the
execution of the restorecon command.
Использовать semanage и восстановление чтобы внести более постоянные изменения. Краткий пример:
$ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
"/path/to/document/root(/.*)?"
$ sudo restorecon -FR /path/to/document/root
Что касается восстановление, Обратите внимание, что -F требуется, чтобы повлиять на весь контекст (т.е. на пользователя и тип). Также, -Р означает рекурсивно вносить изменения. Аргументы -v или -п может показать прогресс либо подробно, либо кратко. Использовать -FRnv чтобы увидеть, что произойдет, без внесения каких-либо изменений.
однажды semanage используется таким образом, можно просмотреть локальные изменения безопасности с помощью такой команды, как:
$ sudo semanage export
Выход semanage экспорт может быть сохранен и использован semanage импорт чтобы упростить применение набора изменений к различным системам.
ПРИМЕЧАНИЕ. Этот ответ предоставляет самый базовый контекст типа для сайта. Безопасность может быть гораздо более детальной. Например, просмотрите список типов, которые можно применить к страницам веб-сервера, с помощью такой команды, как:
$ seinfo -t | grep http
ПРИМЕЧАНИЕ. Такие утилиты, как semanage и seinfo не может быть установлен по умолчанию. По крайней мере, в некоторых дистрибутивах требуемые пакеты могут называться примерно так:
policycoreutils-python
setools-console
Первое, что пришло мне в голову, - есть ли у Apache разрешение на доступ к этому каталогу?
Также это: https://stackoverflow.com/questions/3948038/apache-says-my-documentroot-directory-doesnt-exist
Это похоже на SELinux, я бы посоветовал вам поработать с ним. Для подтверждения загляните в каталог / var / log / audit.
В худшем случае вы всегда можете отключить selinux, как отмечалось ранее, но я предлагаю вам поработать с ним. Например, если бы я создал каталог для использования с Apache, у него не было бы нужного контекста, как указано здесь.
[root@amp23140 www]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 whatever
Поэтому, если это произойдет, я просто применяю контекст из другого каталога, который в данном случае является html:
[root@amp23140 www]# chcon whatever --reference=html
[root@amp23140 www]# ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 whatever
Используйте эту команду в корневом каталоге, чтобы изменить контекст безопасности «httpd_sys_content_t», который позволяет запускать Apache.
chcon -R -h -t httpd_sys_content_t /var/www/whatever
Использовать ls -dZ /var/www/whatever
для просмотра деталей ролей безопасности