我们说我有一台网关服务器连接到互联网(一个公共IP XX.XX.XX.XX
- *.mydomain.com
指向它;);和两个网络服务器A& B已连接(192.168.0.1
和192.168.0.2
)并正在运行apache2
。
在网关上,所有http流量当前都被重定向到服务器A:
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443
(这是完美的工作)
我正在慢慢地将Web服务器从服务器A迁移到服务器B.目前,我有多个子域(*.mydomain.com
)指向服务器A,我正在计划逐步推动每个网站到服务器B。
在给定时间,当客户继续site1.mydomain.com
时,www/
文件夹可能仍在服务器A上,或者已经在服务器B上。
我可能是你而且很天真,但我虽然可以对服务器B执行相同的NAT,所以当我继续siteY.mydomain.com
时,流量将在两个网络服务器上进行,而带有虚拟主机的流量正在显示网页。我试过这些规则:
# server A - rules already used
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443
# server B - new rules
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 80 -j DNAT --to 192.168.0.2:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.2:443
但我认为两者都被忽略了,因为每个请求仍然登陆服务器A.
1。有可能"重复"两个网络服务器上的交通? (也许这是愚蠢的,对不起)
2. 我可以告诉网关类似于#34; ,如果它位于服务器A上,则保留在服务器A上;但如果是site2.mydomain.com
,请转到服务器B "?
3. 实现这一目标的最佳解决方案是什么?
我无法让网关运行apache。理想情况下: 我不想使用不同的端口; 我不想编辑服务器A或B iptables。
如果需要,请随时纠正我或询问更多细节!
源头/线索:
答案 0 :(得分:0)
我不是通过iptables来实现这个,因为你最终可能需要检查https SNI以查看正在请求的主机名,所以也许一个解决方案(如果你的应用程序支持它)将设置一个代理(也许是nginx) )也可以提供终止。
对于nginx,使用此规则的简单服务器就足够了:
server{
listen [::]:80;
listen [::]:443 ssl;
server_name site2.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Singlesite true;
proxy_set_header Host $host;
proxy_pass $scheme://192.168.0.2;
}
}
server{
listen [::]:80;
listen [::]:443 ssl;
server_name site1.example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Singlesite true;
proxy_set_header Host $host;
proxy_pass $scheme://192.168.0.1;
}
}
也可能取决于您的迁移过程,可能有更好的方法来执行此操作。