Sobes.tech
Back to questions
Senior
7

Как на одном порту запустить два приложения?

Companies where asked
Flant

Answer from AI

sobes.tech AI

Нельзя напрямую запустить два разных приложения на одном и том же TCP-порту, так как порт может быть занят только одним процессом. Однако есть несколько подходов, как обойти это ограничение:

  1. Использовать reverse proxy — запустить proxy-сервер (например, Nginx или встроенный в Go HTTP reverse proxy), который слушает нужный порт и маршрутизирует запросы к разным приложениям, работающим на разных внутренних портах.

  2. Мультиплексировать протоколы — если приложения используют разные протоколы или имеют возможность различать запросы, можно написать приложение-демультиплексор, которое принимает все соединения на одном порту и перенаправляет их в зависимости от содержимого.

  3. Использовать Unix domain sockets или другие IPC — если приложения должны взаимодействовать, можно запустить одно приложение на порту, а другое — на сокете, и настроить взаимодействие.

Пример с reverse proxy на Go:

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    target1, _ := url.Parse("http://localhost:8081")
    target2, _ := url.Parse("http://localhost:8082")

    proxy1 := httputil.NewSingleHostReverseProxy(target1)
    proxy2 := httputil.NewSingleHostReverseProxy(target2)

    http.HandleFunc("/app1/", func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = r.URL.Path[len("/app1"):]
        proxy1.ServeHTTP(w, r)
    })

    http.HandleFunc("/app2/", func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = r.URL.Path[len("/app2"):]
        proxy2.ServeHTTP(w, r)
    })

    log.Println("Starting proxy on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Здесь proxy слушает порт 8080 и перенаправляет запросы с префиксами /app1/ и /app2/ на разные приложения, работающие на 8081 и 8082.