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

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

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

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

Подробности

Моя 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 зарезервирует порт для указанного клиента c и всех сообщений от него. клиент будет перенаправлен на внутренний сервер через тот же порт 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).

...