我公司目前正在努力实现一个简单的HTTP服务器的某种彗星 -technique(长轮询的XHR请求)。 由于JavaScript
是非常严格的跨域请求我有几个问题:
- 我的理解,同时服务的请求,所以写了“脚本”的网站通常会阻塞了Apache,任何Apache工人被阻断时有服务请求所有工人。 - >不行!
- 我想出了这个想法写一个自己的简单的HTTP服务器只为服务这个长轮询请求。 此服务器不应该被封锁,所以每个工人可以处理在同一时间很多要求。 正如我的网站还包含内容/图像等和我的服务器不需要服务器的内容我就开始了他的不同端口上,然后80现在的问题是,我不能我之间交互
JavaScript
通过我的Apache交付和我的彗星服务器在不同的端口上运行,因为一些跨域限制。 - >不行! - 然后,我想出了一个主意,用
mod_proxy
到我的服务器地图上的新的子域。 我真的不能够弄清楚如何mod_proxy
作品,但我能想象,我知道有同样的效果,我的第一种方法?
什么是创建这些类型的组合,这种经典的网站和这些长轮询的XHR请求的最佳方式? 我需要我自己来实现我的服务器上的内容交付?
我敢肯定,使用mod_proxy将阻止工人在正在处理该请求。
如果你可以使用2 IPS,有一个相当简单的解决方案。 比方说,一个IP为1.1.1.1 IP B是2.2.2.2,让我们说你的域名是example.com。
这是它如何工作:
- 配置Apache监听端口80,但仅限于IP A.
- 启动端口80上的其他服务器,但只有在IP B.
- 配置的XHR请求在您的域的子域,但具有相同的端口。 因此,跨域限制不会阻止他们。 所以,你的网站是example.com,而XHR请求去xhr.example.com,例如。
- 配置你的DNS,使example.com解析到IP A,并xhr.example.com解析为IP B.
-你完成了。
该解决方案将工作,如果你有2个服务器,每个人都有自己的IP,如果你有2个IP的一台服务器,将正常工作。
如果你不能使用2 IPS,我可以有另一种解决办法,我检查它是否适用于你的情况。
这是一个棘手的问题。 即使你过去你正在运行到安全问题,你最终不得不保持开放目前在看网页每一个客户端的TCP连接。 您将不能创建一个线程来处理每个连接,您将无法从一个单独的线程所有连接“选择”。 已经这样做过,我可以告诉你,这是不容易的。 你可能想看看的libevent ,它的memcached使用一个类似的结束。
在一定程度上你也许可以逃脱设定长期超时并允许Apache有工人,其中大部分将是闲置的大部分时间的一个巨大的数字。 仔细选择和Apache工人模块的结构延伸这数千个并发用户,我相信。 在某些时候,但是,它不会扩展了。
我不知道你在做什么基础设施的样子,但我们中有一个名为F5s网络机柜负载平衡箱。 这些呈现单个外部域,但重定向流量根据它们的响应时间的多个内部服务器,在请求头,饼干等。它们可以被配置成在虚拟域内发送请求一定路径到一个特定的服务器。 因此,你可以有映射到一个特定的服务器来处理这些彗星请求example.com/xhr/foo请求。 不幸的是,这不是一个软件解决方案,而是一个相当昂贵的硬件解决方案。
无论如何,你可能需要某种形式的负载平衡系统(或者也许你有一个的话),也许它可以被配置来处理这种情况要比Apache可以更好。
我有一个问题,几年前,我使用的客户端 - 服务器系统与专有二进制协议能够访问我们的服务器上的端口80,因为他们一直有与所使用的系统的自定义端口上的防火墙问题,想客户。 我需要的是将生活在端口80和指挥交通,以Apache或取决于从什么客户碰上了前几个字节的应用程序服务器的代理。 我找了一个解决方案,并没有发现任何满足。 我考虑写一个Apache模块,用于委托等插件,但最终通过自己的自定义内容感应代理服务推出。 也就是说,我认为,这就是你想要做什么,最坏的情况。
要回答关于MOD代理的具体问题:由一台服务器(或服务)产生的, 是的 ,你可以设置mod_proxy的服务内容,是不是面向公众的(即,只能通过内部地址或本地主机)。
我已经在生产环境中做到了这一点,它的工作原理非常,非常好。 阿帕奇通过转发代理国防部通过AJP工人,和其他一些请求到Tomcat的GIS应用服务器。 正如其他人所指出的那样,跨站点的安全性可能会停止你一个子域名的工作,但没有理由为什么你不能代理请求到mydomain.com/application
谈谈您的具体问题 - 我想真的是你在看问题的“长期居住要求”陷入困境 - 即假设当你做出这些要求就是这样的一个,整个过程需要停止。 它好像你正试图通过更改系统架构,以解决应用程序架构的问题。 在-其实你需要做的究竟是什么把这些背景要求之处; 和多线程它:
- 客户机发出请求到远程服务“ 用数据A,B和C执行任务X”
- 您的服务收到请求:它传递到调度器发出的请求,唯一的门票/令牌。 然后服务返回此令牌客户端“ 谢谢,你的任务是根据令牌ž运行队列 ”
- 客户端然后挂到这个道理,显示“加载/请稍候”对话框,并设置一个计时器,大火说,为参数,每一秒
- 当定时器触发时,客户端发出另一个请求到远程服务“ 你有我的任务的结果,它的象征Z”
- 然后,后台服务可以与您的调度检查,并可能会返回一个空文件“ 没有,还没有完成 ”或结果
- 当客户端得到结果反馈,它可以简单地清除定时器并显示出来。
只要你与线程(你必须是如果你已经表明你看着写你自己的HTTP服务器相当舒适,这应该不会太复杂 - 在HTTP侦听部分的顶部:
- 调度对象 - singleton对象,真的只是包装堆了“先入先出”。 新的任务去到堆栈的结束,作业可以从一开始就被拉断:只要确保发行工作的代码是线程安全的(少,你得到两个作品从堆栈拉同样的工作)。
- 工作线程可以非常简单 - 可以访问的调度,问下一个作业:如果有,那么请在作品发送结果,否则,仅仅睡了一段时间,重新开始。
这样一来,你永远不会被阻塞的Apache超过需要更长,因为所有你正在做的是“做X”或“给我X结果”的问题的请求。 你可能会想建立一些安全的几点特征 - 如处理失败的任务,并确保有一个超时在客户端,因此不会无限期地等待。
二 三个备选方案:
- 使用nginx的 。 这意味着运行3台服务器:Nginx的,Apache和你自己的服务器。
- 它自己的端口上运行服务器 。
- 使用Apache mod_proxy_http(作为自己的建议)。
我已经证实mod_proxy_http(阿帕奇2.2.16)的作品进行代理彗星的应用程序(搭载气氛0.7.1)GlassFish中3.1.1运行。
我的全部源测试应用程序是在这里: https://github.com/ceefour/jsfajaxpush