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
在 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