使用Varnish來讓你的網站「起飛」

想要更好的閱讀體驗,以及更多幹貨,請直接移步個人站點進行閱讀:

www.pilishen.com/posts/speed…css

假設你用PHP和nginx搭建了本身的一個博客,這很棒。從服務器角度,每當有人訪問了你的文章頁面時,你的網站就會作一系列的、重複的任務,好比說獲取一個幾乎不怎麼變化的文章內容。html

假設訪客A訪問了這個文章頁面,文章內容從數據庫裏獲取了,包括圖片、css、js等,都要從服務器加以獲取。當訪客B, C, D等訪問了這一樣一個沒有作過內容改動的文章,一樣的內容就會被服務器重複地獲取,每次都要訪問數據庫,都要去找圖片、css、js那些。linux

如今假設一天裏那個頁面有1,000,000 訪問者,那麼你的服務器就得處理1,000,000次訪問,去供應那麼多的資源,處理那麼多的數據庫查詢,最終你的站點就會愈來愈慢,甚至中止響應,當服務器用光了工做進程或者鏈接的時候。nginx

要避免這種狀況,你就須要用上Varnish了。laravel

準備工做

在進行下面的測試以前,你須要先有個linux系統,固然能夠是本地的虛擬機,好比咱們的vagrant homestead,也能夠是線上服務器,固然若是是生產服務器,就須要提醒你特別當心咯。這裏的測試用的是ubuntu,其它linux版本的細小差別在此不作贅述。web

其次呢,你的這個服務器上最好有個nginx站點能夠用來測試,固然了,用任何一個你的本地開發站點來測試就行了。數據庫

在繼續進行以前,你能夠用http-header-checker工具來查看一下你的站點,能夠獲得相似信息:ubuntu

file

固然了,你也能夠用任何喜歡的工具來查看header,這裏咱們varnish尚未運行,因此就看不到一個 「X-Varnish」的header,這個header暗示着當前網站是跑在varnish後面的。後端

安裝Varnish

再簡單不過了緩存

sudo apt-get install -y varnish
複製代碼

就行了,安裝完之後,能夠在下面兩個目錄裏找到相應配置文件:

  1. /etc/default/varnish
  2. /etc/varnish/default.vcl

配置Varnish來監聽80端口

默認呢,varnish監聽的是6081端口,但咱們的網站通常是在80端口,因此咱們得改一下。

固然了,改以前,你能夠用你的網站ip訪問一下6081 端口,能夠看到相似的varnish報錯頁面:

file

首先呢,咱們改一下nginx的站點配置,讓它再也不使用80端口,以免端口衝突。這裏個人測試站點配置文件在/etc/nginx/sites-available/default裏,你能夠相應更改你本身的nginx配置:

server {
        listen 8080 default_server;
        listen [::]:8080 default_server;

        # Leave the other configuration items intact...
    }
複製代碼

咱們讓nginx站點默認監聽8080端口,如今記得從新加載一下nginx好讓配置生效:sudo service nginx reload,而後你再用ip或站點域名去訪問8080端口,應該還能看見以前的測試站點頁面。

接下來該更改varnish配置了,找到這個文件:/etc/default/varnish

## Alternative 2, Configuration with VCL
    #
    # Listen on port 6081, administration on localhost:6082, and forward to
    # one content server selected by the vcl file, based on the request.
    #
    DAEMON_OPTS="-a :6081 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -s malloc,256m"
複製代碼

將其中的-a :6081 更改爲 -a :80,這樣呢就將varnish的前臺監聽端口設置到80端口了。

接下來呢,還要讓varnish的後臺去監聽一下咱們的站點,畢竟它要替咱們從nginx站點裏拉取內容,加以緩存,而後返回給前臺。這個時候找到/etc/varnish/default.vcl這個配置文件

# Default backend definition. Set this to point to your content server.
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
    }
複製代碼

能夠看到默認的varnish後端,監聽的就是咱們的本地主機,並且端口就是8080,也即它可以從咱們8080的nginx站點拉取內容。因此這裏咱們不須要更改什麼,確認一下就行了。

添加varnish到系統服務中

接下來咱們須要將varnish.service這個文件添加到系統服務中,這樣咱們能夠用systemd 相關命令來在80端口開啓varnish服務

$ sudo cp /lib/systemd/system/varnish.service /etc/systemd/system/
$ sudo nano /etc/systemd/system/varnish.service
複製代碼

上面,咱們將varnish.service服務文件拷貝到了系統服務目錄下,而後第二個命令是打開這個服務文件,默認是這樣的:

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
複製代碼

一樣的,將裏面-F -a :6081改爲-F -a :80,裏面的localhost:6082不用動,保存退出,而後執行下面的一系列命令,來從新加載一下系統服務,重啓varnish和nginx:

$ sudo systemctl daemon-reload
$ sudo systemctl reload varnish.service
$ sudo service varnish restart
$ sudo service nginx restart
複製代碼

測試一下header,確保varnish正常運行

{id="performance"}

這個時候再訪問咱們的站點,檢查header部分,應該能看到相似結果:

file

能夠看到多了幾個header:X-VarnishAgeVia,這些是varnish引入進來的,說明咱們的varnish在運行了。

這個時候你再訪問你的站點,你會發現,第一次訪問事後,接下來的頁面訪問都會極其極其地快。固然這也取決於你的站點設置,若是你某個頁面明確設置了不能緩存的Cache-Control header,那麼默認varnish就不給你緩存這個頁面,固然這些後期均可以具體更改調試。

那麼正常狀況下,你在開發者工具欄裏會看到以下的性能表現:

file

能夠看到傳輸數據很小,後面的資源直接從cache中加載,不須要請求時間了。

結論和進階

{id="concolusion"}

Varnish是一個很偉大的開源緩存軟件,使用恰當的話可讓你的網站極其、極其地快。固然了,緩存層永遠是一把雙刃劍,若是你使用不恰當,也會搞亂不少東西,讓你茫然不知所措。Varnish呢既然是個強大的緩存代理軟件,它確定也就不僅僅咱們上面展現的那麼簡單,是,你能夠上面那樣默認安裝配置,就已經能給你帶來很多性能提高,可是你要是想真正掌握好它,想真正發揮它的強大之處,那這些確定是遠遠不夠的,這裏呢咱們只是讓你們初步體驗,感覺一下,便於進一步進階。

想深刻了解varnish的原理和機制,用最短的時間成爲varnish高手,讓你的生產環境的站點儘快體驗上varnish,這裏進一步推薦的資源就是咱們的《【laravel國際會議】使用Varnish來構建應用「緩存層」和負載均衡》,這個是在laravel的國際會議laracon上,咱們的主講嘉賓Mattias分享了varnish相關的方方面面,讓本來複雜恐怖的varnish緩存層,一會兒變得簡單和可操做起來。

  • 好比說你想學習如何清空varnish中的緩存,當你某個內容更新了之後;
  • 或者說你想更改varnish緩存的時間,或者想讓你的網站即便掛掉了,用戶依然無感知,依然能看到varnish緩存裏的版本,這樣你就有足夠的時間去停機維護什麼的;
  • 或者說你想單純看看你的緩存命中率怎麼樣,是否大部分頁面都重複用起了緩存;
  • 或者你某個頁面,雖而後端的應用程序好比laravel,設置了說不要緩存,但你如何在varnish裏仍是緩存它呢?
  • 再或者,如何把一個頁面,好比你的站點首頁,分紅不少個部分來緩存呢,好比你的頁面導航欄,並不怎麼常常改變,如何單獨緩存這塊呢?也即一個html頁面,varnish均可以幫你拆分紅不一樣部分來緩存,很神奇,不是嗎?

固然了,更多的,請自行學習這個專場吧,別擔憂,雖然是英文大佬,可是咱們都給你靜心翻譯,帶上中文字幕了。

file

《【laravel國際會議】使用Varnish來構建應用「緩存層」和負載均衡》

末了,歡迎到個人站點https://www.pilishen.com/來作客哦,也歡迎加入咱們的公開羣【公開課@pilishen.com】:109256050,等你哦~

相關文章
相關標籤/搜索