несколько проектов Django виртуальные хосты apache

#django #apache #mod-wsgi

#django #apache #мод-wsgi

Вопрос:

Я новичок в apache. Итак, я пытаюсь запустить по крайней мере два разных проекта django на одном сервере Ubuntu с одним IP-адресом.

  • IP: 123.456.789
  • Домен 1: www.example.de для Project1
  • Домен 2: www.test.de для Proejct2

DNS для обоих доменов указывает на один и тот же IP-адрес. Я использую apache2 с mod_wsgi в режиме демона. Каждый проект имеет свой собственный каталог в ~/ . Я также установил virtaulenv с python внутри директорий проекта

Проблема в том, что независимо от того, как я настраиваю apache2.conf, оба домена указывают на Project1. Странно то, что они даже делают это, когда я комментирую все пользовательские настройки в apache2.conf. Может кто-нибудь, пожалуйста, объяснить это?

вот мой apache2.conf

 Listen 80
<VirtualHost *:80>
    ServerName www.example.de
    WSGIScriptAlias / /home/user/example/example-project/wsgi.py
    Alias /static/ /home/user/example/static/
    WSGIPythonPath /home/user/example
    <Directory /home/user/example/static>
        Require all granted
    </Directory>
    <Directory /home/user/example/example>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    WSGIDaemonProcess example.de python-path=/home/user/example:/home/user/example/exampleenv/lib/python2.7/site-packages
    WSGIProcessGroup example.de
</VirtualHost>

Listen 8080
<VirtualHost *:80>
    Servername www.test.de
    WSGIScriptAlias / /home/user/test/test-project/wsgi.py
    Alias /static/ /home/user/test/static/
    <Directory /home/user/test/static>
        Require all granted
    </Directory>
    <Directory /home/user/test/test-project>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    WSGIDaemonProcess test.de python-path=/home/user/test:/home/user/test/testenv/lib/python2.7/site-packages
    WSGIProcessGroup test.de
</VirtualHost>
  

Даже если с моей конфигурацией что-то не так, почему она все еще запускается, когда я комментирую все в этом блоге? Откуда еще apache получает информацию?

Ответ №1:

Тема о том, почему ваши запросы могут в конечном итоге обрабатываться неправильным экземпляром Django, была подробно задокументирована в сообщении в блоге на:

Существует множество возможных ситуаций, описанных в этом сообщении в блоге относительно того, что может пойти не так.

В вашем случае это звучит так, как будто виртуальный хост для второго, если в отдельном файле, возможно, не был включен, и поэтому веб-сервер даже не читает файл. Следствием этого является то, что Apache отправит все запросы на первый виртуальный хостинг, если он не сможет найти подходящее соответствие, используя виртуальный хостинг на основе имени.

Я бы предложил добавить синтаксическую ошибку ко второму виртуальному хосту (‘xxx’ в отдельной строке) и посмотреть, выдает ли Apache ошибку при попытке запуска. Это подтвердит, читается ли файл.

Комментарии:

1. Да, я получаю синтаксическую ошибку во втором виртуальном хосте. Это действительно странно, даже когда я комментирую все строки с первого виртуального хоста, все домены направляют меня к первому виртуальному хостингу.

2. Добавить в глобальную область за пределами всех VirtualHost определений, WSGIRestrictEmbedded On . Это гарантирует, что mod_wsgi запускается только в процессах daemon, и ничто не может запускаться во встроенном режиме. Возможно, ничего не изменится, но хочется проверить, что каким-то образом не найдено какое-либо определение, в котором оно выполняется во встроенном режиме. Если после добавления произойдет сбой, это может быть полезно знать. Кстати, это ваши реальные имена хостов или вы изменили конфигурацию, чтобы защитить реальные?

3. Хорошо, теперь я понимаю, что все это работает просто отлично. Оба проекта были в основном одинаковыми, я просто изменил <h1>-тег в Project2 и подумал, что увижу разницу. Ну, я этого не сделал, я думаю, потому что сайт кэшируется где-то на serversite. Теперь мне просто нужно выяснить, где…

4. Читать modwsgi.readthedocs.io/en/develop/user-guides/… Изменение кода диска не означает, что все будет автоматически отражено в том, что обслуживается. В вашем случае, хотя это звучит немного дольше срока службы на кэшированных страницах.

Ответ №2:

 <VirtualHost *:80>

ServerName www.example1.com
ServerAlias example1.com
ServerAdmin admin@example1.com

DocumentRoot "/var/www/example1"

WSGIScriptAlias / /var/www/example1/example1/wsgi.py
WSGIDaemonProcess www.example1.com python-path=/var/www/example1:/usr/local/lib/python2.7/site-packages

<Location />
WSGIProcessGroup www.example1.com
</Location>

<Directory /var/www/example1>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

ErrorLog /var/www/logs/example1.log

</VirtualHost>


<VirtualHost *:80>

ServerName www.example2.com
ServerAlias exolcorporation.com
ServerAdmin admin@example2.com

DocumentRoot "/var/www/example2"

WSGIScriptAlias / /var/www/example2/example2/wsgi.py
WSGIDaemonProcess www.example2.com python-path=/var/www/example2:/usr/local/lib/python2.7/site-packages

<Location />
WSGIProcessGroup www.example2.com
</Location>

<Directory /var/www/example2>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

ErrorLog /var/www/logs/example2.log

</VirtualHost>
  

попробуйте заменить пути и доменные имена следующим образом
в WSGIDaemonProcess используйте путь к вашему virtualenv
в этом примере я не использовал virtualenv
этот код отлично работает для меня на aws ubuntu

Комментарии:

1. проверю завтра, есть идеи о том, почему apache запускает мой проект, хотя я удалил все связанные строки в apache.conf?