Nginx connect() falhou (111: Conexão recusada) ao conectar ao upstream, cliente: 192.168.128.1, servidor: hello-1.local

Nginx connect() falhou (111: Conexão recusada) ao conectar ao upstream, cliente: 192.168.128.1, servidor: hello-1.local

Estou tentando configurar o SSL no meu ambiente Django + docker + nginx. No entanto, encontrei este erro:

*19 connect() falhou (111: Conexão recusada) ao conectar ao upstream, cliente: 192.168.128.1, servidor: hello-1.local, solicitação: "GET / HTTP/1.1", upstream: "https://192.168. 128.4:443/", host: "hello-1.local"

Minha configuração do Nginx:

client_max_body_size 10M;

upstream web {  
  ip_hash;
  server web:443;
}

server {
    listen 80;
    server_name hello-1.local;
    return 301 https://$host$request_uri;
}

server {    
    
    location /static/ {    
        autoindex on;    
        alias /src/static/; 
    }

    location /media/ {
        autoindex on;
        alias /src/media/;
    }

``

    location / {
        proxy_pass https://web/;
    }
    
    listen 443 ssl;
    server_name hello-1.local;
    ssl_certificate /etc/certs/hello-1.local.crt;
    ssl_certificate_key /etc/certs/hello-1.local.key;
    
} 

docker-compose.yml:

version: "3"

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}

services:
  nginx:
    image: nginx:alpine
    container_name: nz01
    ports:
      - 443:443
      - 80:80
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
      - ./config/certs:/etc/certs
    depends_on:
      - web
    networks:
      - djangonetwork
  web:
    build:
      context: .
      dockerfile: compose/django/Dockerfile
    container_name: dz01
    depends_on:
      - db
    volumes:
      - ./src:/src
    expose:
      - 8000
    links:
      - redis
    env_file:
      - ./.envs/.django
    networks:
      - djangonetwork
  db:
    build:
      context: .
      dockerfile: compose/postgres/Dockerfile
    container_name: pz01
    env_file:
      - ./.envs/.postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
      - local_postgres_data_backups:/backups
    networks:
      - djangonetwork
  redis:
    image: redis:alpine
    container_name: rz01
    ports:
      - "6379:6379"
    networks:
      - djangonetwork

networks:
  djangonetwork:
    driver: bridge

No navegador, recebo o erro 502 Bad Gateway e sem SSL, o site funciona bem. Qual poderia ser o problema?

Responder1

Então, qual é o upstream?

O upstream é definido aqui:

upstream web {  
  ip_hash;
  server web:443;
}

Minha primeira leitura disso é que o Nginx não pode se conectar corretamente ao servidor upstream chamado web.

Isso pode ter vários motivos:

  • seu Nginx não consegue resolverweb
  • o servidor web em execução webnão está servindo https/porta 443
  • o servidor web em execução webnão usa um certificado válido e confiável para o nome do hostweb

Dando uma olhada em seu docker-compose.yml:

  • o aplicativo webestá exposto à porta 8000, mas você deseja se conectar à porta 443 no Nginx, também usando o protocolo errado (eu acho)

Portanto, a solução seria alterar o upstream-config no nginx.conf assim:

upstream web {  
  ip_hash;
  server web:8000;
}

e o bloco de localização assim (https -> http):

location / {
    proxy_pass http://web/;
}

Em relação a SSL/TLS com proxies/upstreams: dê uma olhada nos documentos do Nginx sobre isso:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify

Responder2

Eu tenho uma configuração semelhante em meu aplicativo Web, onde Nginx é um proxy reverso para Dockerized Django e React. Também estou usando um certificado autoassinado para SSL no desenvolvimento local.

Eu estava tendo dificuldades porque o React (Next.js) está buscando dados da API REST do Django --- mas algumas solicitações vêm do servidor enquanto outras vêm do cliente. As solicitações baseadas no servidor puderam ser usadas http://backend:8000(o nome do serviço Docker e a porta exposta), mas as solicitações baseadas no cliente precisavam passar pelo https://example.local.

Se alguém está preso nisso e usando Swagger UI (ou seja, drf-yasg), este foi meu calcanhar de Aquiles --- você PRECISA configurar o OpenAPI "DEFAULT_API_URL". Se você tiver um certificado SSL autoassinado com example.local, deverá configurá-lo https://example.localcomo seu URL do Swagger. Com drf-yasg, aqui está o meu settings.py:

# Swagger
ENDPOINT_DOMAIN = "https://example.com"
if DEBUG:
    ENDPOINT_DOMAIN = "https://example.local"
SWAGGER_SETTINGS = {
    'SECURITY_DEFINITIONS': {
        'basic': {
            'type': 'basic'
        }
    },
    'DEFAULT_API_URL': ENDPOINT_DOMAIN,
}

Além disso, tive que combinar isso em minha configuração do Next.js ( next.config.js):

const nextConfig = {
  ...
  assetPrefix: 'https://example.local',
  ...
}

Finalmente, minha configuração do Nginx fica assim:

server {
  listen 80;
  listen [::]:80;

  server_name example.local;
  return 302 https://example.local$request_uri;
}

# Main server directive
server {
  http2               on;

  listen 443          default ssl;
  listen [::]:443     default ssl;

  ssl_certificate     /etc/nginx/certs/example.test.crt;
  ssl_certificate_key /etc/nginx/certs/example.test.key;

  root                /app;
  server_name         example.local;

  charset utf-8;

  gzip on;
  gzip_disable "msie6";
  gzip_comp_level 6;
  gzip_min_length 1100;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gzip_types
    text/plain
    text/css
    text/js
    text/xml
    text/javascript
    application/javascript
    application/json
    application/xml
    application/rss+xml
    image/svg+xml;

  # Setup frontend requests to use port 3000
  location @frontend {
    internal;
    root       /app/frontend/;
    proxy_pass http://frontend:3000;

    proxy_redirect off;
    proxy_set_header Host              $host;
    proxy_set_header X-Forwarded-For   $remote_addr;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-NginX-Proxy     true;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Url-Scheme      $scheme;
  }

  # Setup backend requests to use port 8000
  location @backend {
    proxy_pass http://backend:8000;

    proxy_redirect off;
    proxy_ssl_verify off;
    proxy_set_header Host              $host;
    proxy_set_header X-Forwarded-For   $remote_addr;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-NginX-Proxy     true;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Url-Scheme      $scheme;
  }

  # Frontend =============================================
  location / {
    try_files $uri @frontend;
  }

  location ~ ^/assets/(.*)$ {
    root      /app/frontend/public/;
    try_files $uri @frontend;
  }

  location ~ ^/favicon(.*)$ {
    root      /app/frontend/public/assets/favicon/;
    try_files $uri @frontend;
  }

  location ~ ^/_next/(.*)$ {
    root      /app/frontend/;
    try_files $uri @frontend;
  }

  location /_next/webpack-hmr {
    root      /app/frontend/;
    try_files $uri @frontend;

    # Websockets
    proxy_http_version 1.1;
    proxy_set_header   Connection "upgrade";
    proxy_set_header   Upgrade $http_upgrade;
  }

  location /404 {
    try_files $uri @frontend;
  }


  # Backend ===============================================
  location ~ ^/swagger(.*)$ {
    try_files $uri @backend;
  }

  location ~ ^/redoc(.*)$ {
    try_files $uri @backend;
  }

  location ~ ^/admin(.*)$ {
    try_files $uri @backend;
  }

  location ~ ^/api(.*)$ {
    try_files $uri @backend;
  }

  location ~ ^/webmention(.*)$ {
    try_files $uri @backend;
  }

  location ~ ^/rss(.*)$ {
    try_files $uri @backend;
  }

  location /sitemap.xml {
    try_files $uri @backend;
  }

  location ~ ^/static/(.*)$ {
    root      /app/backend/;
    try_files $uri @backend;

    autoindex on;
  }

  location ~ ^/uploads/(.*)$ {
    root      /app/backend/;
    try_files $uri @backend;
  }

  location /(500|502|503|504) {
    try_files $uri @backend;
  }

  # Error handling
  error_page 404 /404;
  error_page 500 502 503 504 /500;
}

informação relacionada