Несколько приложений mod_wsgi на одном виртуальном хосте, указывающие на неправильное приложение - PullRequest
42 голосов
/ 06 июля 2011

Я пытаюсь настроить два (или более) приложения Django в подкаталогах в одном домене, например:

http://example.com/site1/
http://example.com/site2/

Я знаю, что обычно это работает нормально, настраивая виртуальный хост apache, напримерthis:

<VirtualHost *:80>
    ...
    WSGIScriptAlias /site1 /path/to/site1.wsgi
    WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>

Теперь я проверил, что каждый сайт работает индивидуально.Но когда я пытаюсь запустить их одновременно, apache отправляет меня на тот сайт, который загружается первым.Пример:

  1. Перезапустить apache, настроенный для обслуживания 6 потоков
  2. Загрузить example.com/site1/, получить правильную страницу
  3. Загрузить example.com/site2/,получите правильную страницу
  4. Повторите 2 и 3 еще 2 раза.
  5. Повторно обновляйте example.com/site1/, просматривайте его с сайта на сайт.

По сути, для любого заданного числа рабочих процессов он циклически перебирает общее число отправляющих запрос тому, который выполнил первый, независимо от директивы WSGIScriptAlias.Неважно, что я делаю (устанавливая WSGIProcessGroup, режим демона или встроенный режим или директивы), он продолжает демонстрировать это поведение.

Если кто-то может указать на то, что я здесь делаю, это было бы феноменально!

Ответы [ 3 ]

53 голосов
/ 06 июля 2011

У меня было несколько приложений WSGI, запущенных в одной установке Apache, и я обнаружил, что проще всего сделать несколько групп процессов - по одной для каждого из приложений.

Один недостаток, по сравнению с попыткой заставить один процесс запустить оба (или более) приложения, заключается в том, что для этого может потребоваться немного больше резидентной памяти, чем вы могли бы избежать в противном случае. Но это держит их довольно хорошо отделенными и избегает хлопот. И это может не беспокоить вас (это было не для меня).

(Возможно, это не так уж и плохо, они могут обмениваться множеством текстовых страниц? Это просто пустые предположения; я не проверял это ни в коем случае, так как мои настройки совсем не требовали памяти)

Вот некоторые фрагменты моего httpd.conf, примерно:

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/apache/django.wsgi
<Location /khdx>
WSGIProcessGroup khdx_wsgi
</Location>

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/django-root/apache/django.wsgi
<Location /sauron>
WSGIProcessGroup sauron_wsgi
</Location>
11 голосов
/ 08 апреля 2014

Ответ Доминго Игнасио поставил меня на правильный путь.Я хотел бы отметить важный факт о том, как заставить его работать: две группы процессов должны находиться внутри одного и того же VirtualHost.(Это основано на моих тестах с Ubuntu 12.04.3 LTS, Apache 2.2.22 и парой приложений WSGI, написанных на Python.)

Например, это не работает для меняВ результате появилась возможность доступа к app1, но ошибка 404 для app2:

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>
</VirtualHost>

<VirtualHost *>
        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>

Удаление середины и тегов, чтобы иметь один VirtualHost, решило проблему:

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>

        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>
1 голос
/ 06 июля 2011

У меня были проблемы с этим сам. Вместо того, чтобы пытаться получить правильную конфигурацию Apache, я решил вместо этого использовать один WSGIScriptAlias ​​и иметь промежуточное программное обеспечение WSGI, которое перенаправляло запросы в правильные приложения. Мой код на https://github.com/zhemao/flotilla. Я не так много тестировал, поэтому используйте его с осторожностью, но я надеюсь, что это поможет.

...