Как я могу создать псевдоним одного каталога в моей файловой системе и его подкаталога в файле WSGI в Apache? - PullRequest
0 голосов
/ 10 ноября 2009

Я использую nginx в качестве обратного прокси для apache / mod_wsgi и Django. В настоящее время все работает нормально с / aliasing моего wsgi-файла и / media с псевдонимом моего медиа-каталога. Однако я хочу настроить его так, чтобы / media / foo / bar также псевдоним моего файла wsgi, так что /media/foo/example.txt будет служить example.txt с apache, но / media / foo /bar/example.txt будет передан моему urls.py в Django.

Я пытался добавить еще один WSGIScriptAlias ​​в мой apache.conf выше моего псевдонима для / media /, но /media/foo/bar/example.txt все еще обслуживается apache. Мой apache.conf в настоящее время выглядит так:

<VirtualHost *:8080>
    #DocumentRoot /var/www/mydomain.com/public
    ServerName mydomain.com
    ErrorLog /var/www/mydomain.com/logs/apache_error_log
    CustomLog /var/www/mydomain.com/logs/apache_access_log common

    WSGIScriptAlias /media/foo/bar /var/www/mydomain.com/src/myproject/server/django.wsgi
    Alias /media/ /var/www/mydomain.com/public/media/
    <Directory /var/www/mydomain.com/public/media>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIScriptAlias / /var/www/mydomain.com/src/myproject/server/django.wsgi

    <Directory /var/www/mydomain.com/src/myproject/server>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Поскольку псевдонимы и WSGIScriptAlias ​​имеют разные уровни приоритета, вы не можете создать многоуровневый перекрывающийся набор URL-адресов более двух уровней, который чередуется между их использованием. Решение состоит в том, чтобы использовать директивы Alias ​​/ AliasMatch для всех вложенных URL-адресов, чтобы они оценивались с одинаковым уровнем приоритета. Можно по-прежнему использовать WSGIScriptAlias ​​для корня сайта.

Таким образом, попробуйте использовать следующую директиву в таком порядке, чтобы большинство вложенных шаблонов URL было раньше, чем внешние URL.

<VirtualHost *:8080>
#DocumentRoot /var/www/mydomain.com/public
ServerName mydomain.com
ErrorLog /var/www/mydomain.com/logs/apache_error_log
CustomLog /var/www/mydomain.com/logs/apache_access_log common

AliasMatch ^/(media/foo/bar/.*) /var/www/mydomain.com/src/myproject/server/django.wsgi/$1
Alias /media/ /var/www/mydomain.com/public/media/
WSGIScriptAlias / /var/www/mydomain.com/src/myproject/server/django.wsgi

<Directory /var/www/mydomain.com/src/myproject/server>
    Options ExecCGI
    AddHandler wsgi-script .wsgi
    # WSGIApplicationGroup %{GLOBAL}
    Order allow,deny
    Allow from all
</Directory>

<Directory /var/www/mydomain.com/public/media>
    Order deny,allow
    Allow from all
</Directory>
</VirtualHost>

AliasMatch используется для большинства вложений, так как нам нужно отрегулировать значение SCRIPT_NAME, т. Е. Точку монтирования, видимую приложением Django, так что запрос по-прежнему относится к экземпляру Django, смонтированному в корневом каталоге. Если этого не сделать, шаблоны urls.py не будут работать так, как вы ожидаете для этого суб-URL. Использование AliasMatch и добавление сопоставленного подшаблона в RHS после пути к скрипту с использованием $ 1 достигает этого.

Хотя Django монтируется с помощью двух разных директив, рассчитанное значение SCRIPT_NAME должно быть одинаковым для обоих, поэтому следует использовать один и тот же субинтерпретатор Python. Если по какой-то причине вы считаете, что объем используемой памяти в два раза больше ожидаемого, т. Е. Два экземпляра Django выполняются в разных субинтерпретаторах, вы можете заставить их работать в одном и том же месте, раскомментировав директиву WSGIApplicationGroup выше. Это не должно требоваться, хотя, и если вы считаете, что вам это нужно, лучше зайдите в список рассылки mod_wsgi и можете научить вас, как проверить, правильно ли вы поступаете, а что нет.

1 голос
/ 10 ноября 2009

Быстрый взлом состоит в том, чтобы переместить mod_wsgi впереди mod_alias в вашей конфигурации Apache, но на самом деле это приведет к обработке / media вашим приложением Django.

Если AliasMatch поддерживает регулярные регулярные выражения, вы должны сделать это:

AliasMatch / media / (?! foo)…

Это должно избежать этой проблемы - при этом я склонен рекомендовать подачу мультимедиа с другого имени хоста (media.example.org), поскольку это дает некоторые хорошие преимущества в производительности клиента благодаря параллелизму и упрощает вопросы оптимизации сервера.

...