Nginx

Nginx connect() 連接到上游時失敗(111:連接被拒絕),客戶端:192.168.128.1,伺服器:hello-1.local

  • January 16, 2021

我正在嘗試在我的 django + docker + nginx 環境中設置 ssl。但是我遇到了這個錯誤:

*19 connect() 在連接到上游時失敗(111:連接被拒絕),客戶端:192.168.128.1,伺服器:hello-1.local,請求:“GET / HTTP/1.1”,上游:“https://192.168. 128.4:443/”,主機:“hello-1.local”

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

碼頭工人-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

在瀏覽器中,我收到 502 Bad Gateway 錯誤,並且沒有 ssl,網站執行良好。可能是什麼問題呢?

那麼上游是什麼?

上游定義在這裡:

upstream web {  
 ip_hash;
 server web:443;
}

我的第一個閱讀是,Nginx 無法正確連接到名為web.

這可能有多種原因:

  • 你的 Nginx 無法解決web
  • 執行的網路伺服器web未提供 https/埠 443
  • 執行的網路伺服器web未使用有效且受信任的證書作為主機名web

看看你的 docker-compose.yml:

  • 應用程序web暴露在 8000 埠,但你想連接到 Nginx 中的 443 埠,也使用了錯誤的協議(我猜)

所以解決方案是像這樣在 nginx.conf 中改變你的上游配置:

upstream web {  
 ip_hash;
 server web:8000;
}

和這樣的位置塊(https –> http):

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

關於帶有代理/上游的 SSL/TLS:請查看 Nginx-docs: http: //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify

引用自:https://serverfault.com/questions/1049758