Implantando o Django sob uma sub-URL com Nginx / Fastcgi

2

Eu não posso para a vida de mim descobrir como implantar um site django em um local não-raiz com Nginx / fastcgi, por exemplo localhost: 8080 / myproject / em vez de localhost: 8080 /; Todos os exemplos que vi viram o Apache ou a montagem na raiz do site. Aqui está a parte relevante do meu nginx.conf :

server {
    listen 8080;
    server_name localhost;

    location /myproject/ {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:3030;

        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        #fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  PATH_INFO          $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
    }
}

E um mínimo urls.py :

from django.http import HttpResponse
from django.conf.urls.defaults import patterns

urlpatterns = patterns('',
    (r'^hello$', lambda request: HttpResponse('Hello world!')),

Tentando acessar localhost: 8080 / myproject / hello dá um 404. Eu tentei sem sucesso todas as combinações de:

  • Comentando / descomentando fastcgi_param PATH_INFO $fastcgi_script_name;
  • Comentando / descomentando fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  • Definindo FORCE_SCRIPT_NAME = '/myproject/' em settings.py.
por gsakkis 05.08.2010 / 12:10

4 respostas

2

Acabei de passar pelo mesmo problema: o link que você forneceu para o Django alterar o documento foi a chave para resolver o problema.

Django > 1.0 usa SCRIPT_NAME e PATH_INFO para rotear URLs, conforme o documento explicou. Então peguei isso e corri com ele. Para um projeto chamado 'myproject', que você gostaria de fazer root em mydomain.com/myproject/, tente isso.

location ~ /myproject/(.*)$ {
    fastcgi_pass 127.0.0.1:8080;
    fastcgi_param  PATH_INFO /$1;
    SCRIPT_NAME /myproject;
}

O resto dos fastcgi params que eu tenho em outro arquivo de configuração para todo o site. Então, seu exemplo seria algo como

server {
    listen 8080;
    server_name localhost;

    location /myproject/ {
        # host and port to fastcgi server
        fastcgi_pass 127.0.0.1:3030;

        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        /myproject;
        fastcgi_param  PATH_INFO          /$1;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
    }
}

com o mesmo urls.py. Os únicos problemas que tive até agora foram pequenos problemas em manter DRY, por exemplo, onde settings.py requer URLs absolutos e o Django não pensa em preceder o SCRIPT_NAME no URL (pense em settings.LOGIN_URL , settings.MEDIA_URL ).

Isso pode ser óbvio, mas também certifique-se de ter outro local que aponte para sua mídia estática e administrativa.

    
por 09.02.2011 / 21:11
1

Eu encontrei um problema relacionado com Nginx e Gunicorn em vez de fastcgi.

Eu escrevi sobre minhas descobertas aqui:

link

O resultado é que você pode usar proxy_set_header para definir o cabeçalho do SCRIPT_NAME diretamente nos cabeçalhos HTTP.

    
por 16.09.2011 / 02:45
0

Eu acredito que o problema está na configuração do django, e não na configuração nginx e fastcgi. Você tem os URLs definidos como link e não link

Portanto, no que diz respeito ao django, o pedido não corresponde a nenhum URL mapeado.

Por favor, tente o seguinte em seu urls.py: urlpatterns = padrões ('',     (r '^ myproject / hello $', pedido lambda: HttpResponse ('Hello world!')),

HTH

MartinP

    
por 02.09.2010 / 12:11
0

Para o Django 1.6 < de acordo com outros threads no ServerFault, você não deve definir a variável SCRIPT_NAME, este deve ser '', e você deve definir somente PATH_INFO com a variável $ fastcgi_script_name.

Para o Django 1.6 > de acordo com as alterações ... essas configurações não são mais necessárias, link comentou ambas as informações do caminho e linhas de nome de script em fastcgi_params (em casos do tipo Debian) ou no nginx.conf (casos RHEL)

    
por 04.12.2013 / 21:19