Добавление сайта Django нарушает работу моих виртуальных хостов в CentOS 7

#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> .