2013-03-31 112 views
2

由于性能原因,我不得不重写我们的Web基础架构的一部分。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 

的前端应配置建立在启动时一个永久 HTTP连接到每个Web应用程序,再往前传入的HTTP请求其中一个正在运行的Web应用程序,均匀分布。

反向代理还应该支持从客户端到自身的SSL。 SPDY的支持将是一个加号,但不是必须的。

我的问题是:哪个HTTP反向代理能够在我的场景中作为前端工作?如果你知道不止一个,每个人的利弊是什么?

回答

0

您只有一台连接服务器的动机是什么?这听起来像是一个网络服务器的可怕选择。当您的网站出现时,每个客户端浏览器通常会并行发送数十个请求。

如果你通过TCP连接产生一个进程,你最终会得到糟糕的表现。真的,你在这里寻找的是一个多线程的服务器,而不是多进程架构(什么是具有不同工艺的地步呢?)

不过,也有几条路径,你可以下去,

  • 如果您真的想拥有单独的流程,则每次收到请求时都会分叉您的webapp。它在性能方面不会很好,但它是您能想到的最初的问题中最接近的。

  • 你留在你的单线程webapp,但你维护你听的套接字列表,并将它们与它们的“伙伴套接字”配对,这些套接字是它们将流量转发到的套接字(注意它可以同时工作) 。尽管如此,这可能不是最佳的性能,因为你可能是内核调用绑定的。

  • 您为每个请求生成一个新线程,然后在此线程中处理此请求,就像处理单线程体系结构一样。

如果我是你,我会直接转向解决方案3,因为它只是最好的选择。它不会太麻烦,因为它接近你的单线程方法(只有一对套接字),并且它没有遍布各处的分叉性能。

我不认为你会找到适合您需求的Web服务器,因为它不是以处理这种情况的标准方式,我怀疑任何人花时间去发展它:)

编辑:

好吧,我理解你的问题,从你的编辑。

对我来说,仍然需要解决的问题仍然是:您需要一个将流量分配给流程的流程。我不认为你会找到这样一个开箱即用的调度程序,所以你需要使用我提到的三种技术之一来实现它。

如果你仔细想想,你真的想要实现代理的一方,另一方面是转发给你的webapp。所以你应该使用代理技术恕我直言。

+0

我很欣赏你的努力,但在所有诚实我甚至不认为你读过我的问题。拥有单一连接服务器的动机是我不想重新发明轮子。我只想重写性能关键部分,并将连接池等留给更成熟,已经存在的Web服务器。我不想为每个TCP连接产生一个新的进程。这就是为什么我说我想在启动时产生我的进程*并且前端应该被配置为在启动时建立到每个Web应用程序的永久HTTP连接。 – JohnCand

+0

实质上,我在寻找一个很好的http://en.wikipedia.org/wiki/Reverse_proxy(请参阅右侧的图像和示例)。 – JohnCand

+0

我编辑了这个问题,使其更加清晰。我希望它有帮助。 – JohnCand

0

听起来像你不一定需要反向代理,而是负载平衡器。我设置了HAProxy,以便每个webapp进程都计算为一个后端,然后进行循环平衡,以便每个新连接都进入列表中的下一个进程。

Nginx也可以做这些事情,但我不确定它是否带有开箱即用的负载平衡,或者如果这是一个额外的模块。 Nginx的好处是它可以缓存静态资产,如CSS和图像。

0

的Nginx是一个不错的选择

优点:

  • 支持SSL终止
  • 支持load balancing开箱
  • Upstream keepalive连接
  • 有SPDY支持(无服务器虽然推) 。最新版本增加了httpd支持,删除了spdy。

缺点:

  • 你会在你的nginx配置硬编码上游服务器如下。如果您动态更新它们,则无法通过环境变量读取上游服务器设置。

    http { 
        upstream myapp1 { 
         server localhost:10000; 
         server localhost:10001; 
         server localhost:10002; 
        } 
        server { 
         listen 443 ssl spdy; 
    
         location/{ 
          proxy_pass http://myapp1; 
         } 
        } 
    }