Один белый ip и несколько веб-ресурсов на разных виртуалках внутри гипервизора приводят к необходимости разруливать входящие запросы с использованием обратного прокси. Рассмотрим установку и настройку NGINX на поверх Proxmox Virtual Environment. Схема стенда отображена на картинке:

Листинг конфигурации сети на гипервизоре:
# /etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 1.2.3.4/29
gateway 1.2.3.1
dns-nameservers 77.88.8.8 77.88.8.1
auto vmbr0
iface vmbr0 inet static
address 10.0.0.1/27
bridge-ports none
bridge-stp off
bridge-fd 0
# Включаем форвардинг в ядре
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
# Включаем маскарадинг из сети ВМ наружу через eth0
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/27' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/27' -o eth0 -j MASQUERADEОбновляем репозитории и ставим nginx:
apt-get update
apt-get install nginxСоздаём новый конфиг (можно, конечно, вписать всё в дефолтный, но для наглядности я вынесу его в отдельный):
nano /etc/nginx/sites-available/yourhost.net## Редиректим HTTP в HTTPS
server {
listen 80;
server_name www.yourhost.net;
return 301 https://www.yourhost.net$request_uri;
}
server {
listen 80;
server_name blog.yourhost.net;
return 301 https://blog.yourhost.net$request_uri;
}
## Объявляем ресурс с названием www.yourhost.net по протоколу https
server {
listen 443 ssl http2;
server_name www.yourhost.net;
ssl_certificate /etc/ssl/yourhost.net.crt;
ssl_certificate_key /etc/ssl/yourhost.key;
access_log /var/log/nginx/www.yourhost.net-access.log;
error_log /var/log/nginx/www.yourhost.net-error.log;
## Включаем проброс www.yourhost.net на ВМ с ip 10.0.0.11
## С помощью proxy_set_header передаём на ВМ реальный ip клиента (иначе будет 10.0.0.1)
location / {
proxy_pass https://10.0.0.11;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
## Объявляем ресурс с названием blog.yourhost.net по протоколу https
server {
listen 443 ssl http2;
server_name blog.yourhost.net;
access_log /var/log/nginx/blog.yourhost.net-access.log;
error_log /var/log/nginx/blog.yourhost..net-error.log;
ssl_certificate /etc/ssl/blog.yourhost.net.crt;
ssl_certificate_key /etc/ssl/blog.yourhost.key;
## Включаем проброс blog.yourhost.net на ВМ с ip 10.0.0.12 по HTTP (!)
## С помощью proxy_set_header передаём на ВМ реальный ip клиента (иначе будет 10.0.0.1)
location / {
proxy_pass http://10.10.0.12;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Обратите внимание:
— даже если клиент обратился по http, его перекинет на https
— независимо от того, что взаимодействие с клиентом идёт по https, обмен между reverse proxy и виртуалкой может быть как по https, так и по http (нешифрованный трафик при этом будет только между ними).

То есть:
— для www.yourhost.net сертификат SSL должен быть и на гипервизоре с обратным прокси, и на ВМ
— для blog.yourhost.net сертификат SSL достаточно положить только на гипервизор (Вы должны быть уверены, что нешифрованное взаимодействие между гипервизором и виртуалкой никто не перехватит). Пример приведён исключительно в учебных целях, делать так в продакшне не стоит.
Линкуем созданный конфиг и тестируем его:
ln -s /etc/nginx/sites-available/yourhost.net /etc/nginx/sites-enabled/yourhost.net
nginx -tЕсли ошибок нет — перезапускаем nginx:
service nginx reloadПеореходим на виртуалку. Конфиг nginx на ней не будет отличаться от стандартного, подходящего к используемой CMS за исключением двух директив, подхватывающих реальный ip клиента вместо ip гипервизора. Добавьте в секцию server:
set_real_ip_from 10.0.0.1;
real_ip_header X-Real-IP;