【问题标题】:nginx map routes by docker host, for each route, call a different containernginx通过docker主机映射路由,对于每条路由,调用不同的容器
【发布时间】:2017-12-22 15:56:33
【问题描述】:

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

我有一个带有 2 个服务的 docker-compose,该服务位于 :5000 端口。我的 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-template/documentation,调用静态文件的路由,或者返回静态文件的路由。他在 localhost:8000/swaggerui 中返回错误,找不到文件。 发生该错误是因为 swagger ui 文件夹位于 localhost:8000/api-template/swaggerui 和 localhost:8000/api-plan/swaggerui

为了修复这个错误,我添加到 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/ 导致路线错误。

【问题讨论】:

  • 你不能只创建两个不同的位置而不是根路由 / 吗?
  • 如果,我删除那个位置,当浏览器调用 localhost:5000/swagger 时,他不明白必须在哪里寻找静态文件:/
  • 如果您保留 3 个不同的位置,事件?静态文件的根位置和这些 swaggerui 端点的另外 2 个位置。我认为这会工作
  • 是的!我认为在这种可能性中,我正在寻找我是如何做这件事的哈哈哈

标签: node.js docker nginx routes nodes


【解决方案1】:

试试这个:

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;
    }
}

【讨论】:

  • 很好,这与我采用的方法完全相同!
  • $servername 返回服务器的名称,定义在第 3 行
【解决方案2】:

您可以使用 cookie 来检测应该接收/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";
    }
}

【讨论】:

  • 对我有用!但是,现在,当大摇大摆的请求时,他正在打电话给http://api-plan/v1/,而正确的是http://localhost:8000/api-plan/v1/
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2018-07-18
  • 2022-11-16
相关资源
最近更新 更多