Назад | Перейти на главную страницу

Сохранять udp-соединение от того же клиента после перезагрузки конфигурации nginx

Я использую nginx как обратный прокси udp. Клиент отправляет сообщения udp на указанный порт nginx, а nginx направляет эти сообщения на внутренний сервер, указанный в конфигурации. Время от времени мне нужно изменить конфигурацию nginx, и я перезагружаю ее, используя sudo service nginx reload.

Я ожидаю, что с точки зрения внутреннего сервера после перезагрузки ничего не изменится. Но после перезагрузки nginx начинает отправлять новые сообщения udp с другого порта. В результате бэкэнд считает, что эти сообщения отправляет новый клиент.

Как я могу настроить nginx для сохранения того же порта udp для конкретного клиента после перезагрузки?

подробности

Моя конфигурация nginx выглядит так:

worker_processes  1;

error_log  /var/log/nginx/error.log info;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {
    upstream server1 {
        server 192.168.0.2:8888;
    }
    server {
        listen 192.168.0.1:9000 udp reuseport;
        proxy_pass server1;
        proxy_timeout 10m;
    }

    upstream server2 {
        server 192.168.0.3:8888;
    }
    server {
        listen 192.168.0.1:9001 udp reuseport;
        proxy_pass server2;
        proxy_timeout 10m;
    }
}

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

Что я вижу в журнале:

2020/04/16 16:00:44 [info] 103287#103287: *1400 udp client 188.163.73.183:10813 connected to 10.240.0.7:9099
2020/04/16 16:00:44 [info] 103287#103287: *1400 udp proxy 10.240.0.7:48789 connected to 10.244.1.128:8888
2020/04/16 16:01:25 [notice] 1234#1234: signal 1 (SIGHUP) received from 103341, reconfiguring
2020/04/16 16:01:25 [notice] 1234#1234: reconfiguring
2020/04/16 16:01:25 [notice] 1234#1234: using the "epoll" event method
2020/04/16 16:01:25 [notice] 1234#1234: start worker processes
2020/04/16 16:01:25 [notice] 1234#1234: start worker process 103342
2020/04/16 16:01:25 [notice] 103287#103287: gracefully shutting down
2020/04/16 16:01:29 [info] 103342#103342: *1402 udp client 188.163.73.183:10813 connected to 10.240.0.7:9099
2020/04/16 16:01:29 [info] 103342#103342: *1402 udp proxy 10.240.0.7:59665 connected to 10.244.1.128:8888
2020/04/16 16:01:34 [info] 103287#103287: *1400 udp timed out, packets from/to client:9/9, bytes from/to client:81/207, bytes from/to upstream:207/81
2020/04/16 16:01:34 [notice] 103287#103287: exiting
2020/04/16 16:01:34 [notice] 103287#103287: exit
2020/04/16 16:01:34 [notice] 1234#1234: signal 17 (SIGCHLD) received from 103287
2020/04/16 16:01:34 [notice] 1234#1234: worker process 103287 exited with code 0
2020/04/16 16:01:34 [notice] 1234#1234: signal 29 (SIGIO) received

После перезагрузки nginx запускается новый рабочий процесс и запускается старый. изящно закрывается. Клиент с того же порта (10813) отправляет сообщение, и, несмотря на то, что тайм-аут старого рабочего процесса не исчерпан (и он все еще работает), новые сообщения обрабатываются новым рабочим процессом с использованием другого порта (59665).