Я использую 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).