摘要:如何快速查詢數(shù)據(jù)庫(kù)常規(guī)解決方案并發(fā)對(duì)應(yīng)方案對(duì)網(wǎng)站的架構(gòu)重整,使用分層的結(jié)構(gòu),同時(shí)使用負(fù)載均衡讀寫分離集群。負(fù)載均衡的實(shí)現(xiàn)方案輪詢技術(shù)實(shí)現(xiàn)靜態(tài)實(shí)現(xiàn)動(dòng)態(tài)實(shí)現(xiàn)端口復(fù)用直接路由大流量的解決方案網(wǎng)站的圖片在保證使用情況下,盡可能小。
優(yōu)化方案
定義大型網(wǎng)站
pv值(page views)頁(yè)面瀏覽量:一個(gè)網(wǎng)站所有頁(yè)面在24小時(shí)內(nèi),被瀏覽的總的次數(shù)。達(dá)到千萬級(jí)別/百萬級(jí)別。
uv值(unique visitor)獨(dú)立訪客:一個(gè)網(wǎng)站在24小時(shí)內(nèi),有多少個(gè)用戶來訪問網(wǎng)站。達(dá)到10w左右。
獨(dú)立IP值:有多少個(gè)獨(dú)立的IP地址來訪問網(wǎng)站。達(dá)到10w左右。
uv值約等于獨(dú)立IP值??紤]局域網(wǎng),或者校內(nèi)網(wǎng),則獨(dú)立IP小于uv值。
產(chǎn)生的問題
大并發(fā)(大訪問量):在同一個(gè)時(shí)間點(diǎn),有多少個(gè)用戶來訪問網(wǎng)站。 --> web吞吐量
大流量:用戶訪問網(wǎng)站時(shí),需要的大的帶寬,10G。 --> 流量
大存儲(chǔ):網(wǎng)站的數(shù)據(jù)庫(kù)(表)數(shù)據(jù)流成海量趨勢(shì),表到了1T。 --> 如何快速查詢數(shù)據(jù)庫(kù)
常規(guī)解決方案
并發(fā)對(duì)應(yīng)方案:對(duì)網(wǎng)站的架構(gòu)重整,使用分層的結(jié)構(gòu),同時(shí)使用負(fù)載均衡/讀寫分離+集群。
負(fù)載均衡器(器,軟件/硬件):
硬件:BIG-IP,F5,Net-Scaler。硬件的特點(diǎn):效率高,價(jià)格貴。
軟件:LVS(Linux virtual server)linux虛擬服務(wù),NginxWeb服務(wù)器+反向代理
讀(select)寫(update,insert,delete)分離:
寫,一般把請(qǐng)求發(fā)送到master服務(wù)器上。
讀,根據(jù)實(shí)際情況均衡到其它多個(gè)服務(wù)器上。(網(wǎng)站的程序80%都是讀操作)
讀寫分離原理:
主服務(wù)器上操作完之后,會(huì)形成bin文件,操作的行為會(huì)記錄在bin文件中。在從服務(wù)器中讀取該文件,取在主服務(wù)器的行為,完成主從數(shù)據(jù)同步。(通過一個(gè)線程,不停的去讀取bin文件)
通過配置完成讀寫分離。
集群
解決單點(diǎn)故障的恢復(fù)(冗余技術(shù))
備用`apache`,`nginx`(處于休眠狀態(tài)),通過心跳檢測(cè)來檢測(cè)`apache`,`nginx`(被檢測(cè)的服務(wù)器屬于激活狀態(tài))是否宕機(jī)。(備用服務(wù)器+服務(wù)器稱之為集群)
不管一個(gè)集群中有多少個(gè)服務(wù)器,但是在同一時(shí)間,只有一個(gè)服務(wù)器處于激活/工作狀態(tài)。
負(fù)載均衡的實(shí)現(xiàn)方案:
輪詢技術(shù)(NAT實(shí)現(xiàn))
靜態(tài)實(shí)現(xiàn)
動(dòng)態(tài)實(shí)現(xiàn)
端口復(fù)用
直接路由(DR)
大流量的解決方案:
網(wǎng)站的圖片在保證使用情況下,盡可能小。
對(duì)數(shù)據(jù)壓縮再傳輸 例如:gzip,deflate
把占用流量大的資源,放到專門的服務(wù)器上.例如:圖片->圖片服務(wù)器,視頻->視頻服務(wù)器
買帶寬
大存儲(chǔ)對(duì)應(yīng)方案:
使用緩存:通過緩存來盡量減少或者不查詢數(shù)據(jù)庫(kù)。
常見的有:頁(yè)面靜態(tài)化(磁盤緩存),把動(dòng)態(tài)頁(yè)面轉(zhuǎn)換成靜態(tài)頁(yè)面。 內(nèi)存緩存`redis,memcached,mysql數(shù)據(jù)庫(kù)的memory存儲(chǔ)引擎`。
表的設(shè)計(jì)要滿足3NF(3范式)
創(chuàng)建適當(dāng)?shù)乃饕ㄖ麈I索引,唯一索引,普通索引,全文索引,空間索引)
創(chuàng)建適當(dāng)存儲(chǔ)過程,視圖,函數(shù),觸發(fā)器
分表技術(shù)(水平分表和垂直分表):一個(gè)大表分成幾個(gè)小表。從邏輯上分開。
分區(qū)技術(shù):從物理上把數(shù)據(jù)分配到不同的磁盤空間
讀寫分離
優(yōu)化程序中的SQL語句
優(yōu)化apache的my.ini的配置,nginx的nginx.conf的配置,比如配置最大并發(fā),調(diào)整一些緩存大小。
硬件升級(jí)(使用64位機(jī)器,多個(gè)cpu)
頁(yè)面靜態(tài)化頁(yè)面靜態(tài)化分為:
真靜態(tài):把一個(gè)動(dòng)態(tài)的頁(yè)面,轉(zhuǎn)成一個(gè)靜態(tài)的頁(yè)面。
偽靜態(tài):所謂偽靜態(tài)是從url地址上看是一個(gè)靜態(tài)頁(yè)面的,但是實(shí)際上還是對(duì)應(yīng)一個(gè)動(dòng)態(tài)頁(yè)面。
偽靜態(tài)的原理:
第一次訪問的時(shí)候去查詢數(shù)據(jù)庫(kù),并且生成靜態(tài)頁(yè)面。
第二次訪問返回靜態(tài)頁(yè)面。
linxingzhang.com/index.html -> 請(qǐng)求靜態(tài)頁(yè)面 <-- 首頁(yè)對(duì)應(yīng)的靜態(tài)頁(yè)面
偽靜態(tài)的局部配置:
RewriteRule ^index.html$ index.php [L]
概念
動(dòng)態(tài)網(wǎng)址:
一般來說去查詢數(shù)據(jù)庫(kù),linxingzhang.com/news.php?id=1
特點(diǎn):
查詢數(shù)據(jù)庫(kù),速度慢
接口參數(shù),安全性注意(SQL注入)
不利于SEO
只要有數(shù)據(jù)的接收,則要求對(duì)在客戶端使用正則驗(yàn)證,同時(shí)當(dāng)數(shù)據(jù)接收后,對(duì)數(shù)據(jù)再次通過正則驗(yàn)證。
SQL注入
SQL注入:利用現(xiàn)有應(yīng)用程序,攻擊者將精心構(gòu)造的SQL語句注入到后臺(tái)數(shù)據(jù)庫(kù),并使得數(shù)據(jù)庫(kù)引擎成功執(zhí)行。
SQL注入特點(diǎn):
變種極多
攻擊簡(jiǎn)單
危害極大
SQL注入攻擊的危害性
未經(jīng)授權(quán)情況下操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)
惡意篡改網(wǎng)頁(yè)的內(nèi)容
私自添加系統(tǒng)賬號(hào)或者是數(shù)據(jù)庫(kù)使用者賬號(hào)
網(wǎng)頁(yè)木馬
SQL注入工具:
掃描檢測(cè)
AWVS,web掃描器,APPScan Web掃描器等,抓包代理工具burpsuite
驗(yàn)證測(cè)試
sqlmap
手工探測(cè)SQL漏洞:
通過拼接SQL語句來判斷和驗(yàn)證漏洞
// 測(cè)試語句 id=1" and 1=1 and 1=2 order by num union 聯(lián)合查詢 and 1=2 union select 1,2,3,4 user() database() group_coucat(table_name) from information_schema.tables where table_schema=tableName // table名十六進(jìn)制 select * from downloads where id=1 and 1=2 union select 1,2,3,4,5,6,group_concat(username) from members;
?id=1 and 1=2 union select 1,2,3,4,5,6,load_file("/etc/passwd") ?id=1 and 1=2 union select 1,2,3,4,5,6,@@version ?id=1 and 1=2 union select 1,2,3,4,5,6,@@version_compile_os ?id=1 and 1=2 union select 1,2,3,4,5,6,@@basedir ?id=1 and 1=2 union select 1,2,3,4,5,6,@@datadir
SQL防御:
代碼層防御
第三方安全程序及設(shè)備
代碼層防御
編碼階段:
對(duì)輸入進(jìn)行驗(yàn)證
靜態(tài)查詢
最小權(quán)限
通用防注入腳本
安全函數(shù)(PHP程序:addslashes, mysql_real_escape_string等)
測(cè)試階段:
代碼驗(yàn)證
產(chǎn)品化階段:
Web應(yīng)用安全網(wǎng)關(guān)
第三方安全程序
軟件產(chǎn)品
mod_security 互聯(lián)網(wǎng)安全防護(hù)產(chǎn)品(阿里云盾,安全寶等同類產(chǎn)品)
硬件
web應(yīng)用防火墻
SQL語句驗(yàn)證
function CheckSql($db_string, $querytype = "select") { global $cfg_cookie_encode; $clean = ""; $error = ""; $old_pos = 0; $pos = -1; $log_file = DEDEINC."/../data/".md5($cfg_cookie_encode)."_safe.txt"; $userIP = GetIP(); $getUrl = GetCurUrl(); // 如果是普通查詢語句,直接過濾一些特殊語法 if ($querytype=="select") { $notallow1 = "[^0-9a-z@._-]{1,}(union|sleep|benchmark|load_file|outfile)[^[email protected]]{1,}"; // $notallow2 = "--|/*"; if (eregi($notallow1,$db_string)) { fputs(fopen($log_file,"a+"),"$userIP||$getUrl||$db_string||SelectBreak "); exit("Safe Alert: Request Error step 1 !"); } } // 完整的SQL檢查 while (true) { $pos = strpos($db_string, """, $pos + 1); if ($pos === false) { break; } $clean .= substr($db_string, $old_pos, $pos - $old_pos); while (true) { $pos1 = strpos($db_string, """, $pos + 1); $pos2 = strpos($db_string, "", $pos + 1); if ($pos1 === false) { break; } elseif ($pos2 == false || $pos2 > $pos1) { $pos = $pos1; break; } $pos = $pos2 + 1; } $clean .= "$s$"; $old_pos = $pos + 1; } $clean .= substr($db_string, $old_pos); $clean = trim(strtolower(preg_replace(array("~s+~s" ), array(" "), $clean))); // 老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以檢查它 if (strpos($clean, "union") !== false && preg_match("~(^|[^a-z])union($|[^[a-z])~s", $clean) != 0) { $fail = true; $error="union detect"; } // 發(fā)布版本的程序可能比較少包括--,#這樣的注釋,但是黑客經(jīng)常使用它們 elseif (strpos($clean, "/*") > 2 || strpos($clean, "--") !== false || strpos($clean, "#") !== false) { $fail = true; $error="comment detect"; } // 這些函數(shù)不會(huì)被使用,但是黑客會(huì)用它來操作文件,down掉數(shù)據(jù)庫(kù) elseif (strpos($clean, "sleep") !== false && preg_match("~(^|[^a-z])sleep($|[^[a-z])~s", $clean) != 0) { $fail = true; $error="slown down detect"; } elseif (strpos($clean, "benchmark") !== false && preg_match("~(^|[^a-z])benchmark($|[^[a-z])~s", $clean) != 0) { $fail = true; $error="slown down detect"; } elseif (strpos($clean, "load_file") !== false && preg_match("~(^|[^a-z])load_file($|[^[a-z])~s", $clean) != 0) { $fail = true; $error="file fun detect"; } elseif (strpos($clean, "into outfile") !== false && preg_match("~(^|[^a-z])intos+outfile($|[^[a-z])~s", $clean) != 0) { $fail = true; $error="file fun detect"; } // 老版本的MYSQL不支持子查詢,程序里可能也用得少,但是黑客可以使用它來查詢數(shù)據(jù)庫(kù)敏感信息 elseif (preg_match("~([^)]*?select~s", $clean) != 0) { $fail = true; $error="sub select detect"; } }
靜態(tài)網(wǎng)址:
linxingzhang.com/a.html靜態(tài)的網(wǎng)址
特點(diǎn):
一般不查詢數(shù)據(jù)庫(kù),速度快
不接收參數(shù),安全性比較高
利于SEO
偽靜態(tài)網(wǎng)址:
從形式上看是一個(gè)靜態(tài)的頁(yè)面,但是實(shí)際上對(duì)應(yīng)一個(gè)動(dòng)態(tài)的頁(yè)面。
特點(diǎn):
本身需要查詢數(shù)據(jù)庫(kù),速度慢
不接收參數(shù),安全比較高
利于SEO
局部動(dòng)態(tài)的方式:
直接嵌入JS
ajax
如果動(dòng)態(tài)的數(shù)據(jù)是因?yàn)橛脩裟硞€(gè)操作引發(fā)的,則可以使用事件+ajax來處理
如何實(shí)現(xiàn)頁(yè)面靜態(tài)化
實(shí)現(xiàn)頁(yè)面靜態(tài)化(真靜態(tài)),有兩種方法:
使用PHP的OB機(jī)制
使用模板替換技術(shù)(正則)
OB緩存機(jī)制OB就是output_buffering,輸出緩存,在請(qǐng)求一個(gè)PHP的過程中,實(shí)際上過三個(gè)緩存:1.程序緩存,2.OB緩存,3:瀏覽器緩存。
程序緩存,該緩存是PHP固有的,不能關(guān)閉。
每行代碼,每個(gè)函數(shù)在程序緩存中,處理結(jié)果之后,拼接在一起通過HTTP響應(yīng)返回給瀏覽器。開啟OB緩存:
在php.ini中開啟:output_buffering = 4096 4096 緩存大小。作用于所有的php后綴文件.
調(diào)用PHP函數(shù)ob_start(),只能作用于該頁(yè)面
如果沒有OB緩存,所有的緩存都放在程序緩存中。
header信息不管你是否開啟ob,總是放入到程序緩存中。ob_get_contents(); // 獲取OB中的內(nèi)容 ob_clean(); // 清除ob緩存,但不關(guān)閉ob緩存 ob_end_clean(); // 清除ob緩存,同時(shí)關(guān)閉ob緩存 ob_end_flush(); // 強(qiáng)制把ob緩存刷新到程序緩存,并關(guān)閉ob緩存 ob_flush(); // 強(qiáng)制把ob緩存刷新到程序緩存 flush(); // 把程序緩存刷新到瀏覽器緩存中ob緩存細(xì)節(jié)
ob緩存究竟可以存放什么樣的數(shù)據(jù)?
靜態(tài)數(shù)據(jù):html,css,js,動(dòng)態(tài)語言輸出的結(jié)果.ob放入的數(shù)據(jù),從ob_start()開始到ob_get_contents()之間的返回給瀏覽器的靜態(tài)頁(yè)面
并發(fā)測(cè)試工具常用工具
ab.exe,winrunner,loadrunner
ab.exe基本用法:
切換到apache-bin目錄底下,然后運(yùn)行ab.exe命令// ab.exe -n 總的請(qǐng)求次數(shù) -c 并發(fā)量 請(qǐng)求頁(yè)面地址 ab.exe -n 10000 -c 100 http://127.0.0.1 // 100個(gè)人完成10000次測(cè)試結(jié)果:
> ab.exe -n 10000 -c 100 http://www.ting.com/index.html This is ApacheBench, Version 2.3 <$Revision: 1554214 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.ting.com (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Server Software: Apache/2.4.9 Server Hostname: www.ting.com Server Port: 80 Document Path: /index.html Document Length: 6847 bytes Concurrency Level: 100 // 并發(fā)數(shù) Time taken for tests: 9.118 seconds // 完成的時(shí)間,值越小,服務(wù)器越好,越強(qiáng)悍。 Complete requests: 10000 Failed requests: 0 Total transferred: 71060000 bytes HTML transferred: 68470000 bytes Requests per second: 1096.69 [#/sec] (mean) // 一秒鐘完成多少次請(qǐng)求 Time per request: 91.184 [ms] (mean) // 100個(gè)人并發(fā)一次花費(fèi)的時(shí)間 Time per request: 0.912 [ms] (mean, across all concurrent requests) // 一個(gè)人并發(fā)花費(fèi)的時(shí)間 Transfer rate: 7610.41 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 1.2 0 11 Processing: 26 90 23.8 84 424 Waiting: 26 76 24.4 72 410 Total: 27 90 23.9 85 425 Percentage of the requests served within a certain time (ms) 50% 85 66% 91 75% 96 80% 101 90% 109 95% 117 98% 128 99% 188 100% 425 (longest request) Finished 10000 requests調(diào)整apache的最大并發(fā)數(shù)
在默認(rèn)情況下,apache的最大并發(fā)數(shù)為150
配置文件:httpd-mpm.confMPM(多路處理模塊),就是apache處理并發(fā)的方式:
perfork 預(yù)派生模式:預(yù)先創(chuàng)建配置的進(jìn)程,等待瀏覽器的連接
worker 工作者模式:有一定的進(jìn)程,開了一些配置的線程,等待瀏覽器的連接(優(yōu)于perfork模式,線程消耗更小)
winnt模式 (windows下默認(rèn)的模式):父進(jìn)程-->子進(jìn)程-->線程,等待瀏覽器的連接
確定mpm的指令
> httpd.exe -l Compiled in modules: core.c mod_win32.c mpm_winnt.c // MPM模式 http_core.c mod_so.c需要在httpd.conf文件的打開mpm從配置文件(Include conf/extra/httpd-mpm.conf),然后在httpd-mpm.conf文件中修改最大配置數(shù)
配置最大并發(fā)數(shù),需要在合適數(shù)值之間,需要考慮服務(wù)器本身的性能問題
SEOurl地址255字節(jié)
不要給靜態(tài)頁(yè)面帶參數(shù),否則spider不抓取
在前端盡量不使用frame,iframe
圖片alt信息需要添加上
關(guān)鍵字,描述
移動(dòng)端首屏優(yōu)化DNS預(yù)解析
DNS預(yù)解析與業(yè)務(wù)相關(guān),
DNS缺點(diǎn):
比較耗時(shí)
每個(gè)鏈接都需要重新建立鏈路
域名收斂
域名收斂:將靜態(tài)資源只放在一個(gè)域名下面,而非發(fā)散情況下的多個(gè)域名下
作用:減少DNS解析的開銷一個(gè)頁(yè)面所產(chǎn)生的域名解析數(shù)不能超過5個(gè)
performance對(duì)象
performance對(duì)象作用:查看網(wǎng)頁(yè)性能數(shù)據(jù)
// 獲取 performance 數(shù)據(jù) var performance = { // memory 是非標(biāo)準(zhǔn)屬性,只在 Chrome 有 // 財(cái)富問題:我有多少內(nèi)存 memory: { usedJSHeapSize: 16100000, // JS 對(duì)象(包括V8引擎內(nèi)部對(duì)象)占用的內(nèi)存,一定小于 totalJSHeapSize totalJSHeapSize: 35100000, // 可使用的內(nèi)存 jsHeapSizeLimit: 793000000 // 內(nèi)存大小限制 }, // 哲學(xué)問題:我從哪里來? navigation: { redirectCount: 0, // 如果有重定向的話,頁(yè)面通過幾次重定向跳轉(zhuǎn)而來 type: 0 // 0 即 TYPE_NAVIGATENEXT 正常進(jìn)入的頁(yè)面(非刷新、非重定向等) // 1 即 TYPE_RELOAD 通過 window.location.reload() 刷新的頁(yè)面 // 2 即 TYPE_BACK_FORWARD 通過瀏覽器的前進(jìn)后退按鈕進(jìn)入的頁(yè)面(歷史記錄) // 255 即 TYPE_UNDEFINED 非以上方式進(jìn)入的頁(yè)面 }, timing: { // 在同一個(gè)瀏覽器上下文中,前一個(gè)網(wǎng)頁(yè)(與當(dāng)前頁(yè)面不一定同域)unload 的時(shí)間戳,如果無前一個(gè)網(wǎng)頁(yè) unload ,則與 fetchStart 值相等 navigationStart: 1441112691935, // 前一個(gè)網(wǎng)頁(yè)(與當(dāng)前頁(yè)面同域)unload 的時(shí)間戳,如果無前一個(gè)網(wǎng)頁(yè) unload 或者前一個(gè)網(wǎng)頁(yè)與當(dāng)前頁(yè)面不同域,則值為 0 unloadEventStart: 0, // 和 unloadEventStart 相對(duì)應(yīng),返回前一個(gè)網(wǎng)頁(yè) unload 事件綁定的回調(diào)函數(shù)執(zhí)行完畢的時(shí)間戳 unloadEventEnd: 0, // 第一個(gè) HTTP 重定向發(fā)生時(shí)的時(shí)間。有跳轉(zhuǎn)且是同域名內(nèi)的重定向才算,否則值為 0 redirectStart: 0, // 最后一個(gè) HTTP 重定向完成時(shí)的時(shí)間。有跳轉(zhuǎn)且是同域名內(nèi)部的重定向才算,否則值為 0 redirectEnd: 0, // 瀏覽器準(zhǔn)備好使用 HTTP 請(qǐng)求抓取文檔的時(shí)間,這發(fā)生在檢查本地緩存之前 fetchStart: 1441112692155, // DNS 域名查詢開始的時(shí)間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等 domainLookupStart: 1441112692155, // DNS 域名查詢完成的時(shí)間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等 domainLookupEnd: 1441112692155, // HTTP(TCP) 開始建立連接的時(shí)間,如果是持久連接,則與 fetchStart 值相等 // 注意如果在傳輸層發(fā)生了錯(cuò)誤且重新建立連接,則這里顯示的是新建立的連接開始的時(shí)間 connectStart: 1441112692155, // HTTP(TCP) 完成建立連接的時(shí)間(完成握手),如果是持久連接,則與 fetchStart 值相等 // 注意如果在傳輸層發(fā)生了錯(cuò)誤且重新建立連接,則這里顯示的是新建立的連接完成的時(shí)間 // 注意這里握手結(jié)束,包括安全連接建立完成、SOCKS 授權(quán)通過 connectEnd: 1441112692155, // HTTPS 連接開始的時(shí)間,如果不是安全連接,則值為 0 secureConnectionStart: 0, // HTTP 請(qǐng)求讀取真實(shí)文檔開始的時(shí)間(完成建立連接),包括從本地讀取緩存 // 連接錯(cuò)誤重連時(shí),這里顯示的也是新建立連接的時(shí)間 requestStart: 1441112692158, // HTTP 開始接收響應(yīng)的時(shí)間(獲取到第一個(gè)字節(jié)),包括從本地讀取緩存 responseStart: 1441112692686, // HTTP 響應(yīng)全部接收完成的時(shí)間(獲取到最后一個(gè)字節(jié)),包括從本地讀取緩存 responseEnd: 1441112692687, // 開始解析渲染 DOM 樹的時(shí)間,此時(shí) Document.readyState 變?yōu)?loading,并將拋出 readystatechange 相關(guān)事件 domLoading: 1441112692690, // 完成解析 DOM 樹的時(shí)間,Document.readyState 變?yōu)?interactive,并將拋出 readystatechange 相關(guān)事件 // 注意只是 DOM 樹解析完成,這時(shí)候并沒有開始加載網(wǎng)頁(yè)內(nèi)的資源 domInteractive: 1441112693093, // DOM 解析完成后,網(wǎng)頁(yè)內(nèi)資源加載開始的時(shí)間 // 在 DOMContentLoaded 事件拋出前發(fā)生 domContentLoadedEventStart: 1441112693093, // DOM 解析完成后,網(wǎng)頁(yè)內(nèi)資源加載完成的時(shí)間(如 JS 腳本加載執(zhí)行完畢) domContentLoadedEventEnd: 1441112693101, // DOM 樹解析完成,且資源也準(zhǔn)備就緒的時(shí)間,Document.readyState 變?yōu)?complete,并將拋出 readystatechange 相關(guān)事件 domComplete: 1441112693214, // load 事件發(fā)送給文檔,也即 load 回調(diào)函數(shù)開始執(zhí)行的時(shí)間 // 注意如果沒有綁定 load 事件,值為 0 loadEventStart: 1441112693214, // load 事件的回調(diào)函數(shù)執(zhí)行完畢的時(shí)間 loadEventEnd: 1441112693215 } };鏈路復(fù)用
TCP3次握手
keep-alive(鏈路復(fù)用)提升的部分
Server內(nèi)存消耗,預(yù)選擴(kuò)容
資源內(nèi)聯(lián)
在移動(dòng)APP上面,在特定情況下會(huì)將CSS樣式放在.html中
組件化開發(fā)
按需/異步加載
異步渲染
結(jié)合服務(wù)端渲染
服務(wù)端渲染
Ajax模式下,數(shù)據(jù)與頁(yè)面資源串行
網(wǎng)絡(luò)路徑的增長(zhǎng),提升了網(wǎng)絡(luò)異常的影響
使用Node.js進(jìn)行服務(wù)端渲染
組件前后端同構(gòu)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30674.html
摘要:而網(wǎng)站被降權(quán)基本上是每一個(gè)站長(zhǎng)都會(huì)經(jīng)常的事情,能夠及時(shí)處理網(wǎng)站被降權(quán)才能稱為一個(gè)合格的。想要恢復(fù)網(wǎng)站,那么就要找出網(wǎng)站被降權(quán)的原因,有病因了才能找到對(duì)應(yīng)的解決方法。網(wǎng)站被降權(quán)的原因主要可以分為兩類,分別是站內(nèi)的主觀原因和站外的客觀原因。 一個(gè)運(yùn)營(yíng)中的網(wǎng)站,最所什么?最怕降權(quán),即所謂的被K;如一個(gè)站長(zhǎng)辛苦管理的站長(zhǎng),被K那他死的心都有了,哈哈。而網(wǎng)站被降權(quán)基本上是每一個(gè)站長(zhǎng)都會(huì)經(jīng)常的事情...
摘要:白帽是搜索引擎提倡的,也是一種良性競(jìng)爭(zhēng)。這當(dāng)然不被搜索引擎提倡,甚至于說是頭疼的,還需要想辦法如何在搜索結(jié)果內(nèi)剔除掉那些頁(yè)面。影響搜索引擎對(duì)網(wǎng)站排名的合理和公正性。扁平化目錄層次網(wǎng)站層次既然要清晰,目錄最好不要超過三次分級(jí)。 SEO【search engine optimization】即搜索引擎優(yōu)化。 搜索引擎對(duì)用戶來說,就是搜東西,那他是怎樣展示關(guān)鍵詞的相關(guān)東西呢?這就需要有人每天...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗(yàn),提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請(qǐng)求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時(shí),主要是通過進(jìn)行通信。 最近項(xiàng)目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對(duì)整站進(jìn)行性能優(yōu)化。經(jīng)過一段時(shí)間的學(xué)習(xí),結(jié)合現(xiàn)在項(xiàng)目的實(shí)際性能情況,發(fā)現(xiàn)確實(shí)有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗(yàn),提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請(qǐng)求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時(shí),主要是通過進(jìn)行通信。 最近項(xiàng)目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對(duì)整站進(jìn)行性能優(yōu)化。經(jīng)過一段時(shí)間的學(xué)習(xí),結(jié)合現(xiàn)在項(xiàng)目的實(shí)際性能情況,發(fā)現(xiàn)確實(shí)有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
閱讀 2272·2021-08-23 09:46
閱讀 922·2019-08-29 18:31
閱讀 1872·2019-08-29 17:04
閱讀 2464·2019-08-29 12:23
閱讀 1860·2019-08-26 14:05
閱讀 1085·2019-08-26 13:44
閱讀 3154·2019-08-26 12:23
閱讀 2208·2019-08-26 10:46