Я хотел бы использовать 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