題 我對WSGI路徑的理解是否正確


我過去的Web應用程序體驗僅限於一些Apache + PHP實驗。從這個背景開始,我一直在閱讀使用Python進行REST服務,這是我目前對堆棧的理解。

The Python Web Application Stack

這張照片“正確”嗎?

  1. TLS發生在我展示的地方嗎?
  2. URL重寫和重定向發生在哪裡?
  3. 我應該/可以在負載平衡層(可能在單獨的服務器上)處理靜態內容,還是應該在Web服務器層處理靜態內容?

我以前發過帖 一個太廣泛的問題 對這個。根據我學到的東西,我會問更具體的問題。


關於圖片的一些注意事項:

  • 我知道當沒有負載均衡層時,TLS就會發生在Web服務器層,但是在使用負載平衡器層時在負載均衡器層執行它似乎更自然 - 這是錯誤的嗎?
  • URL重定向和重寫似乎遍布整個地方,並在提供靜態內容的位置發揮作用。特別是如果你想將一些靜態內容重定向到CDN,在這種情況下,這可能是整個堆棧的外部!

3
2017-10-16 08:59


起源




答案:


這對超級用戶來說不是一個理想的問題。對於這個問題,Server Fault可能是一個更好的目標。那說......

您的問題沒有任何具體的答案 - 有許多不同的選項可用於完成每個要點。我將主要回答我的建議。

  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”(從緩存返回)回复。


1
2017-10-27 03:03



關於你關於CDN的答案部分,你能不能請澄清術語“上層”/“下層”(換句話說,從什麼角度來看,以及術語“起源” - Johan
@Johan - “上層”更接近最終用戶,“下層”是任何“更內部”/到圖表的右下角。 CDN通常作為“邊緣”網絡運行(系統的一部分,但最接近最終用戶)。 “邊緣”網絡需要作為“原點”與系統的其餘部分進行通信。 (與整個過程中使用的術語相同(en.wikipedia.org/wiki/Content_delivery_network, 例如。) - ziesemer