#django #apache #virtualhost #httpd.conf #centos7
#django #apache #virtualhost #httpd.conf #centos7
Вопрос:
У меня есть сервер CentOS 7 с примерно 20 доменами, все из которых автоматически управляются с помощью файла vhosts в /etc / httpd / conf.d.
Я пытаюсь изучить Django и хотел настроить один домен, используя его, поэтому я добавил конкретный virtualhost в файл .conf.
В результате домен Django работает нормально, но все остальные сайты не работают (попробуйте использовать Django, но это приведет к ошибкам).
В домене Django есть две папки: djangodomain.com для статических файлов и djangodomain.app для файлов Python.
Как я могу интегрировать один домен Django в существующую настройку виртуального хоста с множеством доменов?
Существующие vhosts.conf:
<VirtualHost *:80>
serveradmin username@domain.com
serveradmin username@domain.com
usecanonicalname off
# www.site.com » site.com
rewriteengine on
rewritecond %{HTTP_HOST} ^www.(.*)$ [nc]
rewriterule ^(.*)$ http://%1 [r=301,l]
# file locations
virtualdocumentroot "/home/username/%0"
<directory "/home/username/*">
allowoverride all
require all granted
options indexes followsymlinks
options execcgi
options includes
</directory>
</VirtualHost>
Что я добавил, что нарушило работу всех сайтов, кроме сайта Django:
<VirtualHost djangodomain.com:80>
ServerName djangodomain.com
ServerAlias www.djangodomain.com
ServerAdmin user@domain.com
DocumentRoot /home/username/djangodomain.com
WSGIScriptAlias / /home/username/djangodomain.app/django.wsgi
<Directory /home/username/djangodomain.app>
Order allow,deny
Allow from all
</Directory>
Alias /robots.txt /home/username/djangodomain.com/robots.txt
Alias /favicon.ico /home/username/djangodomain.com/favicon.ico
Alias /images /home/username/djangodomain.com/images
Alias /static /home/username/djangodomain.com/static
ErrorLog /home/username/djangodomain.logs/error.log
CustomLog /home/username/djangodomain.logs/access.log combined
</VirtualHost>
Переадресовано в unix.stackexchange.com
Комментарии:
1. Похоже, вам просто нужно в файле vhosts.conf поместить часть django внизу
2. Я пробовал это, но это ничего не изменило. Я также попытался поместить его в отдельный файл, загруженный после динамических виртуальных хостов.
3. Не используйте имена в директиве virtualhost.
Ответ №1:
Когда Apache получает HTTP-запрос, ему необходимо знать, какой виртуальный хост должен обработать этот запрос. Теперь это работает так. Apache получает IP-адрес, на который поступил запрос клиента (IP-адрес сервера, а не клиента), и просматривает список определений виртуальных хостов, чтобы найти любые виртуальные хосты, определенные для этого IP. Если их несколько, он посмотрит на заголовок Host и попытается сопоставить его с конкретным ServerName или директивой ServerAlias. Если он по-прежнему не может его найти, он будет искать виртуальный хост по умолчанию.
У вас есть два определения виртуального хоста. Один, если vhost по умолчанию на порту 80 <VirtualHost *:80>
. Это значение по умолчанию, потому что оно имеет * для IP. Другое зависит от IP-адреса <VirtualHost djangodomain.com:80>
. Используемый им IP-адрес является любым djangodomain.com решает проблему.
Таким образом, любой запрос, который поступает на этот IP, будет обработан конкретной конфигурацией IP, прежде чем ему может быть разрешено перейти в режим default.
Чтобы исправить это, вам нужно заменить директиву виртуального хоста django на <VirtualHost *:80>
, такую же, как у других ваших виртуальных хостов. Это должно поставить их всех в один и тот же приоритет синтаксического анализа, и он будет просто использовать заголовок Host, чтобы выяснить остальное.
Тем не менее, если вы используете веб-сервер с более чем 20 виртуальными хостами, вам действительно нужно лучше понимать, как это работает. Почитайте о HTTP и веб-хостинге, когда у вас будет время.
Комментарии:
1. Получилось сделать так, как вы предложили, и поместить хост Django ПОСЛЕ динамических хостов, используя <VirtualHost *: 80> .