Эта история из разряда "как не нужно делать". Изначально не планировал ее писать, но потратил некоторое количество времеми и хочется предостеречь других от хождения по граблям.
Имеется набор веб сервисов в которых не реализована настройка префикса URI, т.е. все ссылки строятся относительно "корня" (например: hostname:port/login, hostname:port/public/script.js, и т.д.).
И есть желание проверить сможет ли Nginx прозрачно проксировать запросы добавляя префикс каждому сервису чтобы не пришлось менять внутренности самих сервисов.
Сразу скажу что существует более надежное и простое решение - дать каждому сервису собственный поддомен, но это бывает сложно с точки зрения процессов: одобрение доменных имён, новые записи в DNS, SSL сертификаты и т.д.
Минимально рабочая конфигурация Nginx получилась не с первого раза:
location /services/svc/ { sub_filter 'public/' 'services/svc/public/'; sub_filter_types 'text/javascript'; sub_filter_once off; proxy_redirect / /services/svc/; proxy_pass http://svc:5000/; }
Что работает:
- перезапись адреса редиректа (например /login на /services/svc/login);
- замена ссылок в HTML и JavaScript ответах;
Что не работает (и лучше не пытаться это чинить):
- ссылки, которые генерирует JavaScript на стороне браузера (они могут совпадать у разных сервисов, так что перезаписывать и их не сработает);
В целом идея включить sub_filter для JavaScript скриптов чревата затейливыми сюрпризами в будущем если перезаписываемый элемент окажется не ссылкой или ее частью.
Комментариев нет:
Отправить комментарий