Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 504来自具有nodejs+;码头工人_Javascript_Node.js_Docker_Nginx_Docker Compose - Fatal编程技术网

Javascript 504来自具有nodejs+;码头工人

Javascript 504来自具有nodejs+;码头工人,javascript,node.js,docker,nginx,docker-compose,Javascript,Node.js,Docker,Nginx,Docker Compose,更新 我发现,如果我在容器上用docker exec-it backend\u gateway\u 1 nginx-s reload重新启动nginx,它就会工作。我从中找到了一些信息。似乎连接到127.0.0.1而不是本地主机可以工作,但是我使用的是docker networks,所以我不确定我的情况会是什么 原始问题 我正在尝试使用nginx作为docker的反向代理。我不太清楚什么地方出了问题,因为有时它会在运行时工作,但是如果我使用docker compose down和&docker

更新

我发现,如果我在容器上用
docker exec-it backend\u gateway\u 1 nginx-s reload重新启动nginx,它就会工作。我从中找到了一些信息。似乎连接到127.0.0.1而不是本地主机可以工作,但是我使用的是docker networks,所以我不确定我的情况会是什么

原始问题

我正在尝试使用nginx作为docker的反向代理。我不太清楚什么地方出了问题,因为有时它会在运行时工作,但是如果我使用
docker compose down和&docker compose up来重新启动它,我通常会得到这个504错误

我觉得这与nginx或docker配置有关。我可以请求/罚款,但任何请求/用户都会导致间歇性问题

当我没有收到504时,节点应用程序工作正常,并创建/返回一个用户。我还可以通过mongo express很好地连接到数据库,这应该有助于缩小范围

docker compose.yml

版本:“3.5”
服务:
网关:
图片:nginx:latest
重新启动:始终
端口:
- 8080:80
卷数:
-./nginx/nginx.conf:/etc/nginx/nginx.conf
-./nginx/nginx error.log:/var/log/nginx/error.log
网络:
-扑克网络
poker_mongo:
图片:mongo:最新
容器名称:poker\u mongo
重新启动:除非停止
卷数:
-数据库数据:/data/db
揭露:
- "27017"
环境:
MONGO_INITDB_ROOT_用户名:test
MONGO_INITDB_ROOT_密码:123
网络:
-扑克网络
取决于:
-网关
扑克用户:
容器名称:扑克用户
构建:/用户/
图片:扑克/用户:最新
卷数:
-./user/:/usr/src/app
#-/usr/src/app/node\u模块
揭露:
- "8080"
取决于:
-网关
-扑克牌
网络:
-扑克网络
环境:
等等主持人:poker\u mongo:27017
mongo express:
集装箱名称:mongo express
图片:mongo express
重新启动:始终
端口:
- 8085:8081
环境:
ME\u CONFIG\u MONGODB\u管理员用户名:test
ME\u CONFIG\u MONGODB\u管理员密码:123
ME_CONFIG_MONGODB_服务器:poker_mongo
取决于:
-网关
-扑克牌
网络:
-扑克网络
网络:
扑克网络:
卷数:
数据库数据:
nginx.conf

事件{worker\u connections 1024;}
http{
服务器{
听80;
位置/用户{
重写/用户/(*)/$1中断;
代理通行证http://poker_user:8080/;
代理集头X-Real-IP$remote\u addr;
$remote\u addr的代理\u集\u头X转发;
代理设置头主机$Host;
}
地点/{
返回200“你好”;
}
}
}

非常感谢您的帮助。

我发现了几个类似的相关问题,并将尝试从中汇编两个可能的解决方案:

第一个解决方案

第一个解决方案是逆转服务之间的依赖关系:您可以依赖用户而不是依赖网关。这样,当
网关
启动时,if将能够解析
扑克用户
主机名

在本例中,Dockerfile的外观如下:

version: '3.5'
services:
  gateway:
    image: nginx:latest
    restart: always
    ports:
      - 8080:80
    depends_on: poker_user
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx-error.log:/var/log/nginx/error.log
    networks:
      - poker_network
  poker_mongo:
    image: mongo:latest
    container_name: poker_mongo
    restart: unless-stopped
    volumes:
      - db-data:/data/db
    expose: 
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: 123
    networks:
      - poker_network
  poker_user:
    container_name: poker_user
    build: ./user/
    image: poker/user:latest
    volumes:
      - ./user/:/usr/src/app
      #- /usr/src/app/node_modules
    expose:
      - "8080"
    depends_on:
      - poker_mongo
    networks:
      - poker_network
    environment:
      WAIT_HOSTS: poker_mongo:27017
  mongo-express:
    container_name: mongo-express
    image: mongo-express
    restart: always
    ports:
      - 8085:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: test
      ME_CONFIG_MONGODB_ADMINPASSWORD: 123
      ME_CONFIG_MONGODB_SERVER: poker_mongo
    depends_on:
     - gateway
    networks:
      - poker_network

networks:
  poker_network:
volumes: 
  db-data:
我还删除了一些其他依赖项,因为我认为它们是多余的

第二种解决方案

此解决方案基于更改
nginx
配置。它看起来像是
nginx
试图预先解析在
proxy\u pass
中指定的主机名,并且由于当
nginx
启动时它还不可用,它将继续响应
504
,因为它不再尝试解析它

proxy\u pass
指令中使用变量似乎是一种解决办法,这些变量被不同地对待,并强制
nginx
再次执行DNS解析。这需要在
nginx
中配置解析器,并在使用用户定义的网络时内置到Docker中

下面是一个示例
nginx
配置(尽管我自己没有测试过):


希望这有帮助

我发现了几个类似的相关问题,并将尝试从中总结出两个可能的解决方案:

第一个解决方案

第一个解决方案是逆转服务之间的依赖关系:您可以依赖用户而不是依赖网关。这样,当
网关
启动时,if将能够解析
扑克用户
主机名

在本例中,Dockerfile的外观如下:

version: '3.5'
services:
  gateway:
    image: nginx:latest
    restart: always
    ports:
      - 8080:80
    depends_on: poker_user
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx-error.log:/var/log/nginx/error.log
    networks:
      - poker_network
  poker_mongo:
    image: mongo:latest
    container_name: poker_mongo
    restart: unless-stopped
    volumes:
      - db-data:/data/db
    expose: 
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: 123
    networks:
      - poker_network
  poker_user:
    container_name: poker_user
    build: ./user/
    image: poker/user:latest
    volumes:
      - ./user/:/usr/src/app
      #- /usr/src/app/node_modules
    expose:
      - "8080"
    depends_on:
      - poker_mongo
    networks:
      - poker_network
    environment:
      WAIT_HOSTS: poker_mongo:27017
  mongo-express:
    container_name: mongo-express
    image: mongo-express
    restart: always
    ports:
      - 8085:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: test
      ME_CONFIG_MONGODB_ADMINPASSWORD: 123
      ME_CONFIG_MONGODB_SERVER: poker_mongo
    depends_on:
     - gateway
    networks:
      - poker_network

networks:
  poker_network:
volumes: 
  db-data:
我还删除了一些其他依赖项,因为我认为它们是多余的

第二种解决方案

此解决方案基于更改
nginx
配置。它看起来像是
nginx
试图预先解析在
proxy\u pass
中指定的主机名,并且由于当
nginx
启动时它还不可用,它将继续响应
504
,因为它不再尝试解析它

proxy\u pass
指令中使用变量似乎是一种解决办法,这些变量被不同地对待,并强制
nginx
再次执行DNS解析。这需要在
nginx
中配置解析器,并在使用用户定义的网络时内置到Docker中

下面是一个示例
nginx
配置(尽管我自己没有测试过):


希望这有帮助

您确定您的节点应用程序不会偶尔无法处理请求,也不会返回任何响应吗?您可以尝试从
/user
处理程序中删除所有逻辑并返回