繁体   English   中英

Docker Swarm 中的 Nginx 实现基于路径的路由

[英]Nginx in Docker Swarm to implement path based Routing

我试图通过使用基于路径的路由来使用 nginx 作为两个 Swarm 服务(称为 service1 和 service2)的代理。

这是服务的运行方式:

docker service create --name service1 -p 8080:80 --replicas 3 --network mynet httpd

docker service create --name service2 -p 8081:80 --replicas 3 --network mynet nginx

mynet 是一个覆盖网络。

这是我的 dockerfile。

FROM nginx

RUN rm /etc/nginx/conf.d/*
COPY backend.conf /etc/nginx/conf.d/

EXPOSE 80

这是 backend.conf。

upstream service1 {
    server service1;
}

upstream service2 {
    server service2;
}

server {
    listen 8000;


    location / {
        proxy_pass http://service1;
    }

    location /service2 {
        proxy_pass http://service2;
    }
    
}

这个镜像是使用标准的 dockerbuilt 命令构建的,这个镜像被称为 nginxelb。

docker build -t nginxelb .

这就是我运行代理服务的方式。

docker service create --name nginx-app -p 80:8000 --replicas 3 --network mynet nginxelb

该服务按我的预期运行了 3 个副本。

当我运行 curl localhost 时,我得到以下输出:

<html><body><h1>It works!</h1></body></html>

这很棒。

但是当我运行 curl localhost/service2 时,输出是

<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.19.2</center>
</body>
</html>

我试图不硬编码主机的 IP 地址并使用服务名称作为 DNS 解析器。 它似乎适用于根路径,但不适用于其他路径。

我的应用程序在我手动安装了 docker 的 Amazon Linux 2 上运行。 Docker 版本为 Docker 版本 19.03.2,构建 6a30dfc。

我究竟做错了什么?

在对 backend.conf 文件进行调整后得到了这个工作。 添加了这行代码:

rewrite ^/service2(.*) /$1 break;

这是基于另一篇文章

更新后的 backend.conf 文件如下所示:

upstream service1 {
    server service1;
}

upstream service2 {
    server service2;
}

server {
    listen 8000;


    location / {
        proxy_pass http://service1;
    }

    location /service2 {
        rewrite ^/service2(.*) /$1 break;
        proxy_pass http://service2;
    }
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM