111: Proxy nginx recusado pela conexão para contêineres do Docker

1
  • CentOS 7

Eu tenho um contêiner Docker Proxy Nginx simples escutando na porta 80. Aqui está o 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"]

E para este proxy Nginx aqui está o meu 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;
}

E aqui está minha configuração de proxy:

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;
    }
}

Minha configuração de proxy está escutando na porta 80 e tentando solicitar solicitações de account.staging.mysite.com para um contêiner Docker em execução no mesmo host do Docker que o proxy Ngnix que escuta na porta 5023.

Aqui está o meu docker-compose.yml para o meu proxy Nginx:

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

Aqui está o docker-compose.yml para este contêiner do Docker que atende na porta 5023: versão: '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"

O Dockerfile não importa muito para minha pergunta, mas aqui está:

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"]

Eu segui este exemplo para configurar meu proxy.

Já fiz uma pergunta relacionada em fóruns do Stackexchange aqui e aqui . Esta questão eu refinei e simplifiquei o cenário para um simples proxy encaminhando um pedido para um contêiner do Docker escutando na porta 5023.

Como minha imagem de base é o CentOS, eu segui isso aqui para garantir que o SELinux esteja antecipando a porta 5023

    
por Brian 05.02.2018 / 23:32

1 resposta

0

Obrigado a esta pergunta e responder aqui , eu pude perceber que eu tinha dois problemas acontecendo:

  1. os contêineres têm diferentes redes Docker padrão porque estou usando dois arquivos docker-compose.yml diferentes, imaginei meu proxy Ngnix funcionando independentemente de qualquer um dos meus contêineres de API por completo, incluindo o docker-compose, mais sobre esse problema abaixo
  2. o segundo problema é simplesmente quando tentei fazer proxy para 127.0.0.1:5023 que é localhost dentro do contêiner Ngnix, não a rede fora do contêiner de proxy Nginx

Assim, as diferentes redes padrão criadas pelo docker-compose para meu contêiner do docker de proxy Nginx e meu contêiner do docker da API são porque estou divertindo dois arquivos docker-compose.yml diferentes. Isso porque eu tenho o Jenkins para muitos microsserviços de API, então tenho arquivos independentes para compilar e eu precisava de um proxy Nginx para encaminhar solicitações na porta 80 para cada microsserviço.

Para testar isso, criei um docker-compose.yml para os dois contêineres, a API e o proxy Nginx:

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

Sim, ainda havia um problema, o proxy passava para o http //: 127.0.0.1:5023, esse encaminhamento permanece no contêiner do Docker do Nginx e nunca encontra a API em execução no host do Docker. Basta usar o docker -compose.yml nome do serviço para chegar a ele:

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;
    }
}
    
por 06.02.2018 / 20:42