Давний слушатель, первый раз звонил ...
Я много лет использую 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 обслуживаться правильно, но, по крайней мере, теперь я на правильном пути.