Ограничение параллельных соединений в Nginx

Вопрос или проблема

Я хочу ограничить количество параллельных соединений с nginx до 10, не сбрасывая лишние соединения – они должны помещаться в очередь и обрабатываться позже.

Это правильная конфигурация для этого требования?

upstream myservice {
    server 127.0.0.1:80;
    server 123.123.123.123:80;
}

set $const 1;
limit_conn_zone $const zone=one:1m;

location / {
    limit_conn one 10;
    proxy_pass  http://myservice;
    proxy_set_header Host myservice;
}

Ответ или решение

Для ограничения количества параллельных подключений к Nginx с учетом ваших требований (максимум 10 соединений с очередью для избыточных), существует несколько аспектов, которые стоит учесть. Первое, что необходимо отметить: ваш текущий конфигурационный код не совсем соответствует задаче. Давайте рассмотрим более подробно, как правильно реализовать поставленную задачу.

Понимание ваших требований

Вы хотите, чтобы максимальное количество параллельных соединений к Nginx составляло 10, и если общее количество соединений превышает это число, они должны ставиться в очередь, а не сбрасываться. В Nginx данная возможность реализуется через модули, такие как limit_conn и limit_req, но только limit_conn не будет ставить соединения в очередь.

Правильная конфигурация Nginx

Первое, что необходимо сделать, это внести изменения в вашу конфигурацию, добавив функциональность для обработки избыточных соединений. Ниже представлена оптимизированная конфигурация, учитывающая ваши требования:

http {
    upstream myservice {
        server 127.0.0.1:80;
        server 123.123.123.123:80;
    }

    # Задаем ограничение на количество соединений
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    # Задаем раздел для очереди соединений
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

    server {
        listen 80;

        location / {
            # Ограничение на количество соединений
            limit_conn addr 10;
            # Ограничение на скорость запросов
            limit_req zone=req_limit_per_ip burst=20 nodelay;

            proxy_pass http://myservice;
            proxy_set_header Host myservice;
        }
    }
}

Объяснение конфигурации

  1. Limit Conn Zone: limit_conn_zone $binary_remote_addr zone=addr:10m; — здесь мы создаем зону, которая будет отслеживать количество соединений на основе IP-адреса клиента. С помощью этой команды мы конкретно задаем, что 10 соединений будет максимальным.

  2. Limit Req Zone: limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; — эта директива задает лимит на скорость запросов. В данном примере, за 1 секунду клиент может отправить 10 запросов, но при этом допустимо использовать burst, что временно позволяет отправить до 20 запросов.

  3. Limit Conn: limit_conn addr 10; — вводится ограничение на количество одновременно открытых соединений для каждого уникального IP.

  4. Limit Req: limit_req zone=req_limit_per_ip burst=20 nodelay; — указывает, что лишние запросы будут обработаны с помощью механизма очереди. Параметр nodelay позволяет обработать все запросы в очереди без задержек, что позволяет избежать резкого падения производительности сервера.

Заключение

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

Если у вас есть дополнительные вопросы или требуется консультация по настройке Nginx, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...