%20-%2090%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9%20%D1%81%D0%BB%D0%B8%D1%88%D0%BA%D0%BE%D0%BC%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D0%B5.png)
Попытка проксирования udp-трафика. nginx не выдает никаких ошибок о конфигурации. Клиент подключается до половины (он говорит, что может достичь конечного сервера), но затем соединение зависает и в конечном итоге закрывается из-за тайм-аута.
версия nginx: 1.21.3 ОС: Ubuntu 18.04
nginx.conf:
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
worker_rlimit_nofile 30000;
events {
worker_connections 30000;
multi_accept on;
}
stream{
server {
listen *:4800-4899 udp;
proxy_pass 217.178.x.x:$server_port;
}
}
журнал ошибок:
2213#2213: *3 recv() failed (90: Message too long) while proxying and reading from upstream, udp client: 49.98.x.x, server: 66.42.x.x:4801, upstream: "217.178.x.x:4801", bytes from/to client:1464/0, bytes from/to upstream:0/1464
49.98.xx: IP клиента 66.42.xx: IP прокси 217.178.xx: IP конечного сервера
ip выход
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 56:00:03:95:cc:59 brd ff:ff:ff:ff:ff:ff
inet 66.42.x.x/23 brd 66.42.x.255 scope global dynamic enp1s0
valid_lft 57402sec preferred_lft 57402sec
inet6 fe80::5400:3ff:fe95:[xxx]/64 scope link
valid_lft forever preferred_lft forever
Есть идеи, в чем дело? Кто-нибудь видит проблему в конфигурации?
Спасибо
решение1
Возможно, проблема "90: Message too long" может быть связана с ошибкой EMSGSIZE ( If the message is too long to pass atomically through the underlying protocol, the error EMSGSIZE is returned, and the message is not transmitted
), в этом случае вы можете попытаться решить ее, увеличив размер буфера отправки сокета. Следующие параметры имеют стандартные значения:
net.core.wmem_default = 212992
net.core.wmem_max = 212992
Текущие значения на вашем сервере можно проверить с помощью команды:
sysctl -a | grep "net.core.wmem"
Для теста с помощью следующей команды можно задать, например, следующие значения:
sysctl -w net.core.wmem_default = 9999999
sysctl -w net.core.wmem_max = 9999999
echo "net.core.wmem_default = 9999999
net.core.wmem_max = 9999999 ">> /etc/sysctl.conf
Далее проверьте, что они были применены правильно (теперь должно быть 9999999):
sysctl -a | grep "net.core.wmem"
И попробуйте воспроизвести проблему.