Назад | Перейти на главную страницу

Apache говорит, что DocumentRoot не существует, хотя есть

Я использовал 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 для просмотра деталей ролей безопасности