2012-09-10 14 views
5

myapp adında tek bir django-admin uygulamasına sahip olmak istiyorum; bu, farklı fiziksel kutularda birden çok örneği istemci başına dağıtmak istiyorum. Ancak, hepsine benzer bir alandan, mydomain.com/customer1/myapp'dan erişilmesini istiyorum.nginx proxy_pass ile birden çok django uygulaması ve yeniden yazabilir

Özel proxy ayarlarıyla uğraştım ve SO üzerinde önerilen birden çok şeyi denedim, ancak hiçbiri benim kullanım durumumu tam olarak uymuyor ... ve hem nginx hem de django hakkında çok az şey bildiğimden beri bir kayıp yaşıyorum!

Benim şu anki nginx.conf geçerli:

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

myserver.com/customer1/myapp/admin aracılığıyla beklendiği gibi ben giriş ekranına alabilirsiniz. Ancak, giriş yapmaya çalıştığımda, nginx, URL'imi geçerli bir URL olmayan myserver.com/admin olarak yeniden yazar. Nginx'in url'yi gerçekten yeniden yazmasını ve yalnızca 127.0.0.1:8001'a iletilen URL'yi değiştirmesini nasıl sağlayabilirim?

FWIW, gunicorn -b 127.0.0.1:8001 -n myapp ile hizmet vermek için tabanca avı kullanıyorum. / konumunun yerini almazsam ve son iki konum bloğunu kaldırırsam uygulama harika çalışır.

Alternatifler varsa, bu yaklaşımdan çok uzaktayım. Amaç, her dağıtım için django kodunu değiştirmekten kaçınmak ve bunun yerine yeni dağıtımlar için nginx.conf'a en az kod eklemektir.

+0

Dağıtım hakkındaki sorular serverfault.com için daha uygun olabilir –

+0

Sadece/url/url/yerine/customerX/myapp/admin/oluşturmak için django url tersine çevirmeye mi çalışıyorsunuz? – jpic

+0

@jpic Hayır, django'nun yalnızca kök URL'leri görmesini istiyorum. Örneğin. '127.0.0.1: 8001/admin'. Bunu nginx ile yapabilirim, ama emin değilim. Ve "serverfault.com" hakkında kaydoldum, burada bir şey anlamamış olsam orada yayınlayacağım, teşekkürler. – Justin

cevap

16

temelde, sen proxy_pass yönergesi kapsamında url belirtin aşağıdaki konum yönergesi bunu yapmalıdır:

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

nginx uri

+1

Bunun için teşekkürler, aşağıdaki ifadede grupları kullanabileceğimin farkında değildim. Ancak, bu url'm tarayıcıda 'http: //127.0.0.1: 8001/$ 2' diye yeniden yazıyor. Ayrıca django-admin giriş ekranı ile güzel oynamıyor. – Justin

+1

Bu, uygulamanın çoğu için iyi çalışıyor ve kabul ettim, ancak bulduğum en iyi çözüm, müşteriyi URL'nin ana bölümüne dahil etmekten ziyade customer.myserver.com alt alanlarını kullanmaktı. – Justin

+1

Bu cevap BAD PRACTICE; Sorunların açıklaması için lütfen http://serverfault.com/a/728792/110020 adresini ziyaret edin. – cnst

3

Sen kullanmalıdır nasıl geçtiğini hakkında ayrıntılı açıklama için http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass bakınız aşağıdaki: Eğer kullanımını yaparsanız, çünkü bu, proxy_pass içindeki değişkenler üzerinden daha üstün olduğunu

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

Not proxy_redirectproxy_redirect değişkenleri artık default varsayılan değerine sahip olamaz ve bunun yerine off10 olacaktır ve uygulamanızın içindeki iç 302 yönlendirmeleri nginx tarafından getirildikten sonra /customer1/myapp/ eşleştirilmeyecektir, bu da büyük olasılıkla sorunlara ve daha fazla 404s neden olacaktır.

Ve, evet, bireysel müşteriler için tek tek alanların kullanılması daha iyi bir fikirdir, çünkü daha güvenlidir (örneğin, çerez kullanımı söz konusu olduğunda).

İlgili konular