2017-03-04 2 views
1

Djangoプロジェクトをセットアップし、nginxとuwsgiを組み合わせて使用​​しています。さらに、Dockを使ってDjango + uwsgiを1つのコンテナに入れ、nginxを他のコンテナに入れています。Nginxとuwsgiの接続が別のドッカーコンテナに置かれたときに拒否されました

テスト目的のために、私はこれをローカルに設定したいのですが、テスト用にカスタムドメイン名を使用したいと思います。私はそれを設定しようと本当に苦労しています。

これは私のnginx.conf

user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
    '$status $body_bytes_sent "$http_referer" ' 
    '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /var/log/nginx/access.log main; 

    sendfile  on; 
    #tcp_nopush  on; 

    keepalive_timeout 65; 

    include /etc/nginx/conf.d/*.conf; 

    #gzip on; 

    upstream app { 
    server 0.0.0.0:8000; 
    } 

    server { 
    listen 80; 
    charset  utf-8; 
    server_name someapp.app *.someapp.app; 

    location/{ 
     # checks for static file, if not found proxy to app 
     uwsgi_pass app; 
     include uwsgi_params; 
     #try_files $uri @proxy_to_app; 
    } 

    location /static { 
     alias /static; 
    } 

    location /media { 
     alias /media; 
    } 

    location @proxy_to_app { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_pass http://someapp.app; 

    } 
    } 

} 

であり、これは私のuwsgi.ini

[uwsgi] 
http-socket = 0.0.0.0:8000 
chdir = /app 
master = true 
processes = 4 
cheaper = 2 
chmod-socket = 664 
env = DJANGO_SETTINGS_MODULE=config.settings.local 
module = config.wsgi:application 
vacuum = true 

私は私のURLをブラウザにsomapp.appを使用して接続することができません、またはそのことのabcのためであります.someapp.app。私はそれを動作させるために入れなければならない他の設定はありますか?

答えて

2

容器を接着剤で接着するには、いくつかのことをする必要があります。

まず、Dockerでユーザーネットワークを作成します。これにより、コンテナに通信し、お互いを名前で発見する場所が与えられます。今

docker network create my_app 

、あなたはこれらのコンテナを実行すると、両方のためにそのネットワークを使用します。

docker run --network my_app <other-options> 

これは2つのことを行います。まず、コンテナをネットワーク上に置いて、互いに通信できるようにし、Dockerが行っていることから干渉を受けないようにします。次に、コンテナ名を使用して、DNSホスト名のように互いを見つけることができます。

ここで、各アプリケーションが他のアプリケーションを見つける方法を知っていることを確認する必要があります。あなたのケースでは、これは主に、Nginxがuwsgiサーバーを見つける場所を知る必要があることを意味します。

あなたのuwsgiサーバーはすでに0.0.0.0:8000にバインドされています。それはコンテナの外部インターフェイス(ローカルホストだけでなく)にバインドされているため、良いことです。この作業を行うには、ポートがDockerに公開されていることを確認する必要があります。これを構築するDockerfileでは、これを持っていることを確認してください。

EXPOSE 8000 

これは、Docker内のポートを公開する(必ずしもインターネットに公開するとは限りません)。

uwsgiがどこにあり、そのポートが公開されていることがわかったので、Nginxにどこにそれがあるかを伝えることができます。あなたは現在動作しませんこれは、これをやっている:

upstream app { 
    server 0.0.0.0:8000; 
} 

あなたが代わりに他のコンテナの名前を使用するために、これを変更する必要があります。

upstream app { 
    server uwsgi:8000; 
} 

あなたはポートを暴露することに加えて、外部からnginxのに接続したいので、

EXPOSE 80 

あなたはそれを公開する必要があります。このようなもの。

docker run --network my_app -p 80:80 

または結合ポートが外部ホスト上の80以外のものであるべきならば、あなたは別のものを使用することができます。

docker run --network my_app -p 8080:80 

最後に、カスタムホスト名を使用する部分です。これはあまり簡単ではありません。なぜならDockerはデフォルトでこれを処理しないからです。ラップトップなどでローカルで実行している場合は、簡単です。特定のポートでlocalhostを使用するだけです。

http://localhost:8080 

あなたには、いくつかの他の場所からこれを到達したい場合は、リモートでは、クライアント・システムの/etc/hostsにIPを追加する必要がある、またはDNSに何かを追加することがあります。あなたが実際にどのような環境を持っているかを知らなくても、それについてもっと詳しく言うことは難しいです。

+0

非常に精巧な投稿ありがとうございます。あなたがネットワークの作成について言及したとき、それは私に不思議となって、それがどのように行われているかを調べるようになった。さて、あなたが言及したこのネットワークを作成する 'docker-compose'を使用し、サービス名を使ってそれらを接続することができました。このようなプロジェクトをどのように設定するかについての多くの例を経ても見つけられなかった重要なコグネットワークについての詳細があるので、私はあなたの答えを受け入れています。ありがとう。 –

+1

私はおそらくそれを他の人と分かち合い、助けてくれるよう要点を置くでしょう。 –

+0

@RajeshYogeshwarはい、Composeもそれを行う良い方法です。私は今朝の時間の不足のためにそれについてのセクションを書いていませんでした。喜んで:) –

関連する問題