%20falhou%20(111%3A%20Conex%C3%A3o%20recusada)%20ao%20conectar%20ao%20upstream%2C%20cliente%3A%20192.168.128.1%2C%20servidor%3A%20hello-1.local.png)
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 resolver
web
- o servidor web em execução
web
não está servindo https/porta 443 - o servidor web em execução
web
não usa um certificado válido e confiável para o nome do hostweb
Dando uma olhada em seu docker-compose.yml:
- o aplicativo
web
está 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.local
como 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;
}