Nginx

502 網關錯誤 - 單獨的 docker 容器中的 nginx、uwsgi+django

  • December 6, 2015

我很難確定為什麼 nginx 和 uwsgi 不能為我的 django 應用程序服務。這是來自 nginx 日誌的問題。

   nginx-01: 2015/12/06 07:47:50 [error] 10#0: *1 connect() failed (111: Connection refused) while connecting to upstream, 
client: xxx.xxx.xxx.xxx, server: , request: "GET / HTTP/1.1", upstream: "uwsgi://0.0.0.0:8001", host: "54.252.197.191"

因此 uwsgi 和 django 位於一個容器中,具有以下文件設置。

[uwsgi]
http-socket = :8001
chdir = %dsrc/myproject/
env = DJANGO_SETTINGS_MODULE=myproject.settings
module = myproject.wsgi:application
master = true
processes = 4

我的 docker 文件啟動了 uwsgi,我將埠 8001 暴露給主機

CMD ["uwsgi", "uwsgi.ini"]

我用於 nginx 的第二個容器具有以下 nginx 虛擬主機設置。

upstream uwsgi_django {
   server 0.0.0.0:8001;
}

server {
   listen 80;

   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;

   location / {
       auth_basic "Restricted";
       auth_basic_user_file /etc/nginx/.htpasswd;
       uwsgi_pass uwsgi_django;
       include /etc/nginx/uwsgi_params;
   }

   location = /favicon.ico {
     log_not_found off;
   }
}

這是我來自 docker ps 的容器。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES                                       
16f181bafb61        ccbf828a3ab2        "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-container                             
33d4d5d17ca3        65ad56e6756c        "uwsgi uwsgi.ini"        13 minutes ago      Up 13 minutes       0.0.0.0:8001->8001/tcp                     django-container                            
688f4b0f9e29        postgres            "/docker-entrypoint.s"   7 hours ago         Up About an hour    0.0.0.0:5432->5432/tcp                     postgres-container   

如果我從主機 curl 0.0.0.0:8001 我會返回 django 項目的歡迎頁面。但是,如果我嘗試從瀏覽器查看它,我會收到 502 bad gateway 錯誤(在我看來,連結我正確設置了 uwsgi,但 nginx 與 uwsgi 通信之間存在一些問題。

這是你的問題:

upstream uwsgi_django {
   server 0.0.0.0:8001;
}

這僅在程序位於同一主機、VM 或容器中時“有效”,因為它嘗試與同一台機器建立連接。當它們在不同的容器中時,它不起作用。

您需要更改您的 nginx 配置,以便它使用 uwsgi 容器的內部 IP 地址。你如何做到這一點取決於你如何創建你的容器,你沒有指定。檢查相關文件。

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