Здається неможливим, правда? Ну, спойлер: в основному так і є.
Як запустити кілька додатків на одному порті?
Ось у чому справа: це насправді неможливо. Чому? Тому що номери портів як VIP-пропуски — кожен зарезервований для одного додатку. Якщо другий додаток намагається проникнути, ви отримаєте помилку: "Порт уже використовується."
Отже, після деяких пошуків в Інтернеті (добре, можливо, багато пошуків) я знайшов два способи обійти цю проблему:
- Об'єднати весь код в один додаток Ви можете об'єднати всю функціональність в один додаток Spring Boot і запустити його на одному порту. Легко, але не завжди практично, якщо працюєте з окремими проєктами.
- Використати зворотний проксі (наприклад, Nginx) Ось тут і починаються цікаві речі. За допомогою зворотного проксі ви можете маршрутизувати запити до різних додатків на основі URL-шляхів, при цьому відкриваючи лише один порт для зовнішнього світу. Зацікавлені? Давайте розглянемо цей підхід детальніше.
Налаштування Nginx для зворотного проксі
Оскільки я користуюся Linux, ось як можна налаштувати Nginx:
sudo apt install nginx
Налаштування Nginx: Відкрийте конфігураційний файл Nginx і налаштуйте зворотний проксі. Ось приклад:
sudo nano /etc/nginx/sites-available/myapp
server {
listen 3000;
location / {
proxy_pass http://www.example.com/;
}
location /app1/ {
proxy_pass http://localhost:8081/;
}
location /app2/ {
proxy_pass http://localhost:8082/;
}
}
Як це працює:
Коли ви відвідуєте http://localhost:3000/app1/, це як якщо б ви казали Nginx:
"Гей, перенаправ мене на http://localhost:8081/."
Аналогічно, http://localhost:3000/app2/ буде спрямовувати на http://localhost:8082/.
Магія? Майже. Тепер ви запускаєте два додатки, але тільки один порт відкритий.
Застосування конфігурації:
Перезапустіть Nginx, щоб застосувати зміни:
sudo systemctl restart nginx
Висновок (або чому мій ментор не був вражений)
Цей підхід працює — майже. Хоча він вирішує проблему зовнішнього порту, він все одно споживає кілька внутрішніх портів, що не зовсім підходило для нашого випадку.
І мій ментор відкинув мою ідею швидше, ніж я встиг сказати "proxy pass".
Але все ж я подумав, що це варто поділитися. Хто знає? Може, це заощадить комусь іншу головну біль. Є кращі ідеї з приводу портів? Залишайте коментар — я на слуху (і трохи не виспався).
Перекладено з: Run multiple application on a same port