У меня есть хост-машина 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, когда захотите ...