2011-11-15 11 views
18

http://localhost:12345で実行中のdjangoアプリケーションがあります。 私はユーザーにURL http://my.server.com/myappでアクセスしてもらいたいです。 私は次のようにそれにプロキシを逆にnginxのを使用します。nginxの背後にあるサブールの下にdjangoをデプロイする方法

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

上記のように構成されたときの質問はそのよう私の応答ページ内のURLは「/ myappに」の接頭辞を持つように作る方法、ですnginxはそれらをmyappに正しく指示できます。たとえば、「/ foo/far」のようなページのURLは、「/ myapp/foo/bar」に変更して、nginxプロキシをmyappに許可する必要があります。 これを達成するために使用する正しいnginxの設定は何ですか?

私はdjangoの設定変数を使ってルートURLのプレフィックスを指定することができますが、変数は別のnginx設定に従って変更する必要があるため、フレキシブルではありません(nginxは "/ myapp "を"/anotherapp "に変更します)。

答えて

11

Nginxでプレフィックスが設定されているため、DjangoアプリケーションをホストするWebサーバーはURLプレフィックスを認識できません。 orzelが言ったように、nginx + gunicorn/uwsgiのapache + mod_wsgiを(いくつかの追加設定で)使用した場合、WSGIScriptAlias値を使用することができます。これはDjangoによって自動的に読み込まれます。私は、URL接頭辞を使用する必要がある場合

、私は一般的に他のurls.py

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

含む接頭辞で始まる、私は唯一のラインを持っている私のルートurls.py、でそれを自分自身を入れて、しかし、これはsettings.pyに接頭辞を設定するのと同じボトルネックがあると思います。nginxとDjangoには冗長構成があります。

12345であなたのDjangoアプリをホストするサーバで何かをする必要があります。そこに接頭辞を設定して、WSGIScriptAliasまたはそれと同等のmod_wsgiを使用してDjangoに渡すことができます。あなたのDjangoアプリケーションがどのように動作しているのかわからないので、私はもっと情報を与えることはできません。また、おそらくあなたはDjangoから直接DjangoアプリケーションをuWSGIまたはgunicornを使って実行することを検討するべきです。

ウェブサーバからジャンゴにプレフィックスを渡すには、あなたがこれを使用することができます:あなたは、あなたの設定を更新する必要があります

proxy_set_header SCRIPT_NAME /myapp; 

詳しい情報here

+1

ありがとう、私はWSGIScriptAliasトリックと一緒に行く必要があります。 –

+2

この投稿はGOODNESSにありがとうございます。 "proxy_set_header"トリックは、Google検索の悪夢から私を救った。私はよく知っていたはずです。グラシアス。 –

2

ここでは、確かにFORCE_SCRIPT_NAMEを設定していないnginxの設定の一部ですが、サブディレクトリは使用していません。多分、DjangoではなくnginxでUSE_X_FORWARDED_HOSTに関連するオプションを設定すると便利です。

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; 
     } 
    } 
    ... 
} 
関連する問題