簡體   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