2012-09-10 24 views
5

Tengo una sola aplicación django-admin llamada myapp que me gustaría implementar varias instancias en diferentes cajas físicas, una por cliente. Sin embargo, me gustaría que se pueda acceder a todos desde un dominio similar, mydomain.com/customer1/myapp.múltiples aplicaciones django con nginx proxy_pass y reescritura

He jugueteado con la configuración de proxy específica e intenté varias cosas sugeridas en SO, pero ninguna se ajustaba a mi caso de uso ... y como sé muy poco acerca de nginx y , ¡estoy perdido!

Mi nginx.conf actual es:

server { 
    listen 80; 
    server_name myserver.com 

    location ^~ /static { 
     alias /path/to/static/files/; 
    } 
# location/{ 
#  proxy_pass http://127.0.0.1:8001; 
# } 
    location ^~ /customer1/myapp/static { 
     alias /path/to/static/files/; 
    } 
    location /customer1/myapp { 
     rewrite ^/customer1/myapp/(/?)(.*) /$2 break; 
     proxy_pass http://127.0.0.1:8001; 
    } 
} 

puedo llegar a la pantalla de inicio de sesión como se esperaba a través de myserver.com/customer1/myapp/admin. Sin embargo, cuando intento iniciar sesión, nginx reescribe mi url en myserver.com/admin, que no es una URL válida. ¿Cómo evito que nginx reescriba realmente la URL y solo cambie la URL que se transfiere al 127.0.0.1:8001?

FWIW, estoy usando gunicornio para servir con gunicorn -b 127.0.0.1:8001 -n myapp. Si descomiento la ubicación / y elimino los dos últimos bloques de ubicación, la aplicación funciona muy bien.

Estoy lejos de establecer este enfoque si hay alternativas. El objetivo es evitar modificar el código de django para cada implementación y, en su lugar, agregar código mínimo al nginx.conf para nuevas implementaciones.

+0

Las preguntas sobre la implementación pueden ser más adecuadas para serverfault.com –

+0

No entiendo, ¿está tratando de hacer que django url reverse genere/customerX/myapp/admin/en lugar de/admin /? – jpic

+0

@jpic No, quiero que django solo vea las URL raíz. p.ej. '127.0.0.1: 8001/admin'. Supongo que puedo hacer esto con nginx, pero no estoy seguro de cómo. Y notado sobre 'serverfault.com', publicaré allí si no encuentro nada aquí, gracias. – Justin

Respuesta

16

básicamente, se especifica URL como parte de la directiva PROXY_PASS, la siguiente directiva ubicación debe hacerlo:

location ~ ^/customer1/myapp(/?)(.*) { 
    proxy_pass http://127.0.0.1:8001/$2; 
} 

ver http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass para la explicación detallada sobre cómo nginx pasa el URI

+1

Gracias por esto, no me di cuenta de que podría usar los grupos en la siguiente expresión. Sin embargo, esto vuelve a escribir mi url en el navegador a 'http: //127.0.0.1: 8001/$ 2' Preferiría que se quedara como está. Tampoco funciona bien con la pantalla de inicio de sesión de django-admin. – Justin

+1

Esto funciona bien para la mayoría de la aplicación y acepté, pero la mejor solución que encontré fue el uso de subdominios 'customer.myserver.com' en lugar de incluir al cliente en la parte principal de la url. – Justin

+1

Esta respuesta es una MALA PRÁCTICA; por favor, consulte http://serverfault.com/a/728792/110020 para la explicación de los problemas. – cnst

3

que puedes usar lo siguiente:

location /customer1/myapp { 
    return 302 $uri/; 
} 
location /customer1/myapp/ { 
    proxy_pass http://127.0.0.1:8001/ 
} 

Tenga en cuenta que esto es superior a la utilización de variables dentro de proxy_pass, porque si lo hace el uso variables, entonces proxy_redirect ya no puede ser el valor predeterminado default, y será off en su lugar, y los redireccionamientos internos 302 dentro de su aplicación no se correlacionarán con /customer1/myapp/ después de ser extraídos por nginx, lo que probablemente le cause problemas y más 404s.

Y, sí, el uso de dominios individuales para clientes individuales es una mejor idea, porque es más seguro (en lo que respecta al manejo de cookies, por ejemplo).

Cuestiones relacionadas