我正在考虑切换到 Amazon EC2 来托管我的网站以处理更多流量。似乎我必须更新 DNS 记录以指向新服务器,但我想知道是否有办法避免等待新 DNS 记录传播。将代码放在两个主机上对我来说不起作用,因为应用程序非常频繁地写入数据库。我考虑过在旧主机上使用元重定向或 php 重定向来重定向到新主机 ip,但想知道是否有更好、更可接受的方法来做到这一点。
答案1
这是我一直使用的技巧...:) 它假定您控制当前服务器。
将 site/db/whatever 放在新服务器和旧的/当前服务器上,启用代理、proxy_http 和重写模块,然后在旧的/当前站点的 apache 配置文件中添加以下几行:
RewriteEngine on
ProxyPass / http://<your-fqdn-here>/
ProxyPassReverse / http://<your-fqdn-here>/
最后,在你的/etc/hosts旧/当前服务器的文件具有以下语法:
<new-ip-address-of-ec2> <your-fqdn-here>
就是这样。你有一个指向自身的反向代理,但将自己的名称解析到你的新服务器。当 DNS 传播展开时,新服务器将直接受到攻击。我们称这个为巧妙的小技巧预防性计划生育或者伪递归反向代理。
对于那些需要在防火墙上戳很多漏洞的麻烦的(我指的是设计很差的)网络应用程序,这允许您只保留 dmz 上的反向代理服务器,并且只将端口 80/443 戳到内部网络。
答案2
让旧主机将 http 请求代理到新主机
答案3
您还可以通过在移动之前降低域名的 TTL 来减少等待 DNS 传播的时间。
答案4
(这改进了Peter Carrero 的回答在这里,避免了本地 DNS 弯曲的需要。)
在新服务器上安装网站。
在旧服务器上,首先启用一些 Apache 模块:
a2enmod proxy a2enmod proxy_http a2enmod rewrite
在旧服务器上添加到您的网站的 vhost 配置(其中 123.456.1.1 代表新服务器的 IP 地址):
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} ProxyPreserveHost on ProxyPass / http://123.456.1.1/ ProxyPassReverse / http://123.456.1.1/
确保新服务器上没有为网站配置任何从 HTTP 到 HTTPS 的流量转发。如果与代理配置结合,则会导致重定向循环。
DNS 传播结束后,从旧服务器中删除您的网站的 vhost 配置,但将 HTTP 到 HTTPS 重定向的部分移动到新服务器(如果需要)。
解释:和 Peter 的回答一样,我们得到了一个指向不同服务器上的同一网站的反向代理。但我们不使用 来弯曲 DNS /etc/hosts
,而是使用 来在 Apache 配置中完全覆盖 DNS,从而达到相同的效果ProxyPreserveHost on
。根据 Apache 手册,这将Host:
在将原始传入请求代理到新服务器时保留其 HTTP 标头设置。因此,服务器将像往常一样将其用于基于名称的虚拟托管。