這一章來看一下能提升性能插龄,減少服務器壓力的方法
web資源防盜鏈
- 盜鏈是什么? 為什么要防科展?
在自己頁面上顯示一些不是自己服務器的資源
(圖片均牢、音頻、視頻才睹、css徘跪、js等)
由于別人盜鏈你的資源會加重你的服務器負擔,所以我們需要防止
可能會影響統(tǒng)計
- 防盜鏈是什么琅攘? 有哪幾種方式垮庐?
防止別人通過一些技術手段繞過本站的資源展示頁,盜用本站資源坞琴,讓繞開本站資源展示頁面的資源鏈接失效
大大減輕服務器壓力
1哨查、Referer (易偽造referer,安全性低)
2、加密簽名 (安全性高)
- 防盜鏈的工作原理
通過Referer剧辐,服務器可以檢測到訪問目標資源的來源網(wǎng)站解恰,如果是資源文件锋八,則可以跟蹤到顯示它的網(wǎng)頁地址。一旦檢測到來源網(wǎng)站不是本站進行阻止
通過簽名护盈,根據(jù)計算簽名的方式挟纱,判斷請求是否合法,如果合法則顯示腐宋,否則返回錯誤信息
- Referer實現(xiàn)
以Nginx為例紊服,前提加載
ngx_http_referer_module模塊
//指令valid_referers 全局invalid_referer
location ~* \.(gif|jpg|png|webp)$ {
valid_referers none blocked domain.com *.domain.com ;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.domain.com/403.jpg;
}
}
注意:為什么要none呢?因為如果通過瀏覽器直接訪問資源胸竞,referer就是為空欺嗤,所以這種方式不能徹底阻擋住盜鏈。
- 加密簽名
以Nginx為例卫枝,前提加載第三方模塊
HttpAccessKeyModule
實現(xiàn)防盜鏈
location ~* \.(gif|jpg|png|webp)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg key;
accesskey_signature "mysrc$remote_addr";
}
減少HTTP請求次數(shù)
- 發(fā)現(xiàn)問題
8090%是花費在頁面引用控件的加載上煎饼,只有1020%是花費在文檔的加載上
HTTP/1.1協(xié)議規(guī)定請求只能串行發(fā)送,換句話就是100個請求校赤,只能一個一個發(fā)送吆玖,上一個請求完成才能進行下一個請求
- 如何改善?
減少引用控件數(shù)量马篮,從而達到減少HTTP請求次數(shù)
- 如何實現(xiàn)減少請求沾乘?
1、圖片地圖
原理
:把多張圖片合成一張浑测,再使用<map>標簽來實現(xiàn)對圖片上不同區(qū)域的鏈接
<img src="img/planets.gif" width="145" height="126" alt="Planets" usemap="#planetmap">
<map name="planetmap">
<area shape="rect" coords="0,0,82,126" alt="Sun" href="sun.htm">
<area shape="circle" coords="90,58,3" alt="Mercury" href="mercur.htm">
<area shape="circle" coords="124,58,8" alt="Venus" href="venus.htm">
</map>
2翅阵、CSS Sprites(雪碧圖)
原理
:合拼圖片,再使用css的background-image和background-position來指定顯示元素
CSS Sprites與圖片地圖性能差不多迁央,但CSS Sprites更加簡單靈活
3掷匠、合并JS與CSS文件
加載一個JS文件比加載多個JS文件要快
一般會使用前端自動構建工具打包合并
4、圖片使用base64編碼
注意:圖片base64除了可以使用在<img>中岖圈,還可以使用在css的background-image中
CDN加速
- 什么是CDN加速讹语?
CDN 就是
內(nèi)容分發(fā)網(wǎng)絡
,在各處放置服務器
來構成一層智能虛擬網(wǎng)絡幅狮,此處服務器稱之為節(jié)點服務器募强。所謂智能就是會自動根據(jù)用戶請求信息把請求重新分配到離客戶端最近的服務器。
CDN的作用: 解決由于服務端與客戶端所在區(qū)域的不同崇摄,導致影響數(shù)據(jù)傳輸速度和穩(wěn)定性問題擎值,一句話總結就是
讓數(shù)據(jù)傳輸更快更穩(wěn)定
。
- CDN有什么優(yōu)勢逐抑?
1鸠儿、
智能Cache加速
,提高企業(yè)站點的訪問速度(含大量圖片或靜態(tài)頁面最適合,因為CDN相當于是服務器的一個鏡像)
2进每、跨運營商的網(wǎng)絡加速
汹粤,保證不同網(wǎng)絡的用戶都能得到很好的訪問速度
3、加速用戶遠程訪問服務器
田晚,根據(jù)DNS負載均衡技術自動智能選擇Catch服務器
4嘱兼、自動生成遠程服務器的鏡像(Catch服務器)
,加速訪問速度贤徒,減輕Web服務器的負擔芹壕,分擔流量
- CDN的工作原理是什么?
[圖片上傳失敗...(image-70b062-1555662945887)]
[圖片上傳失敗...(image-ac2b9f-1555662945887)]
- CDN適用場景有哪些接奈?
1踢涌、網(wǎng)站或應用中大量靜態(tài)資源的加速分發(fā)
(例如:css/js/圖片等)
2、大文件下載
3序宦、直播網(wǎng)站
- CDN如何實現(xiàn)睁壁?
瀏覽器緩存
高并發(fā)下只能通過提高服務器負載來解決?
NO,流量互捌、前端潘明、服務器、數(shù)據(jù)庫
緩存只能是數(shù)據(jù)庫緩存嗎疫剃?NO,還有瀏覽器緩存
- HTTP緩存分類(2種)
1.****
200 OK (from memory cache)
****直接從本地緩存中獲取響應钉疫,最快速硼讽、最省流量巢价,因為沒有向服務器發(fā)送請求
2.****
304 Not Modified
協(xié)商緩存,瀏覽器在本地沒有命中的情況下固阁,請求頭中會發(fā)送一定的校驗數(shù)據(jù)到服務器壤躲。如果服務端數(shù)據(jù)沒有改變,服務端直接響應(通知瀏覽器從本地緩存獲缺溉肌)碉克,返回304(快速、發(fā)送數(shù)據(jù)很少并齐,只返回最基本的響應頭漏麦,不發(fā)送響應體)
PS: 以上兩種緩存全部失敗,服務器返回完整響應體(
200 OK
)况褪,沒有用到緩存撕贞,速度最慢
- 與
瀏覽器本地緩存
相關的header
Pragma
Cache-Control
Expires
前端代碼和資源壓縮優(yōu)化
讓資源文件更小,加快文件在網(wǎng)絡中傳輸测垛,讓網(wǎng)頁更快的展示捏膨,降低流量和寬帶開銷
- 壓縮方式
JS、CSS、HTML号涯、圖片壓縮和Gzip壓縮
- JS代碼壓縮
去除一些多余的空格和回車目胡,替換長變量名,簡化一些代碼寫法
壓縮工具:在線版和安裝版
- CSS代碼壓縮
與JS壓縮原理一樣链快,去除空白符誉己、注釋和優(yōu)化一下語義化
- HTML代碼壓縮****
(不推薦,鎮(zhèn)用)
不推薦使用域蜗,因為會破壞代碼結構巫延。
- 圖片(JPG、PNG)壓縮
壓縮工具:tinypng/JpegMini/ImageOptim
- Gzip壓縮
Gzip壓縮
是Web服務器對純文本文件(JS/CSS/XML/HTML)
進行壓縮
注意:千萬不要對圖片進行Gzip壓縮
//以Nginx為例
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小文件地消,小于設置值的文件將不會壓縮
gzip_min_length 1k;
# gzip 壓縮級別炉峰,1-10,數(shù)字越大壓縮的越好脉执,也越占用CPU時間疼阔,后面會有詳細說明,推薦6
gzip_comp_level 6;
# 進行壓縮的文件類型半夷。javascript有多種形式婆廊。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
# 是否在http header中添加Vary: Accept-Encoding巫橄,建議開啟
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
# 壓縮存儲的緩沖
gzip_buffers 16 64k;
# 開啟壓縮的http版本
gzip_http_version 1.1;
動態(tài)語言靜態(tài)化
將現(xiàn)代動態(tài)語言的邏輯代碼生成為靜態(tài)HTML文件(靜態(tài)化實際作用:緩存成一個html文件)淘邻,再次訪問時就會重定向到靜態(tài)文件
- 適用場景
對實時性要求不高的頁面
- 為什么要使用靜態(tài)化?
解決高并發(fā)湘换,減輕Web服務器和數(shù)據(jù)庫服務器壓力
- 靜態(tài)化實現(xiàn)方式有幾種宾舅?
1、使用Smarty模板引擎
2彩倚、使用ob系列函數(shù)
- 使用Smarty模板引擎
//緩存存放目錄
$smarty->cache_dir=$ROOT.'/cache';
//開啟緩存
$smarty->caching=true;
//緩存過期時間
$smarty->cache_lifetime=3600;
//加載模板
$smarty->display();
//清除所有緩存文件
$smarty->clearAllCache();
//清除特定模板的緩存
$smarty->clearCache('index.tpl');
- 使用ob系列函數(shù)(重點筹我,實現(xiàn)靜態(tài)化基礎)
//開啟輸出緩沖區(qū)
ob_start();
//獲取輸出緩沖區(qū)內(nèi)容
ob_get_contents();
//清空(擦掉)輸出緩沖區(qū)
ob_clean();
//送出輸出緩沖區(qū)內(nèi)容并關閉緩沖
ob_end_flush();
//得到當前緩沖區(qū)的內(nèi)容并刪除輸出緩沖區(qū)
ob_get_clean();
動態(tài)語言的并發(fā)處理
- 什么是進程?什么是線程帆离?什么是協(xié)程蔬蕊?
進程
:是一個“執(zhí)行中的程序”,程序不執(zhí)行就不會產(chǎn)生進程哥谷。一個執(zhí)行中的程序至少會產(chǎn)生一個進程岸夯,當進程獲得了處理機時才會從就緒狀態(tài)變?yōu)檫\行狀態(tài),處理機不斷切換地分配到每個進程中们妥。決定同時有多少個進程處于運行狀態(tài)的是處理器數(shù)量(CPU核數(shù))
進程的三態(tài)模型:多個程序在系統(tǒng)中運行時猜扮,進程在處理機中交替運行,狀態(tài)在不斷切換王悍。
三態(tài)分別是:就緒破镰、運行、阻塞
[圖片上傳失敗...(image-4c9a3d-1555662945886)]
進程的五態(tài)模型(在三態(tài)的基礎上發(fā)展而來):新建態(tài)、運行態(tài)鲜漩、終止態(tài)源譬、就緒態(tài)、等待態(tài)
線程
:稱之為輕量級的進程
孕似,程序執(zhí)行流的最小單元踩娘。線程依賴于進程(一個進程可以有多個線程),線程不擁有系統(tǒng)資源喉祭。與同屬一個進程的其他線程共享進程擁有的全部資源
养渴;一個線程可以創(chuàng)建和撤銷另一個線程,同一個進程中的多個線程可以并發(fā)執(zhí)行
泛烙。一個進程下有多個線程來完成不同的工作稱之為多線程理卑。(一個進程下至少會有一個線程)
線程由來:由于用戶并發(fā)請求,為每個請求都創(chuàng)建一個進程顯然太浪費系統(tǒng)資源和影響響應用戶請求的效率蔽氨,所以引進線程的概念藐唠。
協(xié)程
:是一種用戶態(tài)輕量級
的線程。
//協(xié)程與線程的區(qū)別
1鹉究、協(xié)程是由用戶自己調(diào)度宇立,而線程是用系統(tǒng)調(diào)度
2、協(xié)程是異步的自赔,而進程線程是同步的
3妈嘹、一個線程可以有多個協(xié)程,一個進程也可以單獨擁有多個協(xié)程
4绍妨、協(xié)程會保留上一次調(diào)用的狀態(tài)
- 什么是多線程润脸?什么是多進程?
多進程:2個或2個以上的進程處于運行狀態(tài)痘绎,進程間通信不方便
多線程:把一個進程分為很多片津函,每一片都是一個獨立的流程肖粮,線程間可以互相通訊
- 同步阻塞模型
- 異步非阻塞模型
- PHP并發(fā)編程實戰(zhàn)
*1.*****使用
swoole擴展
2.使用
消息隊列
3.接口的并發(fā)請求
curl_multi_init()
數(shù)據(jù)緩存
- 什么是數(shù)據(jù)緩存孤页?
傳統(tǒng)關系型數(shù)據(jù)庫都是把數(shù)據(jù)存儲到硬盤中,在高并發(fā)情況下涩馆,對數(shù)據(jù)庫服務器會造成巨大壓力(巨大IO操作)行施,為了解決此問題,數(shù)據(jù)緩存由此而生魂那!
作用:
1蛾号、極大地緩解
數(shù)據(jù)庫服務器的壓力
2、提高數(shù)據(jù)的響應速度
緩存形式有:內(nèi)存緩存涯雅、文件緩存
推薦使用內(nèi)存緩存
- 為什么要使用數(shù)據(jù)緩存鲜结?(答案如上)
第一次訪問:
再次訪問:
- 如何使用Mysql查詢緩存?
- 如何使用Memcache緩存?
- 如何使用redis緩存精刷?
Web服務器負載均衡
- 實現(xiàn)方式
1拗胜、
七層負載均衡(Nginx)
2、四層負載均衡(LVS/硬件設備)
- 七層負載均衡
基于URL等應用層信息
實現(xiàn)負載均衡
// 一般使用Nginx來實現(xiàn)
功能強大怒允、性能卓越埂软、運行穩(wěn)定
配置簡單靈活
上傳文件使用異步模式
多種分發(fā)策略
自動剔除不正常工作設備
- Nginx負載均衡策略
內(nèi)置
加權輪詢、IP Hash
外置
fair策略纫事、通用Hash勘畔、一致性Hash
- Nginx配置負載均衡
http{
upstream load.com{
server 192.168.1.241:80;
server 192.168.1.247:80;
server 127.0.0.1:8080;
}
server{
listen 80;
location / {
proxy_pass http://load.com;
}
}
}
- 四層負載均衡
有2種方式實現(xiàn):
1、LVS
2丽惶、硬件設備
LVS負載均衡的三種方式:NAT炫七、DR和TUN
硬件設備:通過報文中的目標地址和端口,再加上負載均衡設備的服務器選擇方式钾唬,決定最終選擇的內(nèi)部服務器
MySQL數(shù)據(jù)庫優(yōu)化
- 優(yōu)化方向
字段數(shù)據(jù)類型優(yōu)化
tinyint/smallint/int/bigint的選擇
char/varchar
enum 固定分類
IP地址數(shù)據(jù)如何存诉字?
答案:把IP地址轉(zhuǎn)整型類型存儲
索引
SQL語句優(yōu)化
存儲引擎優(yōu)化
表結構設計優(yōu)化
數(shù)據(jù)庫服務器架構優(yōu)化