3

Вот мои домашние настройки. У меня есть один IP-адрес, предоставленный моим провайдером. У меня есть один домен верхнего уровня (TLD) и несколько поддоменов, которые указывают на этот IP. Интернет входит через мой кабельный модем и подключается к маршрутизатору AdvancedTomato. Я хочу установить несколько веб-серверов на отдельных компьютерах и сделать так, чтобы маршрутизатор переадресовывал трафик на основе доменного имени. Вот основная картина

    Internet
    |
    |
    └── example.com-x.x.x.x(router)
        ├── machine1-192.168.1.101
        │   ├── project11.example.com
        │   └── project12.example.com
        ├── machine2-192.168.1.102
        │   ├── project21.example.com
        │   └── project22.example.com
        └── machine3-192.168.1.103
            ├── project31.example.com
            └── project32.example.com

Я смог сделать это уже на одной машине, используя базовую переадресацию портов на маршрутизаторе (все на 80-м порту идет на machine1), затем используя VirtualHost на Apache на этой машине, чтобы открывать различные веб-сайты.

    Internet
    |
    |
    └── example.com-x.x.x.x(router)
        ├── machine1-192.168.1.101
            ├── project11.example.com
            └── project12.example.com

Мой вопрос: возможно ли это сделать на уровне маршрутизатора? Если нет, то как крупные сайты настраивают это?Я знаю, что HTTP находится на уровне приложения, и именно там находится запрос домена, так может ли маршрутизатор даже взглянуть на эту информацию? Нужен ли мне прокси-сервер?

Кроме того, это должно быть по вине сервера вместо этого?

2 ответа2

2

Что вы описываете - это обратный прокси-сервер, как это настраивают крупные сайты? - У них есть прокси-серверы за маршрутизаторами

Да, это возможно на уровне маршрутизатора, но не думайте, что любой маршрутизатор может это сделать

AdvancedTomato может сделать это прямо из пользовательского интерфейса. Введите следующее в Веб-службы-> Веб-сервер-> Раздел HTTP. Затем сохраните и нажмите кнопку воспроизведения. Tomato добавляет некоторые дополнительные биты, поэтому, чтобы убедиться, что это конфигурация, которую вы хотите, вы можете увидеть ее в /etc/nginx.conf (или посмотреть /var/log/nginx/error.og, если это не удалось)

    # Because end of http://nginx.org/en/docs/http/server_names.html
    server_names_hash_bucket_size  64; 


    # Adapted from NixCraft
    # http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html

    # Host required
    server {
        listen      80 default_server;
        server_name "";
        return      444;
    }        

    ## Start primary proxy ##
    server {
        listen       80;
        server_name  jira.example.com
                     confluence.example.com
                     stash.example.com
                     cacti.example.com;
        access_log  /var/log/nginx/log/lamp.example.access.log  main;
        error_log  /var/log/nginx/log/lamp.example.error.log;

        ## send request back to apache1 ##
        location / {
             proxy_pass  http://192.168.1.99/;
             proxy_redirect default;
             proxy_buffering off;
             proxy_set_header        Host            $host;
             proxy_set_header        X-Real-IP       $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    ## End ##



    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    # Websockets
    server {
        listen 8686;
        server_name other.example.com;
        location / {
            proxy_pass http://192.168.1.99:8686;
            proxy_redirect default;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    } 

В качестве альтернативы вы можете разместить обратный прокси-сервер за маршрутизатором для перенаправления трафика

Я лично использую DD-WRT - я читал об этом, но лично не внедрил Обратный прокси на уровне маршрутизатора. Обратный прокси DD-WRT

1

Я знаю, что это старый вопрос, и ответ выше верен. Однако есть причина, по которой это не делается на уровне маршрутизатора.

Чтобы устройство уровня пакетов могло это сделать (маршрутизатор), оно должно иметь возможность видеть, какой сайт запрашивается. В HTTP это указывается в заголовке запроса (Host) в сообщении http, а в HTTPS это обычно предоставляется в рукопожатии TLS (пакет приветствия клиента) с использованием расширения, называемого указанием имени сервера (SNI).

Оба из них отправляются только после того, как установлено соединение TCP (TCP 3 way handshake), и для этого маршрутизатор должен сам стать конечной точкой TCP, принять само соединение от имени сервера за ним ( надеюсь, что сервер работает), подождите, пока клиент отправит запрос http или приветственный пакет клиента TLS, а затем установите соединение с правильным внутренним сервером. Это в основном делает маршрутизатор обратным прокси-сервером. Прокси-программное обеспечение, как правило, делает лучше и даст вам больше возможностей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .