我对WSGI路径的理解是否正确


3

我过去的Web应用程序体验仅限于一些Apache + PHP实验。从这个背景开始,我一直在阅读使用Python for REST服务,这是我目前对堆栈的理解。

Python Web应用程序堆栈

这张照片“正确”吗?

  1. TLS发生在我展示的地方吗?
  2. URL重写和重定向发生在哪里?
  3. 我应该/可以在负载平衡层(可能在单独的服务器上)处理静态内容,还是应该在Web服务器层处理静态内容?

我之前发布了一个关于此问题的Too Broad问题。根据我学到的东西,我会问更具体的问题。


关于图片的一些注意事项:

  • 我知道当没有负载均衡层时,TLS会发生在Web服务器层,但是在使用负载均衡层时,在负载均衡器层执行它似乎更自然 - 这是错误的吗?
  • URL重定向和重写似乎遍布整个地方,并在提供静态内容的位置发挥作用。特别是如果你想将一些静态内容重定向到CDN,在这种情况下,这可能是整个堆栈的外部!

Answers:


1

这对超级用户来说不是一个理想的问题。服务器故障可以说是这个问题的更好目标。那说......

对于您的问题,没有任何具体的答案 - 有许多不同的选项可用于完成每个要点。我将主要回答我的建议。

  1. TLS发生在我展示的地方吗?

像负载均衡器这样的专用设备是卸载TLS的地方,是的。通常,您在此处具有专用硬件,专门用于在不使用较慢的通用CPU周期的情况下加速TLS。在这样的设备上集中TLS证书也有助于证书管理 - 或者在Heartbleed或POODLE等安全问题的情况下,提供需要进行任何所需安全更改的单点 - 而不是多个Web服务器。

  • 理想情况下,您将拥有2个或更多负载均衡器,在高可用性配置中配置主动/主动或主动/被动,以实现故障转移和冗余。
  • 在Heartbleed的情况下,由于使用本机SSL / TLS堆栈而不是OpenSSL,市场上至少有一些重要的负载平衡器不容易受到攻击。

如果安全性对您来说至关重要,您可以考虑在新的TLS连接中隧道化负载均衡器和Web服务器之间的流量。或者,不要终止TLS,只将TCP连接转发到一个或多个Web服务器。但是,做任何一项都可以解除我上面提到的任何优点。此外,我希望我假设您的负载均衡器和Web服务器(及其通信)都将包含在不需要加密通信的安全数据中心内。(如果这些设备不安全,则无论如何都会关闭所有投注。)

另见:https//security.stackexchange.com/questions/30403/should-ssl-be-terminated-at-a-load-balancer

  1. URL重写和重定向发生在哪里?

正如你所提到的,CDN将是另一种可能性 - 我将在此忽略。

您可以在负载均衡器中或在Web服务器上执行此操作。我倾向于默认在Web服务器中执行大部分操作 - 尤其是在使用Apache HTTPD时 - 因为您无法超越mod_rewrite提供的功能和灵活性。能够将这些规则保存在与设备无关的文本文件中,这些文件可以在SVN等中进行源控制,这也是一个额外的好处 - 特别是因为规则往往需要经常更改(鉴于其性质)。

我将始终保留您在Web服务器中托管的站点/域内部的任何重写和重定向。在托管站点中的URL需要在其他地方重定向的有限情况下 - 以及性能是一个关键问题 - 我是否会考虑在负载均衡器上执行此工作。

  1. 我应该/可以在负载平衡层(可能在单独的服务器上)处理静态内容,还是应该在Web服务器层处理静态内容?

除了极少数例外,内容由Web服务器提供,而不是负载均衡器。您可以/应该做的是将Web服务器配置为直接提供此类静态内容 - 而不是将其发送到PHP / Python / Tomcat /等,因为服务可能较慢。如果可能,使用并配置CDN以使所有这些在边缘网络处卸载,甚至无法到达负载均衡器。

这里可能有点棘手的一个方面是身份验证,授权和日志记录。在您卸载此类“静态”内容的任何时候,您的下层甚至可能永远不会意识到正在提供此类内容 - 无法保护它,甚至无法跟踪其访问。这里的一种可能性(如果这是一个问题)是使用“集中式身份验证”模型 - 其中上层可以缓存内容,但仍然会将请求发送回较低层/来源,并使用“If-Modified-”自从“头。然后,原点可以检查会话ID / cookie /等 - 并且有机会响应“HTTP 403 Forbidden”或“HTTP 304 Not Modified”(从缓存返回)。


关于你关于CDN的答案部分,你能不能请澄清术语“上层”/“下层”(换句话说,从什么角度来看,以及术语“起源”
约翰时间2009年

@Johan - “上层”更接近最终用户,“下层”是任何“更内部”/到图表的右下角。CDN通常作为“边缘”网络运行(系统的一部分,但最接近最终用户)。“边缘”网络需要作为“原点”与系统的其余部分进行通信。(与整个过程中使用的术语相同(例如,en.wikipedia.org
wiki / Content_delivery_network
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.