Apache spune că DocumentRoot nu există când există (Administrarea sistemului, Apache 2.2, Centos)

Jake Wilson a intrebat.

Am folosit Webmin pentru a crea următoarea gazdă virtuală:

<VirtualHost *:80>
        DocumentRoot "/var/www/whatever"
        ServerName whatever.ourdomain
        <Directory "/var/www/whatever">
                allow from all
                Options +Indexes
        </Directory>
</VirtualHost>

Și când repornesc Apache, primesc

Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist

Chestia este că directorul există cu siguranță. Mă uit direct la el. pwd îmi arată că este directorul meu curent, etc. Nu e așa de greu să îl scriu corect. Nu găsesc alte erori sau avertismente în jurnalele httpd. apache:apache deține directorul și toate subdirectoarele/fișierele. Nu există niciun fel de legături simbolice sau altceva implicat aici. Ce îmi scapă sau la ce altceva ar trebui să mă uit pentru a determina de ce se întâmplă acest lucru?

Sistemul de operare este CentOS 6.0

Comentarii

  • Su la utilizatorul Apache și vedeți dacă acesta poate accesa directorul DocumentRoot, , care ar putea să vă dea o idee despre ceea ce vede serverul web. De asemenea, este posibil să doriți să verificați și celelalte directoare de-a lungul căii, deși dacă este într-adevăr sub /var/www/ acestea nu ar trebui să fie o problemă –  > Por voretaq7.
4 răspunsuri
yrosen

Primul lucru care mi-a venit în minte este dacă Apache are permisiunea de a accesa acel director?

De asemenea, acest lucru: https://stackoverflow.com/questions/3948038/apache-says-my-documentroot-directory-doesnt-exist

Comentarii

  • După cum am spus, da, directorul este deținut de către apache:apache, , cu toate acestea, am urmat acest link (care este pe SO din anumite motive?) și, într-adevăr, SELinux a fost problema. SELinux cauzează mai multe probleme decât beneficii, imo. –  > Por Jake Wilson.
  • selinux este enervant la început, dar dacă știți comenzile pentru a gestiona accesul, de fapt nu este atât de descurajant. Este un instrument bun de utilizat odată ce te obișnuiești cu el. –  > Por Rilindo.
  • Am avut aceeași problemă (Doesn’t exist on a symlink), și rulând setenforce 0 a rezolvat-o, dar uitându-mă la permisiuni ls-laZ, , symlink-ul are aceleași permisiuni ca și alte fișiere pe care le poate accesa, în afară de chmod. Fișierele sunt -rw-r–r–, iar symlink-ul este lrwxrwxrwxrwx. Acesta ar putea fi motivul pentru care nu funcționează cu setenforce 1? –  > Por TMH.
  • @JakeWilson SELinux este destul de frustrant atunci când te obișnuiești cu el pentru prima dată. Cu cât înveți mai mult cum să-l folosești, îți promit că îl vei aprecia mult mai mult. –  > Por Spencer Williams.
kbulgrien

Iată o abordare de tip tutorial a cazului SELinux:

Aflați dacă SELinux este activ:

 $ sestatus
 SELinux status:                 enabled
 SELinuxfs mount:                /selinux
 Current mode:                   enforcing
 Mode from config file:          enforcing
 Policy version:                 24
 Policy from config file:        targeted

Dacă da, unele verificări comparative ar putea ajuta. De exemplu, un server are un DocumentRoot implicit la /var/www/html, , dar noi îl dorim în altă parte, cum ar fi /path/to/document/root.

Dacă SELinux nu se joacă în mod activ cu resursa, ls -dZ pe director va arăta ceva de genul:

$ ls -dZ /path/to/document/root
? /path/to/document/root/

Pe de altă parte, dacă se aplică contexte SELinux, ls -dZ arată mai degrabă ca:

$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root

Dacă comparăm cu un DocumentRoot funcțional, acesta ar arăta ceva de genul::

$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

Site-ul _r și _t se referă la -r (--role și -t (--type) argumente la chcon. Iată o pagină de manual redusă:

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

La prima vedere, următoarele ar putea părea să funcționeze, dar s-ar putea să nu funcționeze.

$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root

Dacă serverul web tot nu poate vedea DocumentRoot, rețineți că contextul contează până la rădăcină:

$ 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

În acest moment, serverul web poate vedea directorul.

Da, am învățat pe calea cea mai grea în această seară.

NOTĂ: Utilizarea chcon din punct de vedere conceptual are un dezavantaj conform documentației RedHat (5.6.1. Modificări temporare: chcon) care precizează:

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.

Utilizați semanage și restorecon pentru a face modificări mai permanente. Un scurt exemplu:

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

În ceea ce privește restorecon, , rețineți că -F este necesar pentru a afecta întregul context (adică utilizatorul și tipul). De asemenea, -R înseamnă efectuarea modificărilor în mod recursiv. Argumente -v sau -p pot afișa progresul fie în mod verbos, fie laconic. Utilizați -FRnv pentru a vedea ce s-ar întâmpla fără a face efectiv modificări.

Odată ce semanage este utilizat în acest mod, este posibil să se vizualizeze modificările de securitate locale cu o comandă de genul:

$ sudo semanage export

Ieșirea comenzii semanage export poate fi salvată și utilizată de către semanage import pentru a facilita aplicarea unui set de modificări la diferite sisteme.

NOTĂ: Acest răspuns oferă cel mai elementar context de tip pentru un site. Securitatea poate fi mult mai granulară. De exemplu, vedeți o listă de tipuri care se pot aplica paginilor serverului web cu o comandă de genul

$ seinfo -t | grep http

NOTĂ: Utilități precum semanage și seinfo este posibil să nu fie instalate în mod implicit. Cel puțin pe unele distribuții, pachetele necesare pot fi denumite astfel:

policycoreutils-python
setools-console

Comentarii

  • Detaliat, funcționează și economisește mult timp – vă mulțumesc! –  > Por NorthBridge.
Rilindo

Pare a fi SELinux. îți sugerez să lucrezi cu el. Uitați-vă în directorul /var/log/audit pentru a confirma.

În cel mai rău caz, puteți oricând să dezactivați selinux, așa cum am menționat mai devreme, dar vă sugerez să lucrați cu el în schimb. De exemplu, dacă ar fi să creez un director pentru a fi utilizat cu Apache, acesta nu va avea contextul potrivit, după cum se observă aici.

[[email protected] 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

Așa că, dacă se întâmplă acest lucru, nu fac decât să aplic contextul dintr-un alt director, care, în acest caz, este html:

[[email protected] www]# chcon whatever --reference=html
[[email protected] 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

user236790

Utilizați această comandă în root pentru a schimba contextul de securitate „httpd_sys_content_t” care permite Apache să execute.

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

Utilizați ls -dZ /var/www/whatever pentru a vizualiza detaliile rolurilor de securitate