2011-11-15 18 views
18

Tengo una aplicación django ejecutándose en http://localhost:12345. Me gustaría que el usuario acceda a través de la url http://my.server.com/myapp. Yo uso nginx a proxy inverso a ella como la siguiente:cómo implementar django debajo de un suburbal detrás de nginx

... ... 
server_name my.server.com; 
location /myapp { 
    rewrite /myapp(.*) $1 break;   
    ... ... # proxy param 
    proxy_pass http://localhost:12345; 
} 
... ... 

La pregunta es, cuando se configura como el de arriba, cómo hacer que las direcciones URL en mis páginas de respuesta para tener el prefijo "/ miaplicacion" para que el nginx puede dirigirlos correctamente a myapp. Por ejemplo, las direcciones URL en una página como "/ foo/far" deben cambiarse a "/ myapp/foo/bar" para permitir el proxy nginx a myapp. ¿cuál es la configuración correcta de nginx para usar para lograr esto?

Puedo usar las variables de configuración de django para especificar el prefijo url raíz, pero no es flexible para mi mente, ya que la variable debe modificarse según la configuración diferente de nginx (digamos que un día nginx puede cambiar el suburbano de "/ myapp "a"/anotherapp ").

Respuesta

11

Como el prefijo está establecido en Nginx, el servidor web que aloja la aplicación Django no tiene forma de conocer el prefijo de URL. Como dijo orzel, si usó apache + mod_wsgi incluso de nginx + gunicorn/uwsgi (con alguna configuración adicional), podría usar el valor WSGIScriptAlias, que Django lee automáticamente.

Cuando necesito usar un prefijo de URL, por lo general puse a mí mismo en mi urls.py raíz, donde tengo una sola línea, con el prefijo el prefijo e incluyendo otro urls.py

(r'^/myapp/', include('myapp.urls')), 

Pero supongo que esto tiene el mismo cuello de botella que establecer un prefijo en settings.py, tienes una configuración redundante en nginx y Django.

Debe hacer algo en el servidor que aloja su aplicación Django en: 12345. Puede establecer el prefijo allí y pasarlo a Django usando WSGIScriptAlias ​​o su equivalente externo mod_wsgi. No puedo darle más información ya que no sé cómo se ejecuta su aplicación Django. Además, tal vez deberías considerar ejecutar tu aplicación Django directamente desde Django, usando uWSGI o gunicorn.

Para pasar el prefijo a Django desde el servidor web, puede utilizar esto:

proxy_set_header SCRIPT_NAME /myapp; 

Más información here

+1

Gracias, Parece que tengo que ir con el truco de WSGIScriptAlias ​​ –

+2

Gracias a GOODNESS por esta publicación. El truco "proxy_set_header" me salvó de una pesadilla de búsqueda de Google. Debería haberlo sabido mejor. Gracias –

2

Aquí está parte de mi configuración para nginx que, sin duda, no establece FORCE_SCRIPT_NAME, pero entonces, no estoy usando un subdirectorio. Tal vez sea útil para establecer opciones relacionadas con USE_X_FORWARDED_HOST en nginx en lugar de Django.

upstream app_server_djangoapp { 
    server localhost:8001 fail_timeout=0; 
} 

server { 
    listen xxx.xxx.xx.xx:80; 
    server_name mydomain.com www.mydomain.com; 
    if ($host = mydomain.com) { 
     rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent; 
    } 
    ... 
    location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 

     if (!-f $request_filename) { 
      proxy_pass http://app_server_djangoapp; 
      break; 
     } 
    } 
    ... 
} 
Cuestiones relacionadas