【发布时间】:2018-03-23 19:59:36
【问题描述】:
我想模仿一个负载均衡器,如果有人去
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>
剩下的两个问题:
问题 1
为了允许子目录,我必须在ProxyPass 和ProxyPassReverse 行中添加一个斜杠。
这可以从:
jpl.example.com/test/ => http://203.0.113.22:3000
jpl.example.com/test/subdir1/ => http://203.0.113.22:3000/subdir1/
jpl.example.com/test/subdir2/ => http://203.0.113.22:3000/subdir2/
但是如果我去掉尾部的斜线就行不通了:
jpl.example.com/test
jpl.example.com/test/subdir1
jpl.example.com/test/subdir2
如果用户忘记输入斜杠,有什么办法让它工作吗?
问题 2
第二个问题太复杂了,所以我把它移到its own question。该问题涉及长轮询不再起作用,因为它找不到 socket.io。
【问题讨论】:
-
设置代理,所以访问
http://example.com/mysite会被转发到你的其他服务器。 -
@LawrenceCherone 嗯,你的意思是用 PHP 设置代理吗?其他网站使用 JavaScript 来获取数据等,因此不确定是否可以完全正常工作。
-
@LawrenceCherone 这听起来像是我必须进行更多研究的事情。我正在使用 Apache,所以此页面上的内容是否是您推荐的内容:httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html
-
我还需要使用长轮询,所以也需要一些可以使用的东西。