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

Apache 2.4 с использованием DocumentRoot по умолчанию вместо VirtualHost DocumentRoot

Давний слушатель, первый раз звонил ...

Я много лет использую Apache и настроил несколько серверов. Это доставляет мне трудности, и я просто не могу определить проблему. Я видел несколько потоков здесь и в других местах с проблемами VirtualHost и обслуживанием неправильного DocumentRoot, но ни один из этих потоков мне не помог.

Сервер работает под управлением Centos 7.5, с включенным SELinux, Apache 2.4.33.

Я хочу запустить два VirtualHosts. По какой-то причине вторичный VH не обслуживает нужные файлы. Изменение порядка VH не имело значения. Последнее, что я пробовал, - это жестко кодировать DocumentRoot по умолчанию (/ var / www / html), а затем помещать каждый VH в отдельный каталог (/ var / www / VirtualHost).

Вот мой текущий файл virtualhost.conf:

#Set a default DocumentRoot
DocumentRoot /var/www/html

<VirtualHost *:80>
    ServerAdmin webmaster@example1.com
    DocumentRoot /var/www/example2.com
    ServerName example2.com
    ServerAlias www.example2.com
</VirtualHost>

<Directory /var/www/example2.com>
    Options -Indexes +FollowSymLinks +MultiViews
    Order allow,deny
    Allow from all
</Directory>

<VirtualHost *:80>
    ServerAdmin webmaster@example1.com
    DocumentRoot /var/www/example1.com
    ServerName example1.com
    ServerAlias www.example1.com
</VirtualHost>

<Directory /var/www/example1.com>
    Options -Indexes +FollowSymLinks +MultiViews
    Order allow,deny
    Allow from all
</Directory>

В своих журналах я вижу, что все запросы обслуживаются из / var / www / html, по умолчанию.

Я временно изменил используемый формат журнала, чтобы я мог видеть используемое имя сервера и точное имя файла, на которое ссылаются для проверки пути.

LogFormat "%v %f %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

На локальном сервере я запускаю следующие две команды для тестирования:

wget http://example1.com/index.html
wget http://example2.com/images/logo.jpg

Мой журнал доступа показывает это:

example1.com /var/www/html/index.html 192.168.1.2 - - [18/Jul/2018:11:48:08 -0500] "GET /index.html HTTP/1.1" 404 208 "-" "Wget/1.14 (linux-gnu)"
example2.com /var/www/html/images 192.168.1.2 - - [18/Jul/2018:11:48:12 -0500] "GET /images/logo.jpg HTTP/1.1" 404 213 "-" "Wget/1.14 (linux-gnu)"

Из журнала я вижу, что отображается правильный домен, но путь к файлу явно неправильный, Apache пытается вытащить запрошенные файлы из DocumentRoot по умолчанию, а не из DocumentRoot, определенного для VirtualHosts, который был бы / var /www/example(x).com.

Вывод команды httpd -S следующим образом:

[wright@web2 conf.d]$ httpd -S
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using web2.local. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server example2.com (/etc/httpd/conf.d/vhosts.conf:4)
         port 80 namevhost example2.com (/etc/httpd/conf.d/vhosts.conf:4)
                 alias www.example2.com
         port 80 namevhost example1.com (/etc/httpd/conf.d/vhosts.conf:17)
                 alias www.example1.com
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Mutex authdigest-opaque: using_defaults
Mutex watchdog-callback: using_defaults
Mutex proxy-balancer-shm: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex authdigest-client: using_defaults
Mutex lua-ivm-shm: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex authn-socache: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/run/httpd/" mechanism=default
Mutex mpm-accept: using_defaults
Mutex cache-socache: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=48 not_used
Group: name="apache" id=48 not_used
[wright@web2 conf.d]$

Любая помощь приветствуется!

Мне удалось решить мою проблему, и, естественно, она не имела ничего общего с тем, что я опубликовал выше. Надеюсь, это поможет кому-то еще в будущем.

Основная причина моей проблемы оказалась моей установкой PHP 7, в частности с настройкой php-fpm. В руководстве, которому я следовал, предлагалось создать файл fpm.conf со следующим:

# PHP scripts setup 
ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html

Alias / /var/www/html/

Благодаря этой конфигурации мой DocumentRoot был переписан для всех моих VirtualHosts на указанный выше путь. Только когда я сбросил все свои файлы конфигурации в поисках «/ var / www», я наткнулся на этот файл.

Дальнейшие поиски в Google о том, как включить PHP-FPM с VirtualHosts, привели меня к странице, на которой был этот блок кода в каждом блоке VirtualHost:

<FilesMatch \.php$>
    # 2.4.10+ can proxy to unix socket
    # SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost/"

    # Else we can just use a tcp socket:
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

Добавление этого блока к обоим моим VirtualHosts, удаление старого файла fpm.conf и перезапуск Apache решили мою проблему, теперь для каждого VHost использовался правильный DocumentRoot. Еще предстоит определить, будут ли мои файлы PHP обслуживаться правильно, но, по крайней мере, теперь я на правильном пути.