5

myapp私は、顧客ごとに 1 つずつ、異なる物理ボックスに複数のインスタンスをデプロイしたいという名前の単一の django-admin アプリを持っています。ただし、それらすべてに同様のドメインからアクセスできるようにしたいと考えていますmydomain.com/customer1/myapp

私は特定のプロキシ設定をいじり、SOで提案された複数のことを試しましたが、私のユースケースに完全に適合するものはありません...両方についてほとんど知らず、途方に暮れていますnginx!django

私の現在のnginx.confは次のとおりです。

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。ただし、ログインしようとすると、nginx はmyserver.com/admin有効な URL ではない URL を書き換えます。nginx が実際に URL を書き換えないようにし、渡された URL のみを変更するにはどうすればよい127.0.0.1:8001ですか?

FWIW、私はgunicornを使用してサービスを提供していgunicorn -b 127.0.0.1:8001 -n myappます。ロケーションのコメント/を外して、最後の 2 つのロケーション ブロックを削除すると、アプリはうまく機能します。

代替案がある場合、私はこのアプローチに着手することにはほど遠い. 目標は、デプロイごとに django コードを変更することを避け、代わりに新しいデプロイの nginx.conf に最小限のコードを追加することです。

4

2 に答える 2

17

基本的に、proxy_pass ディレクティブの一部として url を指定します。次の location ディレクティブでそれを行う必要があります。

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

nginx が uri を渡す方法の詳細な説明については、http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_passを参照してください。

于 2012-09-11T10:42:28.463 に答える
3

以下を使用する必要があります。

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

これは内proxy_passで変数を使用するproxy_redirectよりも優れていることに注意してください.これにより、問題が発生し、さらに 404 が発生する可能性があります。defaultoff302/customer1/myapp/

そして、はい、個々の顧客に個別のドメインを使用する方がより安全です (たとえば、Cookie の処理に関する限り)。

于 2013-12-21T18:46:41.540 に答える