Node.js nginx按docker主机映射路由,对于每个路由,调用不同的容器

Node.js nginx按docker主机映射路由,对于每个路由,调用不同的容器,node.js,docker,nginx,routes,nodes,Node.js,Docker,Nginx,Routes,Nodes,我试图通过docker主机映射路由,对于每个路由,调用不同的容器 我有一个docker compose,包含2个服务,该服务位于:5000端口。My nginx.conf映射如下代码: location /template-api { rewrite ^/template-api/?(.*) /$1 break; proxy_pass http://template-api:5000; proxy_redirect off

我试图通过docker主机映射路由,对于每个路由,调用不同的容器

我有一个docker compose,包含2个服务,该服务位于:5000端口。My nginx.conf映射如下代码:

location /template-api {

        rewrite ^/template-api/?(.*) /$1 break;
        proxy_pass         http://template-api:5000;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }

    location /api-plan  {
            rewrite ^/api-plan/?(.*) /$1 break;
            proxy_pass         http://api-plan:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
    }
当调用localhost:8000/api模板/文档时,调用静态文件的路由或返回静态文件的路由。他在localhost:8000/swaggerui中返回错误,未找到文件。 出现这种错误是因为swagger ui文件夹位于localhost:8000/api template/swagger ui和localhost:8000/api plan/swagger ui中

为了修复该错误,我将添加到ngix,即映射
/
路由的配置:

server { 
listen 8000;

    access_log  /var/log/nginx/api.log;
    error_log   /var/log/nginx/api_error.log;
    server_name localhost;

    location / {
        proxy_pass         http://api-plan:5000;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;

    }
现在,当我调用localhost:8000/api plan/documentation时,结果是成功的,但是当我调用localhost:8000/template api/documentation时,api重定向到localhost:8000/api plan/导致错误的路径。

尝试以下方法:

server { 
    listen 8000;
    access_log  /var/log/nginx/api.log;
    error_log   /var/log/nginx/api_error.log;
    server_name localhost;

    location / {
        proxy_pass         http://$server_name:8080/swaggerUi;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;

    }
    location /template-api {

            rewrite ^/template-api/?(.*) /$1 break;
            proxy_pass         http://template-api:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
    }

    location /api-plan  {
            rewrite ^/api-plan/?(.*) /$1 break;
            proxy_pass         http://api-plan:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
    }
}

您可以使用cookies来检测哪个后端应该接收
/swaggerui
请求。这是非常不安全的,因为用户可以编辑cookie并尝试访问其他主机,但由于它是一个本地测试环境,所以它可以正常工作

server { 
    listen 8000;
    access_log  /var/log/nginx/api.log;
    error_log   /var/log/nginx/api_error.log;
    server_name localhost;

    location ~ ^/swaggerui {
            resolver 127.0.0.11 ipv6=off;
            proxy_pass         http://$cookie_origin:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

    }

    location /template-api {
            rewrite ^/template-api/?(.*) /$1 break;
            proxy_pass         http://template-api:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            add_header         Set-Cookie "origin=template-api;Domain=localhost;Path=/;Max-Age=100000";
    }

    location /api-plan  {
            rewrite ^/api-plan/?(.*) /$1 break;
            proxy_pass         http://api-plan:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            add_header         Set-Cookie "origin=plan-api;Domain=localhost;Path=/;Max-Age=100000";
    }
}

你不能只创建两个不同的位置而不是根路由吗/?如果,我删除了那个位置,当浏览器调用localhost:5000/swagger时,他不知道在哪里必须查找静态文件:/event如果你保留3个不同的位置?静态文件的根位置和这些swaggerui端点的另外两个位置。我想这会管用的是的!我想在这种可能性下,我正在寻找我是如何做这件事的哈哈哈,这是完全相同的方法,我会采取!$servername返回第3Works-to-me行中定义的服务器名称!但是,现在,当斯威格请求时,他正在呼叫
http://api-plan/v1/
当正确值为
http://localhost:8000/api-计划/v1/