Configure o Apache para manipular um subcaminho usando o WSGI

1

Estou tentando configurar o Apache, Django e mod_xsendfile para permitir que eu controle o acesso a certos arquivos usando a autenticação do Django enquanto ainda usa o Apache para enviar os dados reais do arquivo.

Eu tenho um problema com essa configuração:

# Some files must be publicly available without the Django auth check.
# When I comment this out, public media is not accessible but the WSGI script for
# /media/attachment DOES get called.
# So I think I need to somehow exclude /media/attachment from the effect of this Alias

Alias /media/ /var/www/vhosts/domain.com/subdomains/project/httpdocs/media/

# This <Location> block disables everything (Forbidden) regardless of the WSGI stuff
#
#<Location /media/attachments>
#    Deny from all
#</Location>

WSGIScriptAlias / /var/www/vhosts/cdomain.com/subdomains/project/httpdocs/web/apache/django.wsgi
WSGIScriptAlias /media/attachments /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi

XSendFile On

Como posso dizer ao Apache para encaminhar solicitações para / media / attachments por meio dos scripts WSGI e servir o restante de / media diretamente?

    
por Tomas Andrle 28.08.2009 / 01:17

1 resposta

5

A diretiva Alias tem precedência sobre WSGIScriptAlias, portanto, você não pode montar o aplicativo WSGI sob uma URL especificada pela diretiva Alias.

Como é, você também teria tido um problema aqui com várias instâncias do Django sendo inicializadas em cada processo, devido a várias diretivas WSGIScriptAlias, a menos que você tenha usado a diretiva WSGIApplicationGroup para forçá-los a serem delegados ao mesmo subinterpretador Python dentro dos processos.

Quanto a uma solução, é um pouco complicado fazer o que você quer por causa do layout que você está usando. Eu tenho uma ideia, mas precisaria testá-la primeiro.

ATUALIZAÇÃO 1

A primeira possibilidade é que, se você tem tudo em sub-diretórios tradicionais de 'css', 'img' e 'js' como usado pelo Django, em vez da diretiva Alias acima, use:

AliasMatch ^/(css|img|js)(/.*)$ /var/www/vhosts/domain.com/subdomains/project/httpdocs/media/$1$2

e excluir:

WSGIScriptAlias /media/attachments /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi

Isso deve significar que apenas os arquivos estáticos nesses subdiretórios corresponderão à diretiva Alias e serão veiculados diretamente.

ATUALIZAÇÃO 2

A outra opção, que eu tive que testar, é não usar o WSGIScriptAlias, mas usar a diretiva Alias para tudo. Isso seria feito como:

Alias /media/attachments/ /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi
Alias /media/ /usr/local/django/example/media/
Alias / /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache/django.wsgi

<Directory /var/www/vhosts/domain.com/subdomains/project/httpdocs/web/apache>
WSGIApplicationGroup %{GLOBAL}
AddHandler wsgi-script .wsgi
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

Como a diretiva Alias é usada sozinha, todas avaliadas no mesmo nível de precedência. Você só precisa garantir que os URLs aninhados mais profundamente vêm em primeiro lugar.

Em vez de WSGIScriptAlias, usamos AddHandler para mapear o arquivo .wsgi como um arquivo de script WSGI e definir a opção ExecCGI para que o mod_wsgi permita que seja usado como arquivo de script WSGI.

Nós configuramos o WSGIApplicationGroup apenas para garantir que apenas uma instância do Django seja criada em cada processo. O valor de% {GLOBAL} faz com que ele use o interpretador principal do Python.

Então, duas opções dependendo da sua fantasia.

    
por 28.08.2009 / 13:21

Tags