Нехватка TCP портов! Как решить проблему с нехваткой портов
Есть сервер Nginx он слушает 80 порт на вход HTTP запросов, для ответа клиенту он тоже создает сокет , отвечает и допустим закрывает , все ОС выделяет 65536 , значит мы можем на одной ОС принять одновременно только это число клиентов , если мне нужно 80.000 портов в пределах одной ОС кк я могу этого добиться ?
Ответы (2 шт):
HTTP запросов, для ответа клиенту он тоже создает сокет , отвечает и допустим закрывает , все ОС выделяет 65536 , значит мы можем на одной ОС принять одновременно только это число клиентов
Нет, это не так: сокет, возвращаемый из accept() сам по себе не использует «дополнительного» порта. Так что количество клиентов одного сервера ни как не ограничивается количеством портов TCP/UDP. Количеством портов, по сути, ограничивает только количество различных программ-серверов и клиентских соединений на одном узле сети.
HTTP также не предусматривает дополнительных портов для передачи данных. Так что ни каких скрытых дополнительных портов/сокетов он также не создаёт.
Описанное выше явление встречается, например, в пассивном режиме FTP, где данные, действительно, передаются через отдельное соединение на отдельный порт, открываемый сервером, но там количество одновременных скачиваний обычно ограничено куда сильнее по соображениям производительности сервера. Так что в случае подобных протоколов приходится только смирится с ограничениями.
Если кратко, то используется пара (ip, port) и при ответе nginx посылает ответ с (0.0.0.0,80) на (123.123.123.123, 45356) и может принимать соединений больше 80 000.
Но есть 2 момента как это можно сломать.
Перед сервером стоит роутер с snat - тогда порты закончатся в нём.
nginx настроен на proxy_pass в бэкэнд сервер на tcp сокет - тогда нему потребуется открыть новое соединение с бэкэндом (не с клиентом) и там уже кончатся порты. В этом случае надо переходить на unix сокеты вместо tcp или увеличивать число серверов в proxy_pass