Apache 能够代理请求的HTTP服务器

Apache 能够代理请求的HTTP服务器,apache,http,https,proxy,Apache,Http,Https,Proxy,出于性能方面的原因,我不得不重写web基础设施的一部分 为此,我将关键部分写为C++中的Web应用程序。此web应用程序侦听给定端口,一次只接受一个TCP连接,并处理在当前连接上收到的所有HTTP请求 您可以按如下方式启动它以侦听端口8080: ./webapp 8080 虽然它工作得完美无瑕,速度比以前快得多,但它的局限性在于应用程序的一次性连接特性。不能通过一个应用程序实例通过多个连接同时提供HTML页面、Javascript和图像 为了克服这个限制,我想运行一个前端反向代理HTTP服务器

出于性能方面的原因,我不得不重写web基础设施的一部分

为此,我将关键部分写为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
    。就性能而言,这不是一个好问题,但这是我能想到的最接近你最初的问题

  • 您可以使用单线程
    webapp
    ,但是您可以维护一个您所收听的套接字列表,并将它们与它们的“好友套接字”(buddy socket)配对,后者是它们转发流量的对象(请注意,它是双向工作的)。不过,这并不是最佳性能,因为您可能会受到内核调用的限制

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

如果我是你,我会直接转向解决方案3,因为它只是最好的选择。这并不是太麻烦,因为它与单线程方法(仅一对套接字)非常接近,并且不会像所有分支进程那样影响性能

我认为你不会找到一个适合你需要的Web服务器,因为它不是处理这种情况的标准方法,我怀疑是否有人花时间开发它:)

编辑:

好的,我从您的编辑中了解您的问题

不过,对我来说,要解决的问题仍然是一样的:您需要一个向您的流程分派流量的流程。我认为您不会发现这样一个现成的调度器,因此您需要使用我提到的三种技术之一来实现它


仔细想想,您实际上是在尝试实现代理的一面,而另一面是转发到您的
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;
            }
        }
    }
    

我感谢你的努力,但老实说,我甚至认为你没有读过我的问题。使用单一连接服务器的动机是我不想重新发明轮子。我只想重写性能关键部分,将连接池等留给一个更成熟、已经存在的web服务器。我不想为每个TCP连接生成一个新进程。这就是为什么我说我希望在启动时生成进程,并且前端应该配置为在启动时建立到每个web应用程序的永久HTTP连接。本质上,我在寻找一个好的(请参见右侧的图片和示例)。我编辑了这个问题以使其更清楚。我希望有帮助。