2011-11-15 23 views
18

arkasında bir suburl altında dağıtmak nasıl http://localhost:12345 üzerinde çalışan bir django uygulaması var. Kullanıcının URL'ye http://my.server.com/myapp üzerinden erişmesini istiyorum. Ben gibi kendisine vekil ters nginx kullanmak aşağıdaki: Yukarıdaki gibi yapılandırıldığındadjango nginx

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

soru, nasıl benim cevap sayfalarında URL'lerin böylece "/ Uygulamam" öneki etmektir Nginx onları myapp'a doğru yönlendirebilir. Örneğin, "/ foo/far" gibi bir sayfadaki URL'ler, nginx proxy'nin myapp'ye izin vermesi için "/ myapp/foo/bar" olarak değiştirilmelidir. Bunu başarmak için kullanılacak doğru nginx yapılandırması nedir?

Kök url önekini belirtmek için django'nun ayar değişkenlerini kullanabilirim, ancak değişkeni farklı nginx yapılandırmasına göre değiştirilmek zorunda olduğundan, zihnim için esnek olmamalıdır (bir gün nginx, suburl değerini değiştirebilir) myapp "to"/anotherapp ").

cevap

11

Önek Nginx'te ayarlandığı için, Django uygulamasını barındıran web sunucusunun URL önekini bilmenin bir yolu yoktur. Orzel'in dediği gibi, eğer nginx + gunicorn/uwsgi'nin apache + mod_wsgi'sini kullanmışsanız (bazı ek yapılandırmalarda), otomatik olarak Django tarafından okunan WSGIScriptAlias ​​değerini kullanabilirsiniz. Bir URL öneki kullanmak gerektiğinde

, ben genellikle diğer urls.py

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

dahil önek önek Ben sadece bir çizgi var benim kök urls.py, içinde kendim koymak ve Ancak sanırım bu, settings.py dosyasında bir önek ayarlamaya kıyasla aynı sıkışıklığa sahip, nginx ve Django'da gereksiz yapılandırma var.

Django uygulamanızı barındıran sunucuda: 12345 adresinde bir şeyler yapmanız gerekir. Orada ön eki ayarlayabilir ve WSGIScriptAlias ​​veya bunun dışındaki mod_wsgi'yi kullanarak Django'ya aktarabilirsiniz. Django uygulamanızın nasıl çalıştığını bilmediğim için daha fazla bilgi veremiyorum. Ayrıca, belki de Django uygulamanızı uWSGI veya gunicorn kullanarak doğrudan Django'dan çalıştırmayı düşünmelisiniz.

web sunucusu Django'ya öneki geçmek için, bu kullanabilirsiniz:

proxy_set_header SCRIPT_NAME /myapp; 

fazla bilgi here

+1

Teşekkürler, WSGIScriptAlias ​​trick –

+2

ile gitmek zorunda gibi geliyor Bu yazı için teşekkürler GOODNESS. "Proxy_set_header" hilesi beni Google aramalarının bir kabusundan kurtardı. Daha iyi bilmeliydim. Gracias. –

2

İşte, FORCE_SCRIPT_NAME ayarını kabul etmeyen nginx yapılandırmamın bir parçası, ancak bir alt dizin kullanmıyorum. Belki de, Django'dan ziyade nginx'te USE_X_FORWARDED_HOST ile ilgili seçenekleri ayarlamak yararlı olacaktır.

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