Не достаточно рабочих соединений - Nginx, докер

На моем рабочем сервере у нас есть несколько апстримов, которые являются докер-контейнерами, работающими за обратным прокси-сервером с nginx. Одним из этих контейнеров является mqtt-брокер (mosquitto), который мы используем для подключения через веб-сокеты. Это наш файл nginx.conf:

worker_processes 1;

events {
  worker_connections  1024;
}

http {
    upstream br-frontend {
        server br-frontend:3000;
    }

    upstream br-backend {
        server br-backend:5000;
    }

    upstream mosquitto {
        server mosquitto:9001;
    }

    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    ssl_certificate /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    server {
        listen 443 ssl default_server;
        server_name _;

        location / {
            proxy_pass http://br-frontend/;
        }

        location /api {
            proxy_pass http://br-backend;
        }

        location /swagger.json {
            proxy_pass http://br-backend/swagger.json;
        }

        location /swaggerui {
            proxy_pass http://br-backend/swaggerui;
        }

        location /mosquitto-ws {
            proxy_pass http://mosquitto;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

    server {
        listen 80 default_server;
        server_name _;
        return 301 https://$host$request_uri;
    }
}

Вчера наш производственный сервер вышел из строя из-за следующей ошибки. Я читал, что могу увеличить количество worker_connections, но я не думаю, что это лучшее решение. Я также читал в других вопросах, что у меня может быть бесконечный цикл в моем файле nginx.conf, но я не могу его увидеть.

2018/12/14 00:23:12 [alert] 6#6: 1024 worker_connections are not enough
2018/12/14 00:23:13 [alert] 6#6: *14666 1024 worker_connections are not enough while connecting to upstream, client: *.*.*.*, server: _, request: "GET /mosquitto-ws HTTP/1.1", upstream: "http://172.21.0.5:9001/mosquitto-ws", host: "****"

Обновление:docker-compose.yml

version: '3'
services:
    mongodb:
      image: mongo:latest
      volumes:
        - './data/db:/data/db'
        - './data/configdb:/data/configdb'
      ports:
        - 27017:27017
    br-backend-express:
      working_dir: /app
      command: npm run execute-prod
      image: ${ACR}/br-backend-express:${tag}
      ports:
        - "5000:5000"
      depends_on:
        - mongodb
    mosquitto:
      image: ${ACR}/mosquitto:${tag}
      depends_on:
        - br-backend-express
    br-bridge:
      working_dir: /app
      image: ${ACR}/br-bridge:${tag}
      command: npm run execute-prod
      depends_on:
        - mosquitto
        - mongodb

    br-frontend:
      image: ${ACR}/br-frontend:${tag}

    nginx:
      image: ${ACR}/nginx:${tag}
      ports:
        - 443:443
        - 80:80
      depends_on:
        - br-frontend
        - br-backend-express

Любая помощь будет оценена. Благодарю.

1 ответ

Согласно документам Nginx о worker_connections "… Устанавливает максимальное количество одновременных соединений, которые могут быть открыты рабочим процессом. Следует помнить, что в это число входят все соединения (например, соединения с прокси-серверами), а не только соединения с клиентами. …"

Учитывая, что ваш конфиг использует прокси-соединения, неудивительно, что при достаточно интенсивном трафике у Nginx возникнет недостаток свободных соединений.

Это также упоминает worker_rlimit_nofile быть настроенным в отношении, так что обратите на это внимание.

И, наконец, хотя это не имеет непосредственного отношения к проблеме, но я бы рекомендовал в любом случае использовать worker_processes auto добиться лучшего распределения нагрузки Nginx между доступными ядрами.

Другие вопросы по тегам