我想模仿负载均衡器,如果一个人去
http://example.com/mysite
他们要么看到以下内容:
http://server2.example.com/mysite
或
http://server3.example.com/mysite
使用PHP我可以随机确定用户去哪个网站,但如何在http://example.com/mysite
显示?我是否以某种方式使用占据窗口整个高度和宽度的iframe
?或者有更好的方法吗?
基本上,我希望用户只能在地址栏中看到http://example.com/mysite
,并且不知道他们正在查看该页面的服务器。如果他们查看源代码以查看它,我不介意,但我想确保URL是相同的。
这两个站点使用JavaScript(服务器端和客户端),PHP和HTML。这些站点也在服务器端JavaScript(Node)上使用长轮询。
感谢Lawrence Cherone的建议,我在Apache中实现了一个负载均衡器,如下所示:
<VirtualHost *:80>
ServerAdmin webmaster@example.com
ServerName jpl.example.com
ProxyRequests off
<Proxy "balancer://mycluster">
BalancerMember "http://203.0.113.22:3000"
BalancerMember "http://203.0.113.23:3000"
</Proxy>
ProxyPass "/test/" "balancer://mycluster/"
ProxyPassReverse "/test/" "balancer://mycluster/"
</VirtualHost>
剩下的两个问题:
为了允许子目录,我必须在ProxyPass
和ProxyPassReverse
行添加尾部斜杠。
这适用于:
jpl.example.com/test/
=&gt; http://203.0.113.22:3000
jpl.example.com/test/subdir1/
=&gt; http://203.0.113.22:3000/subdir1/
jpl.example.com/test/subdir2/
=&gt; http://203.0.113.22:3000/subdir2/
但如果我放弃尾随斜线,那就不会工作:
jpl.example.com/test
jpl.example.com/test/subdir1
jpl.example.com/test/subdir2
如果用户忽略输入尾部斜杠,那么如何使其工作?
第二个问题变得太复杂,所以我把它移到了its own question。问题涉及长轮询不再有效,因为它找不到socket.io。
答案 0 :(得分:0)
以下是网站网址中的iframe,根据网址中设置的变量,它可以很容易地成为SESSION变量,基于IP地址等等,这就是你要找的东西吗?
<service name="TravelRequestWebService.TravelRequestService">
<endpoint
address="web"
binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding"
contract="TravelRequestWebService.ITravelRequestService" />
<endpoint
address="json"
binding="webHttpBinding"
behaviorConfiguration="jsonBehavior"
bindingConfiguration="webHttpBinding"
contract="TravelRequestWebService.ITravelRequestService" />
<endpoint
address=""
binding="basicHttpBinding"
contract="TravelRequestWebService.ITravelRequestService" />
</service>
答案 1 :(得分:0)
如果您正在尝试构建实际的负载均衡器,请不要使用PHP。拆分服务器的负载是服务器的功能,而不是您的应用程序。但假设你的问题背后有一些合理的理由,我会尽力回答。
从技术上讲,你可以用一个简单的包含来做到这一点:
<?php include 'http://'.$subdomain.'.example.com/mysite'; ?>
但由于每次请求时都会下载页面,因此无法执行此操作。相反,您可能希望将页面写入文件以进行缓存。所以你的php会做类似这样的伪代码:
if cache file exists for this page
get contents of file
echo contents of file
else
get page from the other server
write it to a cache file
echo contents of file
答案 2 :(得分:0)
要重定向到用户不可见的网站(在地址栏中),您可以执行以下操作:
<script>
window.history.pushState("", "[Title (ignored by most browsers)]", "[relative addres for the url you want to simulate (eg.: //example.com/mysite]");
</script>
当服务器将浏览器重定向到加载页面时,此脚本将运行,将假地址插入地址栏。
更多信息:Updating address bar with new URL without hash or reloading the page
PS。:重新加载页面会导致虚假地址加载。浏览器中的前向导航按钮可能无效。