Docker使用nginx作为缓存:502坏网关

时间:2017-01-17 12:55:15

标签: nginx docker docker-swarm

我已经使用Docker swarm来创建由1个管理员和2个工作人员组成的集群,每个人都在vm上(由docker-machine创建)。 我已经创建了一个" cdn服务"缓存,或将请求传递给后端(一个tomcat容器,在端口8080上)。 我的码头版本是1.13-rc2

这是我的nginx图片的配置文件:

proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_methods GET HEAD POST;
proxy_cache_valid 200 206 100m;
proxy_ignore_headers Set-Cookie;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Range'; 
server {
    listen       80;
    server_name  172.17.0.1;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

location =  /example-av1.mpd {
    add_header 'Access-Control-Allow-Origin' '*';

    proxy_cache my_zone;
    add_header X-Proxy-Cache             $upstream_cache_status;
    proxy_set_header X-Real-IP           $remote_addr;
    proxy_set_header X-Forwarded-For     $remote_addr;

    proxy_set_header Host                $host;

    proxy_pass http://172.17.0.1:8700/shaka-player-master/media/example-av1.mpd;
  }

}

问题如下: 我创建了名为" mynet"

的覆盖网络

当我创建服务时:

docker service create --name nginx-cdn --network mynet --mode global --publish mode=host,target=80,published=9500,protocol=tcp *myimage*

假设我的群集节点是192.168.99.103-104-105,并且服务在端口9500上, 如果我指向192.168.99.103(或104或105):9500/example-av1.mpd,则存在502错误网关,而不是将请求重定向到后端。

此问题也适用于docker版本1.12。

我怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

172.17.0.1似乎是默认的桥接网络,可能不是叠加层。如果后端容器在另一个主机上运行,​​则nginx容器可以与主机的私有IP或全局IP连接,而不是桥接器。

如果要将后端容器加入同一群集群,可以使用以下命令创建覆盖网络:

docker network create --driver overlay --subnet x.x.x.x/24 foo

然后在同一个覆盖网络中创建服务:

docker service create --network foo ... --name nginx nginx 
docker service create --network foo ... --name tomcat tomcat

您还需要在nginx.conf中更新proxy_pass:

proxy_pass http://tomcat:8700/shaka-player-master/media/example-av1.mpd;

覆盖网络的文档如下:

https://docs.docker.com/engine/swarm/networking/

相关问题