Apache 能够代理请求的HTTP服务器
出于性能方面的原因,我不得不重写web基础设施的一部分Apache 能够代理请求的HTTP服务器,apache,http,https,proxy,Apache,Http,Https,Proxy,出于性能方面的原因,我不得不重写web基础设施的一部分 为此,我将关键部分写为C++中的Web应用程序。此web应用程序侦听给定端口,一次只接受一个TCP连接,并处理在当前连接上收到的所有HTTP请求 您可以按如下方式启动它以侦听端口8080: ./webapp 8080 虽然它工作得完美无瑕,速度比以前快得多,但它的局限性在于应用程序的一次性连接特性。不能通过一个应用程序实例通过多个连接同时提供HTML页面、Javascript和图像 为了克服这个限制,我想运行一个前端反向代理HTTP服务器
为此,我将关键部分写为C++中的Web应用程序。此web应用程序侦听给定端口,一次只接受一个TCP连接,并处理在当前连接上收到的所有HTTP请求
您可以按如下方式启动它以侦听端口8080:./webapp 8080
虽然它工作得完美无瑕,速度比以前快得多,但它的局限性在于应用程序的一次性连接特性。不能通过一个应用程序实例通过多个连接同时提供HTML页面、Javascript和图像
为了克服这个限制,我想运行一个前端反向代理HTTP服务器,它监听端口80,并在后台运行的web应用的多个实例上均匀地重定向传入的HTTP请求。这些实例可以在启动时创建,如下所示:
./webapp 10000
./webapp 10001
./webapp 10002
./webapp 10003
./webapp 10004
./webapp 10005
./webapp 10006
./webapp 10007
./webapp 10008
./webapp 10009
前端应配置为在开始时与每个web应用建立永久性HTTP连接,然后将传入的HTTP请求转发到其中一个正在运行的web应用,并将其均匀分布
反向代理还应支持从客户端到自身的SSL。支持SPDY将是一个加号,但不是必须的
我的问题是:在我的场景中,哪些HTTP反向代理能够作为前端工作?如果您知道多个服务器,那么每种服务器的优缺点是什么?您使用单一连接服务器的动机是什么?对于Web服务器来说,这听起来是个糟糕的选择。当您的站点出现时,每个客户端浏览器通常会并行发送几十个请求 如果您通过TCP连接生成一个进程,那么最终将导致性能不佳。实际上,您在这里寻找的是一个多线程服务器,而不是一个多进程基础架构(拥有不同进程有什么意义?) 尽管如此,您仍然可以走几条路:
- 如果您真的希望有单独的流程,那么每次收到请求时,您都会使用
。就性能而言,这不是一个好问题,但这是我能想到的最接近你最初的问题webapp
- 您可以使用单线程
,但是您可以维护一个您所收听的套接字列表,并将它们与它们的“好友套接字”(buddy socket)配对,后者是它们转发流量的对象(请注意,它是双向工作的)。不过,这并不是最佳性能,因为您可能会受到内核调用的限制webapp
- 您为每个请求生成一个新线程,然后仅在该线程中处理该请求,就像处理单线程体系结构一样
仔细想想,您实际上是在尝试实现代理的一面,而另一面是转发到您的
webapp
。因此,您应该使用代理技术。听起来您不一定需要反向代理,而是需要负载平衡器。我将设置为每个webapp进程作为一个后端,然后进行循环平衡,以便每个新连接都转到列表中的下一个进程
也可以做这些事情,但我不确定它是否附带了开箱即用的负载平衡功能,或者它是否是一个附加模块。Nginx的好处是它可以缓存静态资产,如CSS和图像。Nginx是一个很好的选择
优点:
- 支持SSL终止
- 开箱即用的支架
- 联系
- 具有SPDY支持(无服务器推送)。最新版本添加了http2支持,删除了spdy
- 您必须在nginx配置中硬编码上游服务器,如下所示。如果动态更新环境变量,则无法通过环境变量轻松读取上游服务器设置
http { upstream myapp1 { server localhost:10000; server localhost:10001; server localhost:10002; } server { listen 443 ssl spdy; location / { proxy_pass http://myapp1; } } }