在 Docker 容器中使用反向代理 Nginx

在 Docker 容器中使用反向代理 Nginx

因此尝试使用 docker 将 Nginx 设置为反向代理 - 我有三个 node js 容器(一个前端和两个后端服务),前端服务调用两个后端服务。因此我希望 nginx 重定向到前端(即 Web 应用程序),但每次我尝试发送某些内容时都会收到 502 bad gateway 错误。当我直接执行 docker 容器时,我可以通过 dns_hostname 或 ip 地址(我从 docker inspect 中获取)ping 其他容器这是我的 docker-compose 和 nginx.conf 的编辑版本

    version: "3.8"
services:
  frontend:
    image: frontend
    hostname: frontend
    env_file:
      /.env
    networks:
      - network
    restart: on-failure
    expose:
      - "3000"
    container_name: frontend
    backend-service-01:
      image: backend-service-01
        hostname: backend-service-01
        env_file:
            ./backend-service-01/.env
        networks:
            - network
        restart: on-failure
        container_name: backend-service-01
   backend-service-02:
        image: backend-service-02
        hostname: backend-service-02
        env_file:
            ./backend-service-02/.env
        networks:
            - network
        restart: on-failure
        container_name: backend-service-02
        
   nginx-proxy:
     image: nginx:stable-alpine
     hostname: nginx-proxy
     networks:
       - network
     restart: on-failure
        volumes:
          - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
          - /data/nginx/certs/crt_file.crt:/etc/nginx/crt_file.crt
          - /data/nginx/certs/priv_key.key:/etc/nginx/priv_key.key:ro
        ports:
            - 80:80
            - 443:443
        container_name: nginx-proxy
        depends_on: 
          - frontend
          - backend-service-01
          - backend-service-02
networks:
    network:

以下是我正在使用的 nginx conf 文件:

worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 1024;
}

http {

  upstream frontend {
    server frontend:3000;
  }
    
  server {
        
        # Listen Directive on Port 443 (TLS)
        listen              443 ssl; 
        listen              [::]:443 ssl;

        ssl_certificate     /etc/nginx/crt_file.crt;
        ssl_certificate_key /etc/nginx/priv_key.key;

        # Where we store our error.log and access.log
        error_log           /var/log/nginx/error.log;
        access_log          /var/log/nginx/access.log;

        location / {
            root /usr/src/app/public/;
            proxy_pass https://frontend;
        }
  }
}

我几乎已尽一切努力排除网络问题,因为我可以从 nginx 容器内部 ping ip 地址和前端 docker 主机名(使用 docker exec -it nginx-proxy sh)如果有人对下一步尝试有什么建议或者他们可以清楚地看到我是否做错了什么,我将不胜感激。

答案1

问题已解决 - 问题既不是 Docker 也不是 Nginx。问题出在一位前开发人员试图提供帮助,但最终却给我们带来了麻烦。他们在代码中创建了一个重定向,如果有人试图使用 HTTP 协议,它会自动重定向到 HTTPS 协议,一旦我们注释掉这几行烦人的代码并重建容器,惊喜的是......Nginx 按照要求做了。教训:让 Nginx 进行重定向;而不是您的代码。

相关内容