2017-10-24 6 views
2

ドッキングステーションのコンテナに(boot2dockerの)環境を構築しました。私はすぐに、セットアップのnginxとネクサスサーバにドッキングウィンドウ-compose.ymlファイルを次のようしている。NexusのリバースプロキシサーバーとしてのNginx - ドッカー環境では接続できません

version: '3.2' 

services: 
    nexus: 
    image: stefanprodan/nexus 
    container_name: nexus 
    ports: 
     - 8081:8081 
     - 5000:5000 

    nginx: 
    image: nginx:latest 
    container_name: nginx 
    ports: 
     - 5043:443 
    volumes: 
     - /opt/dm/nginx2/nginx.conf:/etc/nginx/nginx.conf:ro 

は、nginxのは、コンフィギュレーション(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 { 

    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; 

    proxy_send_timeout 120; 
    proxy_read_timeout 300; 
    proxy_buffering off; 
    keepalive_timeout 5 5; 
    tcp_nodelay  on; 

    server { 
     listen   80; 
     server_name demo.com; 

    return   301 https://$server_name$request_uri; 
    } 

    server { 
     listen 443 ssl; 
     server_name demo.com; 

     # allow large uploads of files - refer to nginx documentation 
     client_max_body_size 1024m; 

     # optimize downloading files larger than 1G - refer to nginx doc before adjusting 
     #proxy_max_temp_file_size 2048m 

     #ssl on; 
     #ssl_certificate  /etc/nginx/ssl.crt; 
     #ssl_certificate_key /etc/nginx/ssl.key; 

     location/{ 
      proxy_pass http://nexus:8081/; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto "https"; 
     } 
    } 
} 

ネクサスは非常にうまく動作するようですが、次ました。私はドッカーホストマシン上でcurl http://localhost:8081を正常に呼び出します。これは、ネクサスログインサイトのhtmlを返します。今、私はnginxサーバーを試してみたい。これは443ポートでリッスンするように設定されていますが、SSLは現在無効になっています(SSL設定を開始する前にテストしたい)。ご存じのように、私のngixコンテナはポート443をポート5043にマッピングします。したがって、次のカールコマンドを使用しようとします:curl -v http://localhost:5043/。今私はhttpリクエストがnginxに送信され、proxy_pass http://nexus:8081/;ネクサスにプロキシされることを期待しています。 Nexusホスト名はdockerコンテナネットワーク内に表示され、nginxコンテナからアクセスできます。残念ながらREPONSEに私が受け取る:私はnginxのログ、エラー、アクセスをチェックしましたが

* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 5043 (#0) 
> GET/HTTP/1.1 
> Host: localhost:5043 
> User-Agent: curl/7.49.1 
> Accept: */* 
> 
* Empty reply from server 
* Connection #0 to host localhost left intact 
curl: (52) Empty reply from server 

これらのログが空です。誰かが私にこの問題の解決を手伝ってもらえますか?それはプロキシリクエストの単純な例に過ぎないはずですが、多分私はいくつかの概念を誤解していますか?

+0

ログはどこかに保存する必要があります。ドッカーの作成ログを試してみてください。 –

+0

マウントされたディレクトリは正常に動作しますか。私はマウントがこのコンテナでは動作していないと思う。$ dockerのログでnginxのコンテナのログを確認するCONTAINER_ID –

+0

何もない、ログが空です。プロキシサーバに何も衝突していないようです。 –

答えて

1

nginxconfhttpの指令に記載されています)にupstream指令がありますか?

upstream nexus { 
    server <Nexus_IP>:<Nexus_Port>; 
} 

次に、nginxのみが正しく解決できます。 docker-composeサービス名nexusは、実行時にnginxコンテナに注入されません。

あなたはドッキングウィンドウ・コンでlinksを試すことができます。

https://docs.docker.com/compose/compose-file/#links

これはあなたの/etc/hosts内のリンクされたコンテナのaliasを提供します。 しかし、まだupstream directiveが必要です。更新:解決可能な場合は、nginx directivesの名前をlocationのように直接使用することもできます。あなたのnginxの上流の構成が欠落しているアーノルドの答え@として

https://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf

+0

実際に上流の指令は必須ではありません。私の場合、エラーの原因は 'listen 443 ssl'でした。 sslがなければ正しく動作します –

+0

@ArturSkrzydłotrue( 'upstream directive'は名前が既に解決可能な場合は必須ではありません)...私は答えを修正しました。 – arnold

0

。あなたがstefanprodanネクサスイメージを使用しているのを見ました。完全な設定については、his blogを参照してください。あなたの下に私を見つけることができます(入口点が443であっても、ネクサスのポート8081と5000を開くことを忘れないでください)。あなたが証明書を含める必要がほかにドッキングウィンドウのクライアントは、SSLの作業が必要になるため:

worker_processes 2; 

events { 
    worker_connections 1024; 
} 

http { 
    error_log /var/log/nginx/error.log warn; 
    access_log /dev/null; 
    proxy_intercept_errors off; 
    proxy_send_timeout 120; 
    proxy_read_timeout 300; 

    upstream nexus { 
     server nexus:8081; 
    } 

    upstream registry { 
     server nexus:5000; 
    } 

    server { 
     listen 80; 
     listen 443 ssl default_server; 
     server_name <yourdomain>; 

     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 

     ssl_certificate /etc/letsencrypt/live/<yourdomain>/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/<yourdomain>/privkey.pem; 
     ssl_session_cache shared:SSL:10m; 
     ssl_session_timeout 5m; 
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     ssl_prefer_server_ciphers on; 
     ssl_dhparam /etc/ssl/certs/dhparam.pem; 
     ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; 

     keepalive_timeout 5 5; 
     proxy_buffering off; 

     # allow large uploads 
     client_max_body_size 1G; 

     location/{ 
      # redirect to docker registry 
      if ($http_user_agent ~ docker) { 
        proxy_pass http://registry; 
      } 
      proxy_pass http://nexus; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
      proxy_set_header X-Forwarded-Proto "https"; 
     } 
    } 
} 

証明書がletsencryptまたはcertbotを使用して生成されます。設定の残りの部分は、ssllabs analysisにA +をつけています。here

関連する問題