1. 程式人生 > >網站效能優化

網站效能優化

在網際網路日益發展的今天,我們的程式越來越模組化,系統架構越來越完善,功能越來越強大。那麼隨之而來的訪問量也是越來越大。
比如在勇哥我的經歷中,一個發放微信紅包的活動,訪問量大的讓伺服器宕機。 導致網站的服務性極差。
所以我們要解決這個問題。

1、修改web服務軟體的配置,購買更高配置及效能的伺服器(伺服器)
我以nginx+php 為例,因為我使用的比較習慣的是這些服務軟體。當然,根據思路,其它的服務軟體也能調整出來。
例如,我的伺服器配置是4核4G的伺服器。
那麼我的nginx配置檔案中 worker_processes 該屬性的配置就應該是

worker_processes 4;

4核對應4個工作程序。
這裡我只講主要的配置 詳細的nginx 配置看下我的這篇博文。
nginx配置詳解
然後算一下,你伺服器的網速是否足夠,別機器的運算速度足夠,而網速不夠,那就有點尷尬了哦。這個是要根據的業務來的,比如使用者請求某個地址後,他需要下載的html檔案大小是多大,解析後如果解析的檔案地址需要在主服上下載。那麼需要下載的檔案是多大。

keepalive_timeout 60

這個屬性的內容是維護長連線的時間,當用戶開啟一個網址後,伺服器處理完成後,不會立即釋放這個連線,而是等待該屬性設定的時間(單位s) 的時間內如果使用者沒有與伺服器進行任何的互動(開啟網頁,進行ajax請求,檔案下載等等等),就釋放這個連線(好處是使用者不用每次訪問都與伺服器握手建立連線,在有效時間內訪問會複用以前建立的連線,缺點是在大迸發中,如果瞬時迸發過高,伺服器需要的維護的連線過多,佔用系統資源。所以這個屬性的值要仔細斟酌,根據你的情況取一個合理的值)

2、檔案離出主服,另放一臺伺服器。(檔案儲存服務)
為什麼要這麼做?
當用戶請求一個網址,目標伺服器生成該網址的html供瀏覽器下載並解析和渲染該html檔案裡面的內容。而在解析到該js 檔案,css 檔案,圖片等檔案時會對該文指定的下載地址下載,一般大家都是將這些檔案儲存在主服上,其實,除開圖片以外其它檔案最好不要放在主服上,如果你的前端解析程式不涉及跨域,那麼js和css我也建議你不要放在主服。因為,html解析到這些檔案後如果你的檔案是放在主服的,那麼瀏覽器又會去目標伺服器下載該檔案,這樣佔用了伺服器的頻寬和需要維護這個下載連線的執行緒資源。 所以,我建議將檔案離出去,放在其它的伺服器上。(像市面上比較牛的檔案儲存服務商七牛,阿里雲OSS等都是價格實惠的,推薦你去看哈。如果你只是在一段時間會有大迸發,那麼我推薦你使用按量付費。這些檔案儲存服務都給你提供了三方開發包,讓你可以本地檔案通過三方介面將檔案上傳至你程式設定指定的位置,如果是OSS服務,且你對網站的檔案下載有更高的要求,那麼看下我的這篇博文

OSS cdn 服務)這樣瀏覽器解析到js、css、圖片檔案就不會去主服上下載 而是在我們預定好的檔案儲存伺服器上下載。所以在大迸發訪問下,檔案離出去的好處就是所有的瀏覽器針對css、js、圖片等檔案不會再去主服上下載消耗主服緊張的系統資源,且下載這些靜態檔案的時候也會消耗機器的I/O資源。I/O資源我在下面有解釋。

3、將資料庫(如mysql)從主服離出去。(資料儲存服務)
先講解個名詞什麼是I/O。
I/O 就是機器對儲存在硬碟讀寫能力。 如我們常在市面上看到的,這個硬碟是5400轉速的,那個硬碟是8000+多的轉速的。都知道硬碟就是儲存資料的嘛,那麼轉速就是對這些資料查詢能力的一個解釋。轉速越大就說明機器的讀寫能力越強。當然一臺機器的讀寫能力也是有極限的。後面我會解釋。
為什麼要將資料庫從主伺服器上遷移出去?
大家可以上網查查資料,其實資料庫在進行資料存取的時候是在耗費機器的I/O的,而我們在大迸發訪問下web服務軟體(apache、nginx、tomcat等)由於需要給瀏覽器響應html檔案,所以也會佔用一部分機器的I/O資源。web服務軟體在佔用I/O,資料庫服務也在佔用I/O。一般來說,資料庫消耗的I/O比web服務軟體消耗的I/O要大。且如果你的業務邏輯不能資料庫的資料快取的話那就更惱火了,資料庫的消耗的I/O還會更大。 這時候我想就明白問題的所在了。在高迸發下。機器是否能支撐住這麼高的I/O , 那就是個問題了喲。
所以,我建議如果你的網站訪問量大,那麼就將資料庫移出主服,單獨存放在一臺伺服器上,或者是購買專業的資料庫服務(如阿里雲的RDS 我用了許久價格也很便宜,別說我打廣告,我不是阿里雲官方的人,我只是給大家推薦一下我的使用心得:RDS牛逼的隨時升級配置,增強處理效能。且能動態開啟讀寫分離,資料庫伺服器叢集。容災例項的支援。)。給主服減減壓力。

4、負載均衡。
可能大家也在網路上搜集過相關的負載均衡知識。只是感覺負載均衡好高大上,好難呀。小白看不懂啊! 其實不然,你知道清楚了原理就知道該怎麼幹了。
我個人將負載均衡 分為一級負載均衡 和 二級負載均衡 和 三級負載。

一級負載均衡
在說這個之前,請大家熟悉一下windows 中的cmd 命令服務 的 ping 命令。ping 可以解析出目標域名地址的ip地址
我是手寫的示例。大家也可以在自己的電腦上測試。

ping www.baidu.com
寫好後按下回車

響應內容如下
來自 61.135.169.125 的回覆: 位元組=32 時間=38ms ttl=53

它解析的其它內容我們不管,我們只看它解析出來的ip地址61.135.169.125。這是我電腦上解析出來的ip地址。
我在重慶,那麼同樣一個網址在其它地方解析出來的ip是多少呢?
我這裡以我的家鄉,萬州地區為例。

ping www.baidu.com
寫好後按下回車

響應內容如下
來自 61.135.169.110 的回覆: 位元組=32 時間=38ms ttl=53

解析出來的ip地址不同了。

重慶 : 61.135.169.125
萬州 : 61.135.169.110

怎麼會這樣呢。這是在DNS域名解析層級上做了手腳了。
比如
讓第一個使用者解析到了伺服器A,由伺服器A(以後就叫A)為該使用者提供服務。
讓第二個使用者解析到了伺服器B,由伺服器B(以後就叫B)為該使用者提供服務。

那麼,你可能又會懷疑。既然是不同的伺服器,那麼怎麼讓他們都實現相同的功能的。
讓A,B兩臺伺服器上的業務程式碼一模一樣不就行了。實現相同的邏輯處理。相同的功能。

兩臺伺服器的資料是同步的嗎?不能是我在A這邊進行了一些操作,到B的時候沒有了吧。
這個問題很好解決。
第一,你的資料不要採用檔案的形式儲存,所有的資料都存放到第三方的資料庫(就是篇幅-3 資料庫離出去那個)。
第二,兩臺伺服器用一個數據庫不就行了。這個問題就解決了呀。

那麼,你可能又會懷疑。session 怎麼辦呢?比如我第一次開啟網址解析到了A,A儲存了我的session,第二次開啟網址解析到了B,可B沒有儲存的嘛。
找到問題就得解決問題。
這種問題的處理方式我只會php和java兩種,如果你是學其它語言開發的也可以看下思路,思路相同的。

php 將session 儲存進資料庫
如果你是用php 開發的後臺。可以將session資料儲存到資料庫,每次session都是從資料庫中讀取出來的,而不是從本地讀取。這樣不管你解析到了那臺伺服器,都能將你的session讀取出來的。而且你放心,哪怕是解析到了不同的伺服器,只要域名相同,瀏覽器始終會將對該域名的cookie帶起來的。php session儲存進資料庫,這方面的知識,網上有很多,我這裡就不教怎麼做了。度媽一搜,一堆一堆的原始碼給你。

java 將session 儲存進memcahed 服務
如果你是用java 開發的後臺。那麼就將session 儲存進 memcached ,每次讀取的時候從memcached 中去讀取該資料資訊。和前面的php 將session 儲存進資料庫有點類似哈,只是一個是資料庫,一個是memcached。

還有個問題,既然這樣的話,那麼我上傳的檔案,是從A這邊上傳的,怎麼解析到B後也能訪問到這個圖片呢?
如果你開啟除錯模式,你會發現,你圖片的地址根本就不是www.baidu.com這個了,而是https://xxxx.baidu.com 這種地址了。怎麼回事? 那是因為你上傳的檔案已經上傳到了baidu自己的檔案伺服器叢集上了。 你訪問的其實就是這個檔案伺服器的叢集。

看了上面的講解,我想你也應該有個瞭解了吧。知道是怎麼做的了吧。當然百度的負載均衡,肯定不會這麼簡單的。

那麼,我們怎麼去做上面的一級負載呢。

步驟1、將資料庫離出主服,檔案也離出去至OSS、七牛等這些服務,上傳的檔案也反轉上傳至OSS、七牛等這些服務(上傳成功後接口包會返回該檔案的http訪問地址的)。

步驟2、給主服做映象處理生成n+1<=9個映象(也就是將主服上的程式全部拷貝下來,把這些程式上傳至新的伺服器。注意,一定要儘量保證這些伺服器上的執行環境與主服相致,不要出現相容問題,某則會出現某些稀奇古怪的錯誤。),為什麼最多隻要9臺伺服器,因為域名提供商,最多給我們同一個域名下的解析10個解析記錄,9+1=10嘛。 這些做完後,我們就將這些新伺服器的IP地址新增至域名解析。如下
以www.qwe.com 為例
域名解析 記錄 A …. www.qwe.com 192.168.0.1
域名解析 記錄 A …. www.qwe.com 192.168.0.2
域名解析 記錄 A …. www.qwe.com 192.168.0.3
域名解析 記錄 A …. www.qwe.com 192.168.0.4
.
.
.
我是手寫,知道大概的意思就行了。這些解析弄好了後,我們就開啟域名提供商提供的平臺並開啟負載均衡服務(一般都是有的,如果沒有你就仔細找哈)。開啟後,你會看到針對www.qwe.com這個域名下所有的ip地址後面緊接著了一個 權重 選項。這個選項很重要。我解釋下。

www.qwe.com 192.168.0.1 權重 : 2
www.qwe.com 192.168.0.2 權重 : 1
www.qwe.com 192.168.0.3 權重 : 3

這垃圾平臺 上傳不起本地圖片,氣的死人。手寫的,理解下。

使用者A 開啟該網站 解析到 192.168.0.1
使用者B 開啟該網站 解析到 192.168.0.1
使用者C 開啟該網站 解析到 192.168.0.2
使用者D 開啟該網站 解析到 192.168.0.3
使用者E 開啟該網站 解析到 192.168.0.3
使用者F 開啟該網站 解析到 192.168.0.3

這就是權重的意思。 輪詢解析。
根據你自己的情況,設定解析的權重吧。如果所有伺服器的配置一樣那麼權重就分配一樣的,如果所有伺服器的配置有高有低,高的權重分配高點,低的權重分配少點。

步驟3、所有伺服器的資料庫配置,讓它們都指向同一臺數據庫,或者是資料庫叢集。

步驟4、可以等待測試了。

二級負載
前面講了一級負載。那麼二級負載是在一級負載的基礎上繼續調整的。
比如說 一級負載最多支援的10臺伺服器已經不能滿足我們的要求了,要繼續增加伺服器,怎麼辦呢?域名提供商針對一個域名最多讓我們新增10條解析記錄。
用反向代理。
關於反向代理的解釋。大家可以找度媽。他解釋的肯定比我專業。
我說下怎麼用
1、我們在域名解析下的10條解析記錄的IP全部換成反向代理伺服器的IP地址。
2、我們在反向代理伺服器中新增我們實際的業務伺服器IP地址。當然也得根據配置來嘛,如果反向代理伺服器的配置高,那麼我們就給這臺反向代理伺服器多新增幾條業務伺服器的IP地址嘛,能者多勞。反之亦然。

然後我們就可以測試了,通過域名解析我們的請求被解析到了反向代理伺服器,反向代理伺服器收到請求後又將請求轉發給業務伺服器,業務伺服器處理完成後,將處理結果返回給反向代理伺服器,反向代理伺服器再將結果返回給客戶端
這裡寫圖片描述
這是網上找的結構圖,其中檔案伺服器,也是可以做反向代理的。這裡我主要看web伺服器和反向代理伺服器。

三級負載
需要這個級別的負載就是你的客戶是個神經病了。這個級別就是將你的請求分發到離你最近的那臺伺服器。如果你們客戶有錢,在全國各個省份,都有他們的伺服器叢集。 牛逼。 這個級別不用你主動去調整,dns 解析自動的就幫我們辦好了。dns 解析本來就是主動解析到離你最近的那臺服務解析。查了下資料,這個叫做智慧解析。

看了前面的內容,我想你也有個瞭解了。但是可能在實際應用環境中,發現伺服器是撐住了,資料庫還是沒撐住怎麼辦?

資料庫叢集,其實,網站打不開不能提供服務後,我們首先要檢查的就是資料庫崩潰沒有,資料庫是否支撐不住了。支撐不住了就給硬體升升級,如果升不上去了,做讀寫分離吧。最好是找個第三方的資料庫服務平臺,且最好是在你的伺服器提供商那裡買,可以支援內網服務,內網連線總比外網連線資料庫的速度快吧。而且安全性也比外網好。

如果覺得小編的博文還可以,請打賞,您的支援是我的無限動力。
這裡寫圖片描述