首页 > 解决方案 > 为什么我通过 docker 运行 Nginx 时返回 502 错误

问题描述

我在端口 1337 上有一个节点 js 应用程序。我正在尝试通过 nginx 和 docker 为其添加反向代理。我正在创建以下 DOCKERFILE:

FROM nginx:alpine

COPY ./nginx.conf /etc/nginx/nginx.conf

ENTRYPOINT ["nginx", "-g", "daemon off;"]

我对 nginx 的配置:

events{
    worker_connections 50000;
}

http {

    server {
        listen  80;
    location / {
        proxy_pass http://localhost:1337;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    }

}

我运行了这些命令:

docker build -t back-nginx-docker .
docker run -d -p 80:80 back-nginx-docker

然后我收到错误 502 :(

标签: node.jsdockernginxdockerfile

解决方案


您的 docker-container 在他自己的网络中运行。它无法与主机上的端口通信。

要更改它,您可以执行以下步骤之一:

  1. 使用主机网络
    您可以在主机网络中启动您的 docker-container(但它不适用于 Windows)。

    ~ docker run -d -p 80:80 --network=host back-nginx-docker
    
  2. 使用 host-ip 而不是 localhost
    获取 docker-network-adapter 的 ip。

    ~ docker network inspect bridge --format='{{(index .IPAM.Config 0).Gateway}}'
    

    并在你的 nginx.conf 中使用它。通常是172.17.0.1

    location / {
       proxy_pass http://172.17.0.1:1337;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
    }
    

    0.0.0.0:1337仅当您的节点应用程序将侦听而不是侦听时,它才会起作用127.0.0.1:1337


更好的是,当您使用环境变量而不是“硬编码”地址时。

服务器故障如何在 Nginx.conf 中使用环境变量


推荐阅读