Nginx

為什麼用Varnish記憶體靜態文件,為什麼不通過

  • October 14, 2015

我有一個執行 nginx / php-fpm / varnish / wordpress 和 amazon s3 的系統。

現在我在設置系統時查看了很多配置文件,在所有這些文件中我發現了這樣的內容:

   /* If the request is for pictures, javascript, css, etc */
   if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
       /* Remove the cookie and make the request static */
       unset req.http.cookie;
       return (lookup);
   }

我不明白為什麼要這樣做。大多數範例也將 NginX 作為網路伺服器執行。現在的問題是,為什麼要使用清漆記憶體來記憶體這些靜態文件。

對我來說,只記憶體動態文件更有意義,這樣 php-fpm / mysql 就不會受到那麼大的打擊。

我是正確的還是我在這裡遺漏了什麼?

更新

我想根據給出的答案向問題添加一些資訊。

如果您有一個動態網站,其中內容實際上發生了很大變化,那麼搜尋是沒有意義的。但是,例如,如果您將 WordPress 用於靜態網站,則可以將其記憶體很長時間。

也就是說,對我來說更重要的是靜態內容。我在不同的記憶體應用程序和網路伺服器應用程序上找到了一些測試和基準測試的連結。

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX 在獲取靜態內容方面實際上更快,所以讓它通過更有意義。NginX 非常適用於靜態文件。

除此之外,大多數時候靜態內容甚至不在網路伺服器本身中。大多數情況下,這些內容儲存在某個 CDN 上,可能是 AWS S3 之類的東西。我認為清漆記憶體是您希望儲存靜態內容的最後一個地方。

Varnish 有幾個優點。您注意到的第一個是減少後端伺服器的負載。通常通過記憶體動態生成但很少更改的內容(與訪問頻率相比)。以您的 Wordpress 為例,大多數頁面可能不會經常更改,並且存在一些外掛以在頁面更改時使清漆記憶體無效(即新文章、編輯、評論等)。因此,您無限期地記憶體,並在更改時無效 - 這導致後端伺服器的負載最小。

儘管有連結的文章,但大多數人會建議,如果設置正確,Varnish 的性能比 Nginx 更好——儘管,(我真的不想承認)——我自己的測試似乎同意 nginx 可以比 varnish 更快地提供靜態文件(幸運的是,我不為此目的使用清漆)。我認為問題在於,如果您最終使用 Varnish,那麼您在設置中添加了一個額外的層。通過那個額外的層到後端伺服器總是比直接從後端提供服務要慢 - 這就是為什麼允許 Varnish 記憶體可能會更快 - 你節省了一步。另一個優勢是在磁碟 io 方面。如果您設置 varnish 以使用 malloc,則根本不會碰到磁碟,這使其可用於其他程序(並且通常會加快速度)。

我認為需要一個更好的基準來真正衡量性能。重複請求相同的單個文件會觸發文件系統記憶體,從而開始將焦點從 Web 伺服器本身轉移。更好的基準測試將使用 siege 和數千個隨機靜態文件(甚至可能來自您的伺服器日誌)來模擬真實流量。可以說,正如您所提到的,將靜態內容解除安裝到 CDN 已變得越來越普遍,這意味著 Varnish 可能不會從一開始就提供它(您提到 S3)。

在現實世界的場景中,您可能會優先考慮您的記憶體使用 - 首先是動態內容,因為它的生成成本最高;然後是小的靜態內容(例如 js/css),最後是圖像——你可能不會在記憶體中記憶體其他媒體,除非你有充分的理由這樣做。在這種情況下,使用 Varnish 從記憶體載入文件,而 nginx 從磁碟載入文件,Varnish 的性能可能會優於 nginx(請注意,nginx 的記憶體僅用於代理和 fastCGI,並且預設情況下是基於磁碟的 - 儘管它是可以將 nginx 與 memcached 一起使用)。

(我的快速 - 非常粗略,沒有任何可信度 - 測試表明 nginx(直接)是最快的 - 我們稱之為 100%,varnish(使用 malloc)有點慢(大約 150%),並且 nginx 落後於 varnish(通過)是最慢的(大約 250%)。這說明了一切 - 全部或全部 - 增加與後端通信的額外時間(和處理),只是表明如果您使用 Varnish,並且有空閒的 RAM ,您不妨記憶體所有可以記憶體的內容並從 Varnish 中提供,而不是傳回 nginx。)

引用自:https://serverfault.com/questions/342576