Docker nginx 502用于GET/Post请求但不用于websocket的坏网关

Docker nginx 502用于GET/Post请求但不用于websocket的坏网关,docker,go,nginx,bad-gateway,Docker,Go,Nginx,Bad Gateway,在stackoverflow上有很多类似的例子,但它们几乎都是指不正确的端口或使用localhost作为IP而不是docker机器IP vue.js应用程序与websocket的连接非常好,可以正常工作。但是,对192.168.99.100:8080/meows和其他端点的GET请求都会命中nginx 502坏网关。手动访问端点(而不是vue.js)也会点击502坏网关 ip已正确设置。端口在任何地方都是相同的:8080。端点具有正确的http动词,并且所有端点都具有指向服务器位置/。{}的ng

在stackoverflow上有很多类似的例子,但它们几乎都是指不正确的端口或使用localhost作为IP而不是docker机器IP

vue.js应用程序与websocket的连接非常好,可以正常工作。但是,对
192.168.99.100:8080/meows
和其他端点的GET请求都会命中
nginx 502坏网关。手动访问端点(而不是vue.js)也会点击
502坏网关

ip已正确设置。端口在任何地方都是相同的
:8080
。端点具有正确的
http动词
,并且所有端点都具有指向
服务器位置/。{}
nginx上游
。但是连接到网络没有问题,所有通过的数据都没有问题

编辑:我用docker工具箱运行windows 7,因为我的windows版本没有完整的虚拟化功能。安装完成后没有进一步的配置

架构如下所示:

docker compose

version: "3.6"

services:
  meow:
    build: "."
    command: "meow-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
  query:
    build: "."
    command: "query-service"
    depends_on:
      - "postgres"
      - "nats"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
      NATS_ADDRESS: "nats:4222"
      ELASTICSEARCH_ADDRESS: "elasticsearch:9200"
  pusher:
    build: "."
    command: "pusher-service"
    depends_on:
      - "nats"
    environment:
      NATS_ADDRESS: "nats:4222"
  postgres:
    build: "./postgres"
    restart: "always"
    environment:
      POSTGRES_DB: "meower"
      POSTGRES_USER: "meower"
      POSTGRES_PASSWORD: "123456"
  nats:
    image: "nats-streaming:0.9.2"
    restart: "always"
  elasticsearch:
    image: 'docker.elastic.co/elasticsearch/elasticsearch:6.2.3'
  nginx:
    build: "./nginx"
    ports:
      - "8080:80"
    depends_on:
      - "meow"
      - "query"
      - "pusher"
nginx.conf:

user nginx;
worker_processes 1;

events {
  worker_connections 1024;
}

http {
  upstream meows_POST {
    server meow:8080;
  }

  upstream meows_GET {
    server query:8080;
  }

  upstream search_GET {
    server query:8080;
  }

  upstream pusher {
    server pusher:8080;
  }

  server {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    add_header Access-Control-Allow-Origin *;

    location /meows {
      limit_except GET POST OPTIONS {
        deny all;
      }
      proxy_pass http://meows_$request_method;
    }

    location /search {
      limit_except GET OPTIONS {
        deny all;
      }
      proxy_pass http://search_GET;
    }

    location /pusher {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_pass http://pusher;
    }
  }
}
为了说明go应用程序也使用了正确的端口,下面是侦听的端口

func newRouter() (router *mux.Router) {
    router = mux.NewRouter()
    router.HandleFunc("/meows", listMeowsHandler).
        Methods("GET")
    router.HandleFunc("/search", searchMeowsHandler).
        Methods("GET")
    return
}

router := newRouter()
if err := http.ListenAndServe(":8080", router); err != nil {
    log.Fatal(err)
}
而不是:

ports:
  - "8080"
在每个docker compose服务中,请尝试:

ports:
  // I assume your containers operate on 8080 port
  - "8080:8080"
只需指定
8080
即可将容器的端口8080分配给主机的随机端口。我相信你不会想要的。您可以使用
docker compose ps
验证

还有,为什么要将默认端口everywhere更改为8080?使用Docker,您无需将端口映射到主机端的其他端口,例如:

ports:
    - "8080:80"
请记住,容器使用其端口相互通信,这些端口不需要发布。您只发布要“从外部世界”访问的端口。

已删除所有端口

  ports:
  - "8080"
根据提议,从
ngix.conf
中的所有服务获取属性

然而,根本的问题是elasticsearch docker图像。使用
docker ps-a
我可以看到,一分钟后它将退出78。使用
docker compose logs elasticsearch
错误是
max virtual memory areas vm.max\u map\u count px[过低,至少增加到[x]
。使用以下命令,主机为容器分配了更多内存,所有问题都得到解决

docker-machine ssh
sudo sysctl -w vm.max_map_count=262144

我对docker很陌生,所以某些决定(如端口)是没有根据的。当更改
docker compose
喵喵叫时,查询并推送到
8080:8080
8080:80
我得到错误,
bind for 0.0.0.0:8080失败:端口已分配
端口必须发布,因为我试图访问em来自我自己的机器(docker也在其上运行)对于vue.js应用程序,该端口不是docker-ized的。是的,因为您的主机只有一个端口8080。在我看来,只有nginx的端口应该公开。这是唯一应该公开的端点。vue将只与作为底层基础架构网关的该端点进行通信。听起来合乎逻辑。我如何更改它以使其继续ly nginx端口已公开且所有服务终结点都可访问?如果您希望从您的计算机访问容器,请为每个服务使用不同的端口,例如8080:8080,在另一个8081:8080、8082:8080等。这对您没有多大帮助,您应该检查nginx的日志。另外,请使用当前docker compose文件更新您的问题,以供参考埃伦斯。