这是我的家庭设置。我的 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 数据包,然后建立与正确后端服务器的连接。这基本上使路由器本身成为反向代理。代理软件通常会做得更好,并会为您提供更多选择。