Start typing to search across invoices, services, domains, tickets, and more...
На сервере для сети сайтов часто требуется, чтобы каждый сайт работал на собственном IP — так проще управлять сертификатами и изолировать риски. В статье показано, как назначить отдельный IP каждому сайту на сервере для сети сайтов: привязка адресов через listen IP:80/443 в Nginx, настройка в BT Panel/aaPanel, краткий обзор исходящего IP и SNAT, а также практические советы по SEO. Подходит для Nginx в Debian/Ubuntu и CentOS/Rocky/AlmaLinux.
Nginx может слушать только существующие в системе адреса, иначе появится ошибка cannot assign requested address:
ip -4 addr show dev eth0 | grep inetВ блоке server каждого сайта замените listen 80; на listen IP:80;. Конфиги обычно лежат в /etc/nginx/conf.d/ или /etc/nginx/sites-available/:
server {
listen 203.0.113.11:80;
server_name site1.example www.site1.example;
root /var/www/site1;
index index.html index.php;
}
server {
listen 203.0.113.12:80;
server_name site2.example www.site2.example;
root /var/www/site2;
index index.html index.php;
}Теперь запросы на конкретный IP попадают только на сайты, привязанные к нему, даже если заголовок Host не совпадает.
Аналогично укажите отдельный IP для порта 443 и свой сертификат для каждого сайта:
server {
listen 203.0.113.11:443 ssl;
server_name site1.example www.site1.example;
ssl_certificate /etc/nginx/ssl/site1.example/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/site1.example/privkey.pem;
root /var/www/site1;
}Если на одном IP только один HTTPS-сайт, даже клиенты без поддержки SNI получат правильный сертификат.
Добавьте default_server для каждого IP, отклоняющий неизвестные домены, чтобы никто не мог направить свой домен на ваш IP и зеркалировать контент:
server {
listen 203.0.113.11:80 default_server;
server_name _;
return 444;
}nginx -t && systemctl reload nginx
ss -lntp | grep nginxДо обновления DNS проверяйте сайты с помощью curl --resolve:
curl -I --resolve site1.example:80:203.0.113.11 http://site1.example/
curl -I --resolve site2.example:80:203.0.113.12 http://site2.example/Новые сайты в BT Panel/aaPanel по умолчанию слушают порт 80 на всех IP. Чтобы привязать сайт к отдельному IP, откройте настройки сайта в панели, перейдите к конфигурационному файлу и замените строки listen на конкретный IP:
listen 203.0.113.11:80;
listen 203.0.113.11:443 ssl;Директива listen в Nginx определяет только входящий IP. Исходящие запросы сервера (парсинг, вызовы API, почта) по умолчанию идут с основного IP. Чтобы трафик сайта уходил с нужного адреса, привяжите источник в коде (curl --interface, CURLOPT_INTERFACE в PHP cURL) или запускайте сайт от отдельного пользователя и настройте SNAT по пользователю через iptables:
useradd -r -s /sbin/nologin site1run
iptables -t nat -A POSTROUTING -o eth0 -m owner --uid-owner site1run -j SNAT --to-source 203.0.113.11
curl --interface 203.0.113.11 https://ifconfig.meСохраните правила через iptables-save или netfilter-persistent, иначе они пропадут после перезагрузки.
Обычно IP не привязан к интерфейсу или порт занят другим процессом. Проверьте через ip addr и ss -lntp.
Проверьте, не осталось ли блока server с listen 80 default_server, и не указывает ли DNS на старый IP.
Да: используйте <VirtualHost 203.0.113.11:80> вместе с директивой Listen.
Если проблема не решена, создайте тикет в круглосуточную техподдержку IMIDC.