Docker GET/Post 请求的 nginx 502 错误网关但不是 websocket

Docker nginx 502 bad gateway for GET/Post requests but not websocket

在 Whosebug 上有各种类似的案例,但它们几乎都引用了不正确的端口或使用 localhost 作为 IP 而不是 docker-机器 ip。

vue.js 应用程序可以很好地连接到 websocket 并且可以正常工作。但是,对 192.168.99.100:8080/meows 和其他端点的 GET 请求都命中了 nginx 502 bad gateway。手动访问端点(而不是 vue.js)也命中 502 bad gateway

IP设置正确。端口到处都是一样的 :8080。端点有正确的 http verb 并且都有一个 nginx upstream 指向 server location /..{}。然而连接网络没有问题,所有数据通过都没有问题。

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

架构如下:

docker-撰写

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.

进行验证

另外为什么要把默认端口改成8080?使用 Docker 则没有必要,您可以简单地将端口映射到主机端的其他端口,例如:

ports:
    - "8080:80"

请记住,容器使用它们的端口相互通信,不需要发布这些端口。您只发布要访问的端口 "from the outside world".

全部删除

  ports:
  - "8080"

提议的 ngix.conf 中所有服务的属性。

然而,潜在的问题是 elasticsearch docker 图像。使用 docker ps -a 我可以看到一分钟后它会退出 78。使用 docker-compose logs elasticsearch 错误是 max virtual memory areas vm.max_map_count px[ is too low, increase to at least [x]。使用下面的命令,主机为容器分配了更多内存,一切都解决了。

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