apache - 能够代理请求的 HTTP 服务器

标签 apache http https proxy

出于性能原因,我不得不重写我们网络基础设施的一部分。

为此,我用 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 连接,然后将传入的 HTTP 请求转发到正在运行的网络应用程序之一,均匀分布。

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

我的问题是:哪些 HTTP 反向代理能够在我的场景中充当前端?如果您知道不止一种,那么每种的优缺点是什么?

最佳答案

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

如果您通过 TCP 连接生成一个进程,您最终将获得糟糕的性能。实际上,您在这里寻找的是多线程服务器而不是多进程基础设施(拥有不同进程有什么意义?)

不过,您可以走几条路:

  • 如果您真的想拥有单独的进程,则每次收到请求时都会 fork 您的 webapp。这在性能方面不会很好,但它是我能想到的最接近你最初提出的问题。

  • 您继续使用单线程 webapp,但您维护一个您监听的套接字列表,并将它们与它们的“好友套接字”配对,它们将流量转发到这些套接字(注意它是双向的)。尽管如此,这并不是最佳性能明智的选择,因为您可能会受到内核调用的限制。

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

如果我是你,我会直接转向解决方案 3,因为它是最佳选择。这并没有太大的麻烦,因为它与您的单线程方法(只是一对套接字)保持接近,并且它没有到处 fork 进程的性能影响。

我认为您不会找到满足您需求的网络服务器,因为它不是处理此类情况的标准方法,而且我怀疑是否有人花时间开发它:)

编辑:

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

不过,对我来说,要解决的问题仍然是相同的:您需要一个将流量分派(dispatch)给您的进程的进程。我不认为您会发现这样一个开箱即用的调度程序,因此您需要使用我提到的三种技术之一来实现它。

如果您考虑一下,您实际上是在尝试实现代理的一侧,而另一侧是转发到您的 webapp。所以你应该使用代理技术恕我直言。

关于apache - 能够代理请求的 HTTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725624/

相关文章:

http - Angular + Web Api 上的 Windows 身份验证

java - Java平台库支持https吗

html - 关于 apache 或 weblogic 面试问题的图像

lighttpd 上的 apache .htaccess 文件

java - 从套接字读取 http post 内容时出现问题,仅获取 header

javascript - 通过 https nginx 网站 http 到 Node 服务器

http - Google Calendar V3 REST API 中的批量请求

php - 在 .htaccess 文件中操作 PHP 响应的 header ?

php - 需要增加特定目录而不是整个服务器的PHP内存限制

ios - 客户端中的 Flutter HTTPS 握手错误(操作系统错误 : CERTIFICATE_VERIFY_FAILED: ok(handshake. cc:363))