Apache каже, що DocumentRoot не існує, коли він є


12

Я використовував 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


su для користувача Apache і побачити, чи може він отримати доступ до DocumentRoot, це може дати вам деяке уявлення про те, що бачить веб-сервер. Ви також можете перевірити інші каталоги на шляху, хоча якщо це дійсно під /var/www/тими, не повинно бути проблем
— voretaq7

Відповіді:


8

Перше, що мені спало на думку, - чи має Apache дозвіл на доступ до цього каталогу?

Також це: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
Як я вже говорив, так, до каталогу належить apache:apache, але я перейшов за цим посиланням (це чомусь на SO?), І справді проблема в SELinux. SELinux спричиняє більше проблем, тому що це добре.
— Джейк Вілсон

selinux спочатку дратує, але якщо ви знаєте команди управління доступом, насправді це не так страшно. Це хороший інструмент для використання, коли ви звикнете до нього.
— Ріліндо

У мене була та сама проблема (не існує на symlink), і запускається setenforce 0її виправлена, але, дивлячись на дозволи ls-laZ, симпосилання має ті ж дозволи, що й інші файли, до яких вона може отримати доступ, крім chmod Файли -rw-r - r--, а символьне посилання lrwxrwxrwx. Чи може це бути причиною того, що він не працює з setenforce 1?
— TMH

@JakeWilson SELinux досить засмучує, коли ти вперше звикаєш до цього. Чим більше ви навчитесь ним користуватися, я обіцяю, що ви оціните це набагато більше.
— Спенсер Вільямс

16

Ось підручник підхід до справи 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, зауважте, що контекст має значення аж до кореня:

$ 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 і restorecon зробити більш постійні зміни. Короткий приклад:

 $ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
     "/path/to/document/root(/.*)?"
 $ sudo restorecon -FR /path/to/document/root

Що стосується відновленняconcon , зауважте, що -F повинен впливати на весь контекст (тобто користувача та тип). Також -R означає вносити зміни рекурсивно. Аргументи -v або -p можуть демонструвати прогрес як у багатослівній, так і в стислій формі. Використовуйте -FRnv, щоб побачити, що станеться без фактичних змін.

Після того, як семанювання використовується таким чином, можна переглянути локальні зміни безпеки за допомогою команди типу:

$ sudo semanage export

Вихід semanage експорту може бути збережений і використаний semanage імпорту , щоб зробити його простіше застосовувати набір змін в різні системи.

ПРИМІТКА. Ця відповідь надає основний контекст типу для сайту. Безпека може бути набагато більш детальною. Наприклад, перегляньте список типів, які можна застосувати до сторінок веб-сервера з такою командою:

$ seinfo -t | grep http

ПРИМІТКА. Утиліти, такі як semanage та seinfo, можуть не встановлюватися за замовчуванням. Принаймні, в деяких дистрибутивах необхідні пакети можуть бути названі приблизно так:

policycoreutils-python
setools-console

Детально, працює і економить багато часу - дякую!
— NorthBridge

6

Це звучить як 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

0

Використовуйте цю команду в корені, щоб змінити контекст безпеки "httpd_sys_content_t", який дозволяє Apache виконувати.

chcon -R -h -t httpd_sys_content_t /var/www/whatever

Використовуйте ls -dZ /var/www/whateverдля перегляду деталей ролей безпеки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.