web-dev-qa-db-ja.com

111:Dockerコンテナの接続がnginxプロキシを拒否しました

  • CentOS 7

ポート80でリッスンする単純なNginxプロキシDockerコンテナがあります。Dockerfileは次のとおりです。

FROM centos:7
MAINTAINER Brian Ogden

# Not currently being used but may come in handy
ARG ENVIRONMENT

RUN yum -y update && \
    yum clean all && \
    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
    yum -y makecache && \
    yum -y install nginx-1.12.0 wget

# Cleanup some default NGINX configuration files we don’t need
RUN rm -f /etc/nginx/conf.d/default.conf


COPY /conf/proxy.conf /etc/nginx/conf.d/proxy.conf
COPY /conf/nginx.conf /etc/nginx/nginx.conf


CMD ["nginx"]

このNginxプロキシの場合、ここに私のnginx.confがあります。

daemon off;
user  nginx;
worker_processes  2;

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


events {
    worker_connections  1024;
    use epoll;
    accept_mutex off;
}


http {
    include       /etc/nginx/mime.types;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    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;

    client_max_body_size 300m;
    client_body_buffer_size 300k;
    large_client_header_buffers 8 64k;

    gzip  on;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_min_length 0;
    gzip_buffers 16 8k;
    gzip_proxied any;
    gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;

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

そして、これが私のプロキシ設定です:

upstream accountstaging {
    server 127.0.0.1:5023;
}

server {

    listen 80;
    server_name account.staging.mysite.com;

    location / {
        proxy_pass         http://accountstaging;
        proxy_redirect     off;
        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-Host $server_name;
    }
}

私のプロキシ構成はポート80でリッスンしており、ポート5023でリッスンしているNgnixプロキシと同じDockerホストで実行されているDockerコンテナにaccount.staging.mysite.comからのリクエストをリクエストしようとしています。

これが私のNginxプロキシのdocker-compose.ymlです。

version: '3'
services:
  reverseproxy:
    build: 
      context: ./
      dockerfile: docker/Dockerfile
    image: tsl.devops.reverseproxy.image
    container_name: tsl.devops.reverseproxy.container
    ports:
      - "80:80"

ポート5023でリッスンするこのDockerコンテナのdocker-compose.ymlは次のとおりです:バージョン: '3'

services:
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.example.image
    container_name: tsl.api.example.container
    ports:
      - "127.0.0.1:5023:80"

Dockerfileは私の質問にはそれほど重要ではありませんが、とにかくここにあります:

FROM tsl.devops.dotnetcore.base.image:2
MAINTAINER Brian Ogden

WORKDIR /app
COPY ./src/Tsl.Example/bin/Release/netcoreapp2.0/publish .

ENTRYPOINT ["dotnet", "Tsl.Example.dll"]

私は この例 に従ってプロキシを設定しました。

Stackexchangeフォーラム here および here で以前に関連する質問をしました。この質問では、ポート5023でリッスンしている1つのDockerコンテナーにリクエストをプロキシ転送するだけにシナリオを改良および簡略化しました。

私のベースイメージはCentOSなので、 this here に従って、SELinuxがポート5023への転送を許可していることを確認しました

1
Brian

これのおかげで 質問と回答はこちら 、私には2つの問題が発生していることがわかりました。

  1. 私は2つの異なるdocker-compose.ymlファイルを使用しているため、コンテナーのデフォルトのDockerネットワークは異なります。Docker-composeを含め、APIコンテナーのいずれかとは独立してNgnixプロキシが完全に機能することを想定していました。
  2. 2番目の問題は、単にNginixプロキシコンテナ外のネットワークではなく、Ngnixコンテナ内のlocalhostである127.0.0.1:5023にプロキシしようとしたときです。

したがって、NginxプロキシDockerコンテナとAPI Dockerコンテナに対してdocker-composeによって作成されている異なるデフォルトネットワークは、2つの異なるdocker-compose.ymlファイルを使用しているためです。これは、多くのAPIマイクロサービス用のJenkinsビルドがあり、独立したdocker-composeファイルがあり、ポート80で各マイクロサービスにリクエストを転送するためにNginxプロキシが必要だったためです。

これをテストするために、APIとNginxプロキシーの両方のコンテナーに対してdocker-compose.ymlを作成しました。

version: '3'

services:
  reverseproxy:
    build: 
      context: ./
      dockerfile: docker/nginxproxy/docker/Dockerfile
    image: tsl.devops.reverseproxy.image
    container_name: tsl.devops.reverseproxy.container
    ports:
      - "80:80"
  apistaging:
    build: 
      context: ./
      dockerfile: docker/staging/Dockerfile
    image: tsl.api.example.image
    container_name: tsl.api.example.container
    ports:
      - "5023:5023"
    environment: 
      ASPNETCORE_URLS: http://+:5023

はい、まだ問題がありました。http//:127.0.0.1:5023へのプロキシパスで、転送はNginx Dockerコンテナに残り、Dockerホストで実行されているAPIを見つけることができません。単にdocker-composeを使用する必要がありました。それを取得するためのymlサービス名:

upstream accountstaging {
    server apistaging:5023;
}

server {

    listen 80;
    server_name account.staging.mysite.com;

    location / {
        proxy_pass         http://accountstaging;
        proxy_redirect     off;
        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-Host $server_name;
    }
}
1
Brian