Назад | Перейти на главную страницу

Nginx Proxy: большой диапазон портов для эквивалентного порта на другом IP-адресе

Я хотел бы использовать nginx для проксирования всего диапазона (9000-9999) на один и тот же порт на другом IP-адресе. Возможно ли, чтобы nginx автоматически привязался к тысяче портов? Могу ли я сделать это без написания 4000 строк конфигурации nginx?

Сделать это можно с помощью встроенного переменная server_port:

proxy_pass http://backend-host-name:$server_port;

Это заставит любой порт, на который поступает запрос, проксироваться на тот же внутренний порт.

Таким образом, вам не нужно 1000 операторов proxy_pass. Но у вас может быть проблема с Слушать директива. Он не принимает ряд портов, поэтому вам понадобится 1000 строк формы:

listen 9000;
listen 9001;
listen 9002;

Этот список можно легко создать с помощью электронной таблицы. Возможно, вам также потребуется настроить количество дескрипторов файлов, разрешенных nginx для обработки этого количества сокетов. Nginx может это сделать, ограничения могут быть на уровне ОС. Видеть Вот и Вот.

Я скажу, что это проблемный дизайн. Зачем тебе 1000 портов? Разве использование имен хостов или какой-либо части URL-адреса для различения запросов не имело бы большего смысла? Он был бы гораздо более масштабируемым - не нужно было бы 2000 сокетов в качестве основы.

Вот что я в итоге сделал:

server {
    server_name "~^port(?P<forwarded_port>9\d{3})\.example\.com$";
    location / { proxy_pass http://127.0.0.1:$forwarded_port; }
}

Таким образом, вы можете просто подключиться к http://port9034.example.com;

Начиная с версии NGINX 1.15.10, listen Директива принимает диапазоны портов.

Из документация:

Диапазоны портов (1.15.10) указываются с первым и последним портами, разделенными дефисом:

listen 127.0.0.1:12345-12399;
listen 12345-12399;

Таким образом, используя

server {
    listen 9000-9999;

    proxy_pass http://upstream-host:$server_port;
}

должен сделать свое дело.

Важно отметить, что количество рабочих подключений должно быть соответствующим образом скорректировано, иначе NGINX выдаст ошибку:

# nginx -s reload
nginx: [emerg] 512 worker_connections are not enough for 1000 listening sockets