是否可以使用 Tomato 在多台服务器但一个公共 IP 上运行虚拟主机(或同等主机)?

是否可以使用 Tomato 在多台服务器但一个公共 IP 上运行虚拟主机(或同等主机)?

这是我的家庭设置。我的 ISP 为我提供了一个 IP 地址。我有一个顶级域名 (TLD) 和指向该 IP 的多个子域名。互联网通过我的有线调制解调器接入,并插入我的 AdvancedTomato 路由器。我想在不同的机器上安装几个 Web 服务器,并让路由器根据域名转发流量。这是一张基本图片

    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 上的所有内容都转到机器 1),然后使用该机器上的 Apache 的 VirtualHost 打开不同的网站。

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

我的问题是:在路由器级别是否可以做到这一点?如果不行,大型网站如何设置它?我知道 HTTP 处于应用程序级别,域请求也在那里,那么路由器可以查看这些信息吗?我需要代理服务器吗?

此外,这应该是服务器故障吗?

答案1

你所描述的是反向代理,大型网站如何设置它?——它们在路由器后面有代理服务器

是的,在路由器层面上是可能的,但不要以为任何路由器都能做到这一点

AdvancedTomato 可以直接从 UI 执行此操作。在 Web 服务->Web 服务器->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 反向代理

答案2

我知道这是一个老问题,上面的答案是正确的。然而,没有在路由器级别完成这一操作是有原因的。

为了让数据包级设备(路由器)能够做到这一点,它需要能够看到正在请求哪个站点。在 HTTP 中,这出现在 http 消息的请求标头(主机)中,而在 HTTPS 中,这通常在 TLS 握手(客户端 hello 数据包)中使用名为服务器名称指示 (SNI) 的扩展来提供。

这两个都只发送TCP 连接已建立(TCP 三次握手),路由器要执行此操作,它需要成为 TCP 端点本身,代表其后面的服务器接受连接本身(希望该服务器正在运行),等待客户端发送 http 请求或 TLS 客户端 hello 数据包,然后建立与正确后端服务器的连接。这基本上使路由器本身成为反向代理。代理软件通常会做得更好,并会为您提供更多选择。

相关内容