Вопрос или проблема
У меня маленькая проблема с конфигурацией виртуального хоста на Apache2.
Контекст: у меня есть Raspberry Pi с установленным Apache2. Я хочу получить доступ к своей тестовой директории по пути: “/var/www/html/test”.
Поэтому я изменил файл 000-default.conf в “/etc/apache2/sites-available” следующим образом, и это сработало:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
NameVirtualHost 192.168.1.29:80
<VirtualHost 192.168.1.29:80>
ServerName raspyvan
DocumentRoot /var/www/html/test
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
(raspyvan – это имя моего сервера на маршрутизаторе и в файле hosts)
Но я хотел бы запретить доступ с IP-адреса “192.168.1.29”.
Поэтому я во второй раз изменил файл 000-default.conf следующим образом:
Listen 192.168.1.29:80
ServerName DefaultServer
DocumentRoot /var/www/html
NameVirtualHost 192.168.1.29:80
<VirtualHost 192.168.1.29:80>
ServerName 192.168.1.29
<Directory />
Deny from all
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.29:80>
ServerName raspyvan
DocumentRoot /var/www/test
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Теперь проблема в том, что доступ по IP и имени хоста запрещен, и я не знаю, почему.
Правка: мой сервер имен используется в настройках DNS маршрутизатора и файле hosts для Apache.
Когда Apache не может сопоставить виртуальный хост, он всегда будет использовать первый виртуальный хост, с которым столкнётся (поэтомуhistorически нам требовался один IP для каждого SSL сертификата, пока не появился SNI).
Добавьте лог для каждого виртуального хоста;
ErrorLog ${APACHE_LOG_DIR}/error-default.log
CustomLog ${APACHE_LOG_DIR}/access-default.log combined
и
ErrorLog ${APACHE_LOG_DIR}/error-raspyvan.log
CustomLog ${APACHE_LOG_DIR}/access-raspyvan.log combined
Проверьте файл лога “access-default.log”, чтобы узнать, какой хост запрашивался.
Ответ или решение
Для решения проблемы с конфигурацией виртуальных хостов в Apache2 на вашем Raspberry Pi, давайте проанализируем вашу настройку и предложим несколько рекомендаций.
Контекст
Вы хотите настроить виртуальные хосты на Apache для доступа к каталогу /var/www/html/test
, а также ограничить доступ к вашему серверу по IP-адресу 192.168.1.29
. После внесения изменений, указанных в вашем вопросе, доступ к серверу как по IP-адресу, так и по имени хоста ("raspyvan") стал заблокирован.
Анализ конфигурации
-
Первая конфигурация:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> NameVirtualHost 192.168.1.29:80 <VirtualHost 192.168.1.29:80> ServerName raspyvan DocumentRoot /var/www/html/test </VirtualHost>
-
Вторая конфигурация:
Listen 192.168.1.29:80 ServerName DefaultServer DocumentRoot /var/www/html NameVirtualHost 192.168.1.29:80 <VirtualHost 192.168.1.29:80> ServerName 192.168.1.29 <Directory /> Deny from all </Directory> </VirtualHost> <VirtualHost 192.168.1.29:80> ServerName raspyvan DocumentRoot /var/www/test </VirtualHost>
Проблемы и решения
-
Неправильная директива Deny: В конфигурации второго виртуального хоста вы добавили директиву
<Directory />
, которая запрещает доступ ко всем каталогам. Это, скорее всего, приводит к блокировке доступа. Замените это на:<Directory /var/www/html/test> Allow from all </Directory>
-
Расположение и порядок виртуальных хостов: Убедитесь, что ваши виртуальные хосты правильно расположены и проверяются в правильном порядке. Apache обрабатывает конфигурации сверху вниз; поэтому, если в качестве первого вхождения возникает хост с директивой Deny, это может затруднить доступ к другим.
-
Логирование для отладки: Добавление отдельных логов для каждого виртуального хоста поможет вам лучше понять, что происходит. Как вы уже предложили, вы можете добавить следующее в вашу конфигурацию:
<VirtualHost 192.168.1.29:80> ServerName raspyvan DocumentRoot /var/www/test ErrorLog ${APACHE_LOG_DIR}/error-raspyvan.log CustomLog ${APACHE_LOG_DIR}/access-raspyvan.log combined </VirtualHost> <VirtualHost 192.168.1.29:80> ServerName 192.168.1.29 <Directory /> Deny from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error-default.log CustomLog ${APACHE_LOG_DIR}/access-default.log combined </VirtualHost>
-
Перезапуск Apache: После внесения изменений в конфигурацию обязательно перезапустите веб-сервер, чтобы они вступили в силу:
sudo systemctl restart apache2
-
Проверка на конфликты в DNS: Убедитесь, что ваш роутер правильно настроен для разрешения имени "raspyvan" на IP-адрес 192.168.1.29. Проверьте файл hosts на сервере (обычно
/etc/hosts
), чтобы убедиться, что он правильно настроен.
Заключение
Следуя вышеперечисленным рекомендациям, вы сможете устранить проблемы с доступом к вашим виртуальным хостам. Обязательно тщательно следите за логами, это поможет вам своевременно отлавливать любые возникающие ошибки. Удачи в ваших начинаниях с Apache2 на Raspberry Pi!