在本身頁面上顯示一些不是本身服務器的資源
(圖片、音頻、視頻、css、js等)
因爲別人盜鏈你的資源會加劇你的服務器負擔,因此咱們須要防止
可能會影響統計javascript
防止別人經過一些技術手段繞過本站的資源展現頁,盜用本站資源,讓繞開本站資源展現頁面的資源連接失效
大大減輕服務器壓力php
一、Referer (易僞造referer,安全性低) 二、加密簽名 (安全性高)
經過Referer,服務器能夠檢測到訪問目標資源的來源網站,若是是資源文件,則能夠跟蹤到顯示它的網頁地址。一旦檢測到來源網站不是本站進行阻止
css
經過簽名,根據計算簽名的方式,判斷請求是否合法,若是合法則顯示,不然返回錯誤信息
html
以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就是爲空,因此這種方式不能完全阻擋住盜鏈。java
以Nginx爲例,前提加載第三方模塊
HttpAccessKeyModule
實現防盜鏈web
location ~* \.(gif|jpg|png|webp)$ { accesskey on; accesskey_hashmethod md5; accesskey_arg key; accesskey_signature "mysrc$remote_addr"; }
80~90%是花費在頁面引用控件的加載上,只有10~20%是花費在文檔的加載上
HTTP/1.1協議規定請求只能串行發送,換句話就是100個請求,只能一個一個發送,上一個請求完成才能進行下一個請求redis
減小引用控件數量,從而達到減小HTTP請求次數sql
一、圖片地圖
數據庫
原理
:把多張圖片合成一張,再使用<map>標籤來實現對圖片上不一樣區域的連接
<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>
二、CSS Sprites(雪碧圖)
原理
:合拼圖片,再使用css的background-image和background-position來指定顯示元素
CSS Sprites與圖片地圖性能差很少,但CSS Sprites更加簡單靈活
三、合併JS與CSS文件
加載一個JS文件比加載多個JS文件要快
通常會使用前端自動構建工具打包合併
四、圖片使用base64編碼
注意:圖片base64除了可使用在<img>中,還可使用在css的background-image中
CDN 就是
內容分發網絡
,在各處放置服務器
來構成一層智能虛擬網絡,此處服務器稱之爲節點服務器。所謂智能就是會自動根據用戶請求信息把請求從新分配到離客戶端最近的服務器。
CDN的做用: 解決因爲服務端與客戶端所在區域的不一樣,致使影響數據傳輸速度和穩定性問題,一句話總結就是
讓數據傳輸更快更穩定
。
一、
智能Cache加速
,提升企業站點的訪問速度(含大量圖片或靜態頁面最適合,由於CDN至關因而服務器的一個鏡像)
二、跨運營商的網絡加速
,保證不一樣網絡的用戶都能獲得很好的訪問速度
三、加速用戶遠程訪問服務器
,根據DNS負載均衡技術自動智能選擇Catch服務器
四、自動生成遠程服務器的鏡像(Catch服務器)
,加速訪問速度,減輕Web服務器的負擔,分擔流量
一、網站或應用中大量靜態資源的加速分發
(例如:css/js/圖片等)
二、大文件下載
三、直播網站
高併發下只能經過提升服務器負載來解決?
NO,流量、前端、服務器、數據庫
緩存只能是數據庫緩存嗎?NO,還有瀏覽器緩存
1.
200 OK (from memory cache)
直接從本地緩存中獲取響應,最快速、最省流量,由於沒有向服務器發送請求
2.
304 Not Modified
協商緩存,瀏覽器在本地沒有命中的狀況下,請求頭中會發送必定的校驗數據到服務器。若是服務端數據沒有改變,服務端直接響應(通知瀏覽器從本地緩存獲取),返回304(快速、發送數據不多,只返回最基本的響應頭,不發送響應體)
PS: 以上兩種緩存所有失敗,服務器返回完整響應體(
200 OK
),沒有用到緩存,速度最慢
瀏覽器本地緩存
相關的header
Pragma
Cache-Control
Expires
讓資源文件更小,加快文件在網絡中傳輸,讓網頁更快的展現,下降流量和寬帶開銷
JS、CSS、HTML、圖片壓縮和Gzip壓縮
去除一些多餘的空格和回車,替換長變量名,簡化一些代碼寫法 壓縮工具:在線版和安裝版
與JS壓縮原理同樣,去除空白符、註釋和優化一下語義化
(不推薦,鎮用)
不推薦使用,由於會破壞代碼結構。
壓縮工具:tinypng/JpegMini/ImageOptim
Gzip壓縮
是Web服務器對純文本文件(JS/CSS/XML/HTML)
進行壓縮
注意:千萬不要對圖片進行Gzip壓縮
//以Nginx爲例 # 開啓gzip gzip on; # 啓用gzip壓縮的最小文件,小於設置值的文件將不會壓縮 gzip_min_length 1k; # gzip 壓縮級別,1-10,數字越大壓縮的越好,也越佔用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;
將現代動態語言的邏輯代碼生成爲靜態HTML文件(靜態化實際做用:緩存成一個html文件),再次訪問時就會重定向到靜態文件
對實時性要求不高的頁面
解決高併發,減輕Web服務器和數據庫服務器壓力
一、使用Smarty模板引擎
二、使用ob系列函數
//緩存存放目錄 $smarty->cache_dir=$ROOT.'/cache'; //開啓緩存 $smarty->caching=true; //緩存過時時間 $smarty->cache_lifetime=3600; //加載模板 $smarty->display(); //清除全部緩存文件 $smarty->clearAllCache(); //清除特定模板的緩存 $smarty->clearCache('index.tpl');
//開啓輸出緩衝區 ob_start(); //獲取輸出緩衝區內容 ob_get_contents(); //清空(擦掉)輸出緩衝區 ob_clean(); //送出輸出緩衝區內容並關閉緩衝 ob_end_flush(); //獲得當前緩衝區的內容並刪除輸出緩衝區 ob_get_clean();
進程
:是一個「執行中的程序」,程序不執行就不會產生進程。一個執行中的程序至少會產生一個進程,當進程得到了處理機時纔會從就緒狀態變爲運行狀態,處理機不斷切換地分配到每一個進程中。決定同時有多少個進程處於運行狀態的是處理器數量(CPU核數)
進程的三態模型:多個程序在系統中運行時,進程在處理機中交替運行,狀態在不斷切換。 三態分別是:就緒、運行、阻塞
進程的五態模型(在三態的基礎上發展而來):新建態、運行態、終止態、就緒態、等待態
線程
:稱之爲輕量級的進程
,程序執行流的最小單元。線程依賴於進程(一個進程能夠有多個線程),線程不擁有系統資源。與同屬一個進程的其餘線程共享進程擁有的所有資源
;一個線程能夠建立和撤銷另外一個線程,同一個進程中的多個線程能夠併發執行
。一個進程下有多個線程來完成不一樣的工做稱之爲多線程。(一個進程下至少會有一個線程)
線程由來:因爲用戶併發請求,爲每一個請求都建立一個進程顯然太浪費系統資源和影響響應用戶請求的效率,因此引進線程的概念。
協程
:是一種用戶態輕量級
的線程。
//協程與線程的區別 一、協程是由用戶本身調度,而線程是用系統調度 二、協程是異步的,而進程線程是同步的 三、一個線程能夠有多個協程,一個進程也能夠單獨擁有多個協程 四、協程會保留上一次調用的狀態
多進程:2個或2個以上的進程處於運行狀態,進程間通訊不方便
多線程:把一個進程分爲不少片,每一片都是一個獨立的流程,線程間能夠互相通信
1.使用
swoole擴展
2.使用
消息隊列
3.接口的併發請求
curl_multi_init()
傳統關係型數據庫都是把數據存儲到硬盤中,在高併發狀況下,對數據庫服務器會形成巨大壓力(巨大IO操做),爲了解決此問題,數據緩存由此而生!
做用:
一、極大地緩解
數據庫服務器的壓力
二、提升數據的響應速度
緩存形式有:內存緩存、文件緩存
推薦使用內存緩存
第一次訪問:
再次訪問:
一、
七層負載均衡(Nginx)
二、四層負載均衡(LVS/硬件設備)
基於URL等應用層信息
實現負載均衡
// 通常使用Nginx來實現 功能強大、性能卓越、運行穩定 配置簡單靈活 上傳文件使用異步模式 多種分發策略 自動剔除不正常工做設備
內置
加權輪詢、IP Hash
外置
fair策略、通用Hash、一致性Hash
http{ upstream cluster{ server srv1; server srv2; server srv3; } server{ listen 80; location / { proxy_pass http://cluster; } } }
有2種方式實現:
一、LVS
二、硬件設備
LVS負載均衡的三種方式:NAT、DR和TUN 硬件設備:經過報文中的目標地址和端口,再加上負載均衡設備的服務器選擇方式,決定最終選擇的內部服務器
字段數據類型優化
tinyint/smallint/int/bigint的選擇 char/varchar enum 固定分類 IP地址數據如何存? 答案:把IP地址轉整型類型存儲
索引
SQL語句優化
存儲引擎優化
表結構設計優化
數據庫服務器架構優化