@ukoHka
Всего понемногу

Как установить один IP адрес на два виртуальных сервера?

На сервере под ос от Майкрософта через Hyper-V установлены два виртуальных сервера с Убунтой на борту. У каждого виртуального сервера есть свой внутренний IP адрес и общий внешний. На каждом из них также установлен апач и залиты сайты. Сайты первого сервера спокойно открываются, а второй сервер только открывает сайт по умолчанию если зайти по IP. Если зайти по домену, привязанному к внешнему IP, то грузится сайт по умолчанию для первого сервера. Как можно настроить один внешний IP адрес на два виртуальных сервера, чтобы сайты грузились правильно?

Гугл говорит, что для этого нужно настроить апач или порты. Про апач непонятно, на каком из них настраивать, как я понял, в моей ситуации апач должен стоять на винде и серверы создавать через него. Про порты я не понял, как это будет работать так, чтобы пользователь не набирал example.com:10000, то есть прослушиваемый через апач порт автоматически подставлялся для сайтов на втором сервере.
  • Вопрос задан
  • 4663 просмотра
Решения вопроса 1
risik
@risik
Программист
Как я понял, Вы хотите на одной виртуальной машине гонять один сайт (или один набор сайтов), на другой виртуальной машине другой сайт (или опять-же, другой набор сайтов)

В Вашем случае слушать ip адрес должен кто-то один. Это может быть:
1) хост машина (windows), с апачем. Может быть это умеет IIS, но здесь я не специалист.
2) третья виртуалка, на которой установлен только проксирующий веб сервер. Apache или nginx. В этом случае, две другие машины для этого третьего должны быть доступны по внутренним ip адресам, а внешний ip вы связываете только с этой третьей.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Bessome
@Bessome
Администратор Linux, Windows. 1С программист
делаем машину с сервисом nginx, с белым IP; nginx в режиме прокси. В nginx конфиге прописываем где какой сайт лежит, привожу пример своего конфига:
root@ppserver:/etc/nginx# cat nginx.conf
user www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    proxy_cache_path /var/lib/nginx/proxy levels=1:2 keys_zone=proxy_cache:64m max_size=128m inactive=3d;
    reset_timedout_connection on;
    client_header_timeout 15;
    client_body_timeout 15;
    send_timeout 5;
    keepalive_timeout        30 15;
    limit_conn_zone  $binary_remote_addr  zone=perip:5m;
    limit_conn perip 50;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 2k;
    request_pool_size 4k;
    types_hash_max_size 2048;
    server_names_hash_bucket_size  64;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay        on;
    gzip              on;
    gzip_proxied      expired no-cache no-store private auth;
    gzip_buffers      16 8k;
    gzip_comp_level   5;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_vary         on;
    server_tokens off;
    output_buffers 1 32k;
    postpone_output 1460;
    ignore_invalid_headers on;
    client_max_body_size 64m;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

root@ppserver:/etc/nginx/sites-enabled# cat default
server {
        listen   *:80; ## listen for ipv4; this line is default and implied
        return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name blabla.ru;

    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;

        proxy_buffering on;
        limit_conn perip 32;

    location / {
        proxy_pass http://192.168.20.5/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }

    location /pve {
        proxy_pass https://192.168.20.100:8006/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }

    location /cam32 {
        proxy_pass http://10.1.1.239/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
}


два файла -
1. конфиг nginx.conf
2. конфиг default, расположенный /etc/nginx/sites-enabled

в конфиге (2) прописаны несколько различных серверов подсети, которые по различным ссылкам показывает nginx. Работает только по https, так как мне нужен защищенный траффик. Можно модифицировать для http, убрав строчку "return 301 https://$host$request_uri;" и назначив порт не 443, а 80. Так же надо удалить все, что связано с ssl из конфига.

Не трогаем две машины с внутренними IP.
Ответ написан
@aroun
Будет и без портов.

В таком случае сервер по хидеру определяет какому виртуалхосту назначен запрос и этому виртуалхосту его направляет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы