Запуск кількох додатків на одному порту

Здається неможливим, правда? Ну, спойлер: в основному так і є.

pic

Як запустити кілька додатків на одному порті?

Ось у чому справа: це насправді неможливо. Чому? Тому що номери портів як VIP-пропуски — кожен зарезервований для одного додатку. Якщо другий додаток намагається проникнути, ви отримаєте помилку: "Порт уже використовується."

Отже, після деяких пошуків в Інтернеті (добре, можливо, багато пошуків) я знайшов два способи обійти цю проблему:

  1. Об'єднати весь код в один додаток Ви можете об'єднати всю функціональність в один додаток Spring Boot і запустити його на одному порту. Легко, але не завжди практично, якщо працюєте з окремими проєктами.
  2. Використати зворотний проксі (наприклад, 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

Leave a Reply

Your email address will not be published. Required fields are marked *