Назад | Перейти на главную страницу

Пересылать запросы одному из нескольких гостей на хосте KVM?

У меня есть хост-машина Ubuntu с 3 гостями. У всех из них разные веб-службы, работающие на порту 80. Как я могу сказать хосту, что он должен перенаправить запрос соответствующему гостю на основе имени хоста?

Хост: example.com

Гости: git.example.com, www.example.com, psql.example.com

Поскольку вам нужно маршрутизировать на основе имени хоста, а не порта, решение iptables по NAT для трафика к виртуальным машинам отсутствует.

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

Точная конфигурация будет зависеть от того, какой веб-сервер вы используете, а какой веб-сервер вы выберете, будет зависеть от того, какие функции вам нужны (SSL?), А также от личных предпочтений. Сообщите мне, какой веб-сервер вы предпочитаете, и я могу отредактировать ответ, включив в него пример конфигурации, если это необходимо.

редактировать: Базовая конфигурация nginx:

http {

    # ...existing config basics... server_name, NOT servername

    server {
        listen 80;
        server_name git.example.com;
        location / {
            # git server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server {
        listen 80;
        server_name psql.example.com;
        location / {
            # psql server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    server {
        listen 80;
        server_name www.example.com;
        location / {
            # www server IP below:
            proxy_pass http://10.x.x.x:80/;
            # re-send the host header - this may not be necessary
            proxy_set_header Host $host;
            # set the X-Forwarded-For header, so that the public IP of the client is available to the backend server
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

Преодолейте все связи. Таким образом, ваши гости могут получить IP в той же сети, что и хост. Теперь добавьте запись «A» для этих трех гостей в DNS.

Имейте в виду, что если запрос предназначен для git.example.com, он никогда не поступит на example.com, если для него не задан CNAME.

[ИЗМЕНИТЬ на основе комментария]
Поскольку вы не можете использовать DNS, я бы рекомендовал вообще не запускать виртуальные машины. Вместо этого создайте несколько виртуальных хостов и используйте их. В вашем nginx просто определите несколько server_name. Проверьте nginx вики для примера.

Вы должны установить его на хост, который имеет доступ к Интернету, веб-серверу и использовать "конфигурацию виртуальных хостов на основе имени" (попробуйте использовать в Google с именем вашего веб-сервера). Каждая виртуальная машина на основе имен должна быть прокси для одного виртуального сервера. Вы можете использовать apache, nginx, lighttpd, когда захотите ...