【问题标题】:Docker microservices and Nginx on ProdProd 上的 Docker 微服务和 Nginx
【发布时间】:2018-04-16 22:29:42
【问题描述】:

您好,我在这台服务器上安装了一台机器(服务器)和 nginx(本机)。

我的域是hotels.com(例如)

和子域 api.hotels.com

这是机器(本地 nginx)上子域的 conf 文件:

server {
    listen 80;

    server_name api.hotels.com;

    location / {
        proxy_pass http://127.0.0.1:3000$request_uri;;
    }
}

我使用微服务架构构建我的应用程序,有 2 项服务: users-service:3030 , payment-service:3080

我想公开 api.hotels.com/users/ 和 api.hotels.com/payment

所以我选择在端口:3000 上使用 nginx(docker 容器)作为 apiGateway,并且我想代理特定的服务,所以使用这个配置

server {
    listen 3000;

    location /users/ {
        proxy_pass http://users:3030/;
    }

    location /payment/ {
        proxy_pass http://users:3080/;
    }
}
  • 在本地主机中它对我来说工作正常,但在服务器和域中发生错误。

如果我尝试获取 http://api.hotels.com 我从 nginx(machine) 获取 nginx:好

但如果尝试获取http://api.hotels.com/users,它会将浏览器中的url重写为http://127.0.0.1/users然后中断。

*注意:我使用 docker-compose 来启动这 2 个服务和 nginx 容器。

问题:

1) 如何解决这个问题? 2) 我的流程没问题,或者此应用还有其他流程吗?

我的目的流程示例:

1) 客户http://api.hotels.com/users

2) 服务器所有 api.hotels.com ==> http://localhost:3000(api gateway)

3) Nginx Container(on port:3000) ==> 按名称代理特定服务(本例中为用户)

【问题讨论】:

  • 您正在尝试浏览错误的 URL。请改用api.hotels.com:3000/users。而且您的第二个服务器块中缺少 server_name ,您的微服务的 proxy_pass 指令所在的位置。这可能会导致问题。
  • 嗨,但我不想在 cuatomer 的生产中使用端口,我如何才能为 mu purpos 配置配置
  • 如果你不想使用不同的端口,你必须把你的位置块(在第二个服务器块上)放到第一个服务器块,在通用位置块(位置/)之前。它应该这样工作。
  • 看不懂你的回答抱歉

标签: docker nginx


【解决方案1】:

您的应用程序看起来不错,问题只是配置。 你可以试试这个配置:

server {
    server_name api.hotels.com;
    listen 80;

    location /users/ {
        proxy_pass http://users:3030/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host
    }

    location /payment/ {
        proxy_pass http://users:3080/;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host
    }
}

在这种情况下,您的 nginx 容器公开端口 => INCOMING_PORT:80

然后在您的示例中,它在 docker-compose.yml 中将如下所示

...
services:
   api-gateway:
     image: nginx:latest
     ports:
       - "3000:80"
...

通过这种方式,您的 api 网关更加动态。您可以随时更改收入端口,容器内的 nginx 将监听 80 端口,并通过名称代理特定服务。

祝你好运:)

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 2019-01-03
    • 2021-04-05
    • 1970-01-01
    • 2017-06-09
    • 2019-01-22
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多