2012-09-10 10 views
5

Ho una singola app django-admin denominata myapp che mi piacerebbe distribuire più istanze su diverse caselle fisiche, una per cliente. Tuttavia, mi piacerebbe che tutti fossero accessibili da un dominio simile, mydomain.com/customer1/myapp.più app django con nginx proxy_pass e riscrivi

Ho manipolato impostazioni specifiche del proxy e ho provato più cose suggerite su SO, ma nessuna si adatta perfettamente al mio caso d'uso ... e poiché so molto poco su entrambi gli nginx e django sono in perdita!

mio nginx.conf corrente è:

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

posso arrivare alla schermata di login come previsto tramite myserver.com/customer1/myapp/admin. Tuttavia, quando provo ad accedere, nginx riscrive il mio url su myserver.com/admin che non è un url valido. Come posso impedire a nginx di riscrivere effettivamente l'url e modificare solo l'url passato a 127.0.0.1:8001?

FWIW, sto usando gunicorn per servire con gunicorn -b 127.0.0.1:8001 -n myapp. Se rimuovi il commento dalla posizione / e rimuovi gli ultimi due blocchi di posizione, l'app funziona perfettamente.

Sono lontano dall'impostare questo approccio se ci sono alternative. L'obiettivo è evitare di modificare il codice django per ogni distribuzione e aggiungere semplicemente codice minimo a nginx.conf per le nuove distribuzioni.

+0

Domande sulla distribuzione potrebbero essere più adatte per serverfault.com –

+0

Non capisco, stai solo provando a fare django url reverse per generare/customerX/myapp/admin/invece di/admin /? – jpic

+0

@jpic No, voglio che django veda solo gli URL radice. per esempio. '127.0.0.1: 8001/admin'. Suppongo di poterlo fare con nginx, ma non sono sicuro di come. E notato su 'serverfault.com', posterò lì se non capisco nulla qui, grazie. – Justin

risposta

16

fondamentalmente, si specifica l'URL come parte della direttiva proxy_pass, la seguente direttiva posizione dovrebbe farlo:

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

vedere http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass per la spiegazione dettagliata su come nginx passa il uri

+1

Grazie per questo, non mi ero reso conto che avrei potuto usare i gruppi nella seguente espressione. Tuttavia, questo ri-scrive il mio url nel browser a 'http: //127.0.0.1: 8001/$ 2' Preferirei che rimanesse così com'è. Inoltre, non funziona bene con la schermata di accesso di django-admin. – Justin

+1

Questo funziona bene per la maggior parte delle app e ho accettato, ma la soluzione migliore che ho trovato è stata quella di utilizzare i sottodomini 'customer.myserver.com' piuttosto che includere il cliente nella parte principale dell'URL. – Justin

+1

Questa risposta è una BAD PRACTICE; si prega di consultare http://serverfault.com/a/728792/110020 per la spiegazione dei problemi. – cnst

3

si dovrebbe usare il seguente:

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

si noti che questo è superiore all'utilizzo di variabili all'interno proxy_pass, perché se lo fai uso variabili, quindi proxy_redirect non può più essere il valore predefinito default e sarà invece off e quindi i reindirizzamenti interni all'interno della tua app non verranno mappati su /customer1/myapp/ dopo essere stati recuperati da nginx, che probabilmente causerà problemi e altri 404.

E, sì, l'utilizzo di singoli domini per singoli clienti è un'idea migliore, perché è più sicuro (per quanto riguarda la gestione dei cookie, ad esempio).