在docker swarm manager上使用nginx配置,Docker入口网络变慢

时间:2019-10-26 17:25:18

标签: docker nginx

这是我的设置:

  • 域(mydomain.com,api.mydomain.com)
    • mydomain.com通过DNS A记录指向MGR的IP。
  • 1个强大的服务器作为群管理器(从现在开始是MGR)
  • 2个较小的服务器作为工作服务器(WRK1,WRK2)

MGR在docker外部运行nginx来维护子域和其他内容。

基于nodejs的API

  • 在WRK1和WRK2上运行
  • API在端口4000上侦听
    • (在容器内部,因此不在主机4000上)。

由于WRK1和WRK2是通过路由网格与MGR连接的,所以我可以这样做:

curl localhost:4000/info,它将调用重定向到WRK1WRK2,并且他们将返回此终结点上服务的API。 在此示例中,我设置了/info端点以显示容器ID(主机名):

MainRouter.get('/info', (_request: express.Request, response: express.Response) => {
    return response.send(process.env.HOSTNAME);
});

我可以继续打电话给curl localhost:4000/info,它将很好地在WRK1WRK2之间切换。

现在,我要将api.mydomain.com连接到localhost:4000。这是我的nginx配置(在主机上作为虚拟主机运行):

server {
    ssl on;
    listen 443;
    listen [::]:443;

    ssl_certificate /path/to/ssl/cert;
    ssl_certificate_key /path/to/ssl/key;

    server_name api.mydomain.com;

    location / {
            proxy_pass http://localhost:4000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_cache_bypass $http_upgrade;
    }
}

我的期望:

  1. api.mydomain.com->本地主机:4000-> WRK1WRK2
  2. api.mydomain.com->本地主机:4000-> WRK1WRK2
  3. api.mydomain.com->本地主机:4000-> WRK1WRK2

现实:

  1. curl https://api.mydomain.com-> WRK1或WRK2
  2. curl https://api.mydomain.com->加载约40秒-> WRK1或WRK2

这是我用于api服务的docker堆栈文件:

api:
depends_on:
  - db
  - redis
deploy:
  mode: replicated
  replicas: 2
  placement:
    constraints: [node.labels.focus == api]
image: my-api:latest
networks:
  - backend
ports:
  - target: 4000
    published: 4000
    protocol: tcp
    mode: ingress

如果我将2个API放在MGR(2个内核)上,并将端口模式更改为“主机”,则效果很好。因此,它必须与入口网络有关。 如果将mode: ingress更改为mode: host,我将无法再访问localhost:4000(显然)。 任何帮助解决此延迟问题的帮助。

谢谢

0 个答案:

没有答案