萬一你的網站被DDOS颶風式攻擊,你會怎么辦?筆者以經驗告訴你,這里的每一層都起著保護網站的作用。如果您寧愿擁有如何在單臺服務器上維持大量流量的版本,則可以:
專用硬件服務器,無共享主機
千兆上行鏈路處理突發流量
用大量RAM清漆緩存
插件輕WordPress安裝
通過WordPress/Jetpack的離線統計
Cloudflare作為CDN
現在,讓我們來看看細節。
托管和軟件
從硬件開始,WEB最好存在于專用物理服務器上,而不是虛擬專用服務器(VPS)。這不是共享主機設置,它不是基于云的。該服務器配備四核至強E3-1230CPU,16GB內存和鏡像R1固態硬盤。它通常運行在100Mbps的上行鏈路上,但是一旦風暴流量可能發生變化,我們就會搶先將其升級到1Gbps上行鏈路。額外的容量對于處理Eric和他的工作人員的新帖子的巨大爆發量非常重要。
該機器運行UbuntuServer16.04LTS,并且是“非托管”的,即沒有安裝cPanel或其他“簡單模式”管理工具。這可以最大限度地減少服務器的攻擊面,并有助于節省資源。為了運行我的托管站點,已安裝的軟件保持在必要的最小應用程序集內。
服務器堆棧的兩大目標是讓所有托管站點使用HTTPS,并讓所有托管站點利用緩存;這提出了一些雞與雞的問題,因為緩存加密流量比緩存未加密流量復雜得多。原因是加密的流量是完全被加密的。同一頁面的兩個加密副本看起來像不同的隨機噪聲塊。這對高速緩存提出了挑戰,它依賴于存儲一個副本并反復提供。
對付它的辦法是做加密以上的高速緩存層。這樣,Web服務器仍然可以緩存內容并通過HTTPS加密。就緩存而言,該網站只是運行普通的HTTP。
實際上,我通過使用HAProxy終止所有站點的SSL/TLS連接來實現此目的,這是一個七層感知負載平衡器應用程序。HAProxy監視TCP端口443上的傳入HTTPS連接,讀取SNI信息,為請求的站點提供適當的SSL/TLS證書,并執行SSL/TLS握手,然后將連接沿著堆棧傳遞給Varnish,緩存應用程序。另外,HAProxy還會偵聽TCP端口80上的傳入HTTP連接,并將其重定向到端口443,從而將所有流量強制轉換為HTTPS。
HAProxy下面是秘密武器:清漆。Varnish是一種反向代理和緩存應用程序,旨在直接從RAM中提供靜態資產,這比直接向文件系統層提供服務要快得多(盡管這里有一個全面的討論兔子洞,當你在Linux的頁面緩存機制中混合使用時,文件真的存在)。以下是緩存如何工作的簡短版本,以及它為什么幫助SpaceCityWeather。當WordPress提供頁面時,通常該頁面是由WordPress應用程序動態生成的。通常,每次從WordPress請求頁面時(無論是博客的首頁還是帖子的頁面或類別頁面或任何其他頁面),該頁面將從各種元素中以編程方式從頭開始組裝,并且為每位訪客提供熱和新鮮的服務。想想WordPress就像一個面包師,忙著在廚房做牛角面包。每一位參觀者都會得到自己特別為他們制作的溫暖,酥脆的羊角面包。
這意味著當你的WordPress網站有很多流量時,面包師會變得非常忙碌。一條線形成。人們不得不等待他們的羊角面包。誰喜歡等羊角面包?有時你現在需要一個牛角面包。添加像Varnish這樣的緩存應用程序意味著面包師只需制作一個牛角面包。那個牛角面包還需要一些時間才能制作,但一旦制成,面包師就可以將它放入一個神奇的羊角面包復制盒。按下按鈕后,盒子立即(并非瞬間,但非常,非常快)彈出一個新月形面包的副本。只要人們只需要那種牛角面包,面包師就可以按下按鈕,遞出牛角面包,然后繼續幫助下一位顧客。
當然,魔術盒不能制作不同的羊角面包。面包師仍然必須這樣做。但貝克只需要花費的時間,使一個東西,然后魔術盒(幾乎)可以立即發送給任何人誰想要它的那個副本,讓自由地做其他的東西面包師。對于太空城天氣,Varnish處理了絕大多數流向服務器的流量,因為大多數人想要查看網站的首頁或最新的更新帖子。因為從緩存中提供服務的對象比從頭開始服務要快得多(從服務器負載的角度來看,緩存中服務的內容幾乎是“免費的”),因此Varnish是允許SpaceCityWeather擴展到多于一個的關鍵組件之一通常的日常負載的100倍,而不會被要求服務的請求數量所淹沒。
當然,Varnish并不是鎮上唯一的緩存游戲,甚至沒有關閉。Nginx本身有一個很好的緩存機制。關于Nginx或Varnish是否是任何給定站點的更適合的緩存層,都有一個單獨的辯論-兩者都是高性能的,但是在功能和配置方面存在差異。我更喜歡(至少現在)堅持使用光油,以利用具有清晰定義的圖層的堆棧,這可以使故障排除問題更容易,因為問題通常是分區的。另外,經過多年使用光油后,我很合理地習慣了它的怪癖和古怪。
提示你的服務器
但是如果你沒有任何東西需要服務,世界上所有的緩存都無法幫到你,所以一個強大的Web服務器應用程序是必需的。SpaceCityWeather以及服務器上的所有其他站點都由Nginx提供支持,Nginx是一款高性能,事件驅動的Web服務器應用程序,我已經為此編寫了廣泛的應用程序。
Nginx是當前使用的三種最流行的Web服務器應用程序之一,以及Apache和Microsoft的IIS。它快速而廣泛的使用,這意味著它適用于很多目的,關于它配置的每個方面的Nginx專用教程都遍布在Web上。作為實際的“服務器”應用程序,Nginx提供了WordPress應用程序和其他堆棧之間的鏈接;它還提供WordPress的“靜態資產”(像圖像和其他文件不經常更改的東西),而不必打擾WordPress。
WordPress是一個應用程序,這意味著它必須在某些方面運行。更準確地說,WordPress的PHP文件需要運行在Web服務器上的PHP解釋器或進程管理器來解析和執行它們包含的代碼。對于這項任務,我們使用PHP-FPM,并進行了一些性能調整(主要是RAM和工作人員數量)以及PHP7。PHP7通常比仍然常見的PHP5快得多,并且當您每秒提供幾十或幾百頁時,速度就很重要。我對PHP做了一些調整,盡管它對空間城市天氣無關緊要-確保PHP會話存儲在memcached而不是磁盤上。在擁有大量登錄用戶的系統上,這可以緩解一些IO瓶頸。
WordPress本身
由于WordPress作為博客平臺的普及程度非常高,因此對于如何調整WordPress性能的建議無處不在。如果您正在運行一個高度定制的WordPress網站,您可能需要調整深度以適應雜草,以確保其在負載下的高性能。幸運的是,除了應用主題外,Eric并沒有選擇在SpaceCityWeather上做太多的定制。這種配置選擇使得調整起來相對簡單。
如果您搜索“WordPress性能”,您可能會看到的第一件事是建議安裝WPSuperCache或W3TotalCache等一些流行的WordPress插件之一。這些插件確實有幫助(尤其是W3TotalCache,它與Varnish和其他緩存應用程序很好地協作),并且使用它們是一種選擇;不過,我選擇避開它們的使用,而是將清漆緩存作為我單一的主要緩存解決方案。再一次,這是因為我更喜歡把我的堆棧中的圖層分開清晰-每個地方都有一個地方,一切都在它的位置。