【问题标题】:Docker-Compose Nginx (with static React) and NginxDocker-Compose Nginx(带有静态 React)和 Nginx
【发布时间】:2020-06-01 13:39:03
【问题描述】:

我目前坚持将nginx 代理到node 负载平衡器。在185.146.87.32:5000/ 上发出请求时出现以下错误:

2020/06/01 13:23:09 [warn] 6#6: *1 upstream server temporarily disabled while connecting to upstream, client: 86.125.198.83, server: domain.ro, request: "GET / HTTP/1.1", upstream: "http://185.146.87.32:5002/", host: "185.146.87.32:5000"

我设法让它在本地系统上工作,但现在我正试图让它在远程服务器上工作。 BACKEND_SERVER_PORT_1=5001 BACKEND_SERVER_PORT_2=5002 BACKEND_NODE_PORT=5000 BACKEND_NGINX_PORT=80 CLIENT_SERVER_PORT=3000 ADMIN_SERVER_PORT=3006 NGINX_SERVER_PORT=80 API_HOST="http://domain.ro"

这是docker-compose

version: '3'
services:

#####################################
#   Setup for NGINX container
#####################################
nginx:
  container_name: domain_back_nginx
  build:
    context: ./nginx
    dockerfile: Dockerfile
  image: domain/domain_back_nginx
  ports:
    - ${BACKEND_NODE_PORT}:${BACKEND_NGINX_PORT}
  volumes:
    - ./:/usr/src/domain
  restart: always
#####################################
#   Setup for backend container
#####################################
backend_1:
  container_name: domain_back_server_1
  build:
    context: ./
    dockerfile: Dockerfile
  image: domain/domain_back_server_1
  ports:
    - ${BACKEND_SERVER_PORT_1}:${BACKEND_NODE_PORT}
  volumes:
    - ./:/usr/src/domain
  restart: always
  command: npm start
#####################################
#   Setup for backend container
#####################################
backend_2:
  container_name: domain_back_server_2
  build:
    context: ./
    dockerfile: Dockerfile
  image: domain/domain_back_server_2
  ports:
    - ${BACKEND_SERVER_PORT_2}:${BACKEND_NODE_PORT}
  volumes:
    - ./:/usr/src/domain
  restart: always
  command: npm start

节点的Dockerfile 是:

FROM node:12.17.0-alpine3.9

RUN mkdir -p /usr/src/domain

ENV NODE_ENV=production

WORKDIR /usr/src/domain

COPY package*.json ./

RUN npm install --silent

COPY . .

EXPOSE 5000

nginx的配置文件是:

upstream domain {
  least_conn;
  server backend_1 weight=1;
  server backend_2 weight=1;
}

server {
   listen 80;
   listen [::]:80;

   root /var/www/domain_app;
   server_name domain.ro www.domain.ro;
   location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_pass http://domain;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

nginx 的Dockerfile 是:

FROM nginx:1.17-alpine as build

#!/bin/sh

RUN rm /etc/nginx/conf.d/default.conf

COPY default.conf /etc/nginx/conf.d

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

【问题讨论】:

    标签: node.js docker nginx docker-compose


    【解决方案1】:

    不要将你的后端暴露给世界,

    为您的服务创建一个 docker 网络,然后公开 nginx,这是最佳实践, 但在您的情况下,您没有在 nginx.conf 中指定后端端口

    upstream domain {
      least_conn;
      server backend_1:5000 weight=1;
      server backend_2:5000 weight=1;
    }
    

    你应该这样做:

    version: '3'
    services:
    
    #####################################
    #   Setup for NGINX container
    #####################################
    nginx:
      container_name: domain_back_nginx
      build:
        context: ./nginx
        dockerfile: Dockerfile
      image: domain/domain_back_nginx
      networks:
        - proxy
      ports:
        - 5000:80
      volumes:
        - ./:/usr/src/domain
      restart: always
    #####################################
    #   Setup for backend container
    #####################################
    backend_1:
      container_name: domain_back_server_1
      build:
        context: ./
        dockerfile: Dockerfile
      image: domain/domain_back_server_1
      networks:
        - proxy
    
      ## always expose, just in case you missed it in Dockerfile, this will expose the port(s)
      ## just in defined networks
      expose:
        - 5000
      volumes:
        - ./:/usr/src/domain
      restart: always
      command: npm start
    #####################################
    #   Setup for backend container
    #####################################
    backend_2:
      container_name: domain_back_server_2
      build:
        context: ./
        dockerfile: Dockerfile
      image: domain/domain_back_server_2
      networks:
        - proxy
    
      ## always expose, just in case you missed it in Dockerfile, this will expose the port(s)
      ## just in defined networks
      expose:
        - 5000
      volumes:
        - ./:/usr/src/domain
      restart: always
      command: npm start
    
    networks:
      proxy:
        external:
          name: proxy
    

    但毕竟我推荐jwilder/nginx-proxy

    【讨论】:

    • 我之前确实看过jwilder/nginx-proxy,但我真的不明白它应该如何工作。特别是,我对这部分感到困惑:-v /var/run/docker.sock:/tmp/docker.sock:ro。这些文件是什么,它们应该包含什么?谢谢
    猜你喜欢
    • 2020-07-23
    • 2016-07-17
    • 2018-09-28
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2018-04-24
    相关资源
    最近更新 更多