Медленная входная сеть Docker с конфигурацией nginx на менеджере Docker Swarm - PullRequest
0 голосов
/ 26 октября 2019

Вот мои настройки:

  • Домен (mydomain.com, api.mydomain.com)
    • mydomain.com указывает на IP MGR через DNS-запись A-Record.
  • 1 сильный сервер в качестве менеджера роя (теперь MGR)
  • 2 небольших сервера в качестве рабочего (WRK1, WRK2)

MGR запускает nginx вне докера для поддержки поддоменов и прочего.

API на основе nodejs

  • Работает на WRK1 и WRK2
  • API прослушивает порт 4000
    • (внутри контейнера, поэтому не на хосте 4000).

Поскольку WRK1 и WRK2 связаны через сетку маршрутизации с MGR, я могу сделать:

curl localhost:4000/info, и он перенаправит вызов на WRK1 или WRK2, и они вернут все, что API обслуживает в этой конечной точке. В этом примере я установил конечную точку /info для отображения идентификатора контейнера (имя хоста):

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

Я могу продолжать вызывать curl localhost:4000/info, и он будет переключаться между WRK1 и WRK2. 1041 *

Теперь я хочу подключить 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 -> localhost: 4000 ->WRK1 или WRK2
  2. api.mydomain.com -> localhost: 4000 -> WRK1 или WRK2
  3. api.mydomain.com -> localhost: 4000 ->WRK1 или WRK2

Реальность:

  1. curl https://api.mydomain.com -> WRK1 или WRK2
  2. curl https://api.mydomain.com -> Загрузка за ~ 40секунд -> WRK1 или WRK2

Вот мой файл стека докеров для службы API:

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 (очевидно). Любая помощь оценена, чтобы решить эту огромную задержку.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...