Можно донастроить TCP стек, чтобы уменьшить время удержания открытых сокетов:
echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout # освобождать через 5 секунд
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # включить утилизацию
Изменить параметрые nginx:
worker_processes auto;
- количество процессов по количеству ядер CPU или auto
events {
worker_connections 10000;
multi_accept on;
}
- worker_connections сколько надо держать соединений на один процесс, т.е.
worker_processes * worker_connections = сколько всего соединений надо обрабатывать.
multi_accept on - процесс будет пытаться сразу брать все новые соединения, а не по одному.
worker_rlimit_nofile 200000;
- т.е. если хотим 100000 соединений, то пишем 200000
надо изменить в системе лимит на количество открытых файлов:
ulimit -n 1031089
считается, что для гигабитного канала больше 50 тысяч соединений не получить.
Еще по теме:
https://habr.com/post/198982/ - Ускоряем Nginx за 5 минут
https://romantelychko.com/blog/1300/ - Настройка Linux для высоконагруженных проектов и защиты от DDoS