2010-08-03 13 views
9

No puedo por la vida de mí descubrir cómo implementar un sitio django en una ubicación no root con Nginx/fastcgi, p. http://localhost:8080/myproject/ en lugar de http://localhost:8080/; todos los ejemplos que he visto asumen que Apache o que están montando en la raíz del sitio. Esta es la parte relevante de mi nginx.conf:Desplegando django bajo una sub URL con Nginx/Fastcgi

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; 
    } 
} 

Y un 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!')), 

)

Intentar acceder http://localhost:8080/myproject/hello da un 404. He intentado, sin éxito, todas las combinaciones de:

  • Comentando/descomentando fastcgi_param PATH_INFO $fastcgi_script_name;
  • Comentando/descomentando fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  • Configuración FORCE_SCRIPT_NAME = '/myproject/' en settings.py.

Respuesta

0

Tropecé con su pregunta ya que tenía el problema de la URL secundaria yo mismo. Mi servidor usa Apache como su servidor principal, por lo que mi configuración es diferente, pero funciona. Tal vez esto ayude a alguien:

  • Apache en el puerto 80 (servidor web principal)
  • nginx en localhost: 3033 (puerto aleatorio)
  • fastcgi manage.py en localhost: 3034

a continuación, la configuración de Apache se parece a esto (proxy para Nginx):

<Location /blogsite/> 
    Order deny,allow 
    Allow from all 

    ProxyPass http://127.0.0.1:3033/ 
    ProxyPassReverse http://127.0.0.1:3033/ 
</Location> 

Y la configuración del sitio nginx es:

server { 
    listen 127.0.0.1:3033; 
    server_name localhost; 

    location/{ 
     fastcgi_pass 127.0.0.1:3034; 
     fastcgi_param PATH_INFO $fastcgi_script_name; 
     fastcgi_param REQUEST_METHOD $request_method; 
     fastcgi_param QUERY_STRING $query_string; 
     fastcgi_param CONTENT_TYPE $content_type; 
     fastcgi_param CONTENT_LENGTH $content_length; 
     fastcgi_pass_header Authorization; 
     fastcgi_intercept_errors off; 
    } 

    access_log /var/log/nginx/blogsite.access_log; 
    error_log /var/log/nginx/blogsite.error_log; 
} 

Creo que el problema que tiene se debe a la configuración nginx de alguna manera, no es realmente un problema con la implementación de Django. Es posible que desee probar si mi solución publicada funciona para usted.

7

Acaba de pasar por el mismo problema, resulta que el enlace que proporcionó en ServerFault al Django change doc fue la clave para resolver el problema.

Django> 1.0 usa SCRIPT_NAME y PATH_INFO para enrutar las URL, como explica el documento. Así que tomé eso y corrí con él. Para un proyecto llamado 'myproject', que desea enrutar en mydomain.com/myproject/, intente esto.

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

El resto de los fastcgi params que tengo en otro archivo de configuración de todo el sitio. Para que su ejemplo se parezca a

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; 
    } 
} 

con las mismas URLs.py. Los únicos problemas que he tenido hasta ahora han sido problemas menores para mantener DRY, por ejemplo, donde settings.py requiere URL absolutas y Django no piensa anteponer el SCRIPT_NAME en la URL (piense en settings.LOGIN_URL, settings.MEDIA_URL).

Esto puede ser obvio, pero también asegúrese de tener otra ubicación que apunte a sus medios estáticos y de administración.

+0

@gsakkis, hicieron esto ayuda en absoluto? –

+0

Me ayudó ... Recibí dos aplicaciones web en el mismo servidor {} en nginx.conf usando este método. pero mi problema es que ambos requieren una URL estática y de medios diferentes ... ¿qué hacer aquí? – codeVerine

3

probar este conf

location /myproject { 
    fastcgi_split_path_info ^(/myproject)(.*)$; 
    fastcgi_pass 127.0.0.1:8080; 
    include fastcgi_params; 
} 

donde, fastcgi_params archivo contiene

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 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; 

    fastcgi_param PATH_INFO   $fastcgi_path_info; 

    # PHP only, required if PHP was built with --enable-force-cgi-redirect 
    fastcgi_param REDIRECT_STATUS 200; 

Se trabajó para mí.

documentación sobre ver fastcgi_split_path_info