摘要:如何快速查詢數(shù)據(jù)庫常規(guī)解決方案并發(fā)對應(yīng)方案對網(wǎng)站的架構(gòu)重整,使用分層的結(jié)構(gòu),同時使用負(fù)載均衡讀寫分離集群。負(fù)載均衡的實現(xiàn)方案輪詢技術(shù)實現(xiàn)靜態(tài)實現(xiàn)動態(tài)實現(xiàn)端口復(fù)用直接路由大流量的解決方案網(wǎng)站的圖片在保證使用情況下,盡可能小。
優(yōu)化方案
定義大型網(wǎng)站
pv值(page views)頁面瀏覽量:一個網(wǎng)站所有頁面在24小時內(nèi),被瀏覽的總的次數(shù)。達(dá)到千萬級別/百萬級別。
uv值(unique visitor)獨(dú)立訪客:一個網(wǎng)站在24小時內(nèi),有多少個用戶來訪問網(wǎng)站。達(dá)到10w左右。
獨(dú)立IP值:有多少個獨(dú)立的IP地址來訪問網(wǎng)站。達(dá)到10w左右。
uv值約等于獨(dú)立IP值。考慮局域網(wǎng),或者校內(nèi)網(wǎng),則獨(dú)立IP小于uv值。
產(chǎn)生的問題
大并發(fā)(大訪問量):在同一個時間點(diǎn),有多少個用戶來訪問網(wǎng)站。 --> web吞吐量
大流量:用戶訪問網(wǎng)站時,需要的大的帶寬,10G。 --> 流量
大存儲:網(wǎng)站的數(shù)據(jù)庫(表)數(shù)據(jù)流成海量趨勢,表到了1T。 --> 如何快速查詢數(shù)據(jù)庫
常規(guī)解決方案
并發(fā)對應(yīng)方案:對網(wǎng)站的架構(gòu)重整,使用分層的結(jié)構(gòu),同時使用負(fù)載均衡/讀寫分離+集群。
負(fù)載均衡器(器,軟件/硬件):
硬件:BIG-IP,F5,Net-Scaler。硬件的特點(diǎn):效率高,價格貴。
軟件:LVS(Linux virtual server)linux虛擬服務(wù),NginxWeb服務(wù)器+反向代理
讀(select)寫(update,insert,delete)分離:
寫,一般把請求發(fā)送到master服務(wù)器上。
讀,根據(jù)實際情況均衡到其它多個服務(wù)器上。(網(wǎng)站的程序80%都是讀操作)
讀寫分離原理:
主服務(wù)器上操作完之后,會形成bin文件,操作的行為會記錄在bin文件中。在從服務(wù)器中讀取該文件,取在主服務(wù)器的行為,完成主從數(shù)據(jù)同步。(通過一個線程,不停的去讀取bin文件)
通過配置完成讀寫分離。
集群
解決單點(diǎn)故障的恢復(fù)(冗余技術(shù))
備用`apache`,`nginx`(處于休眠狀態(tài)),通過心跳檢測來檢測`apache`,`nginx`(被檢測的服務(wù)器屬于激活狀態(tài))是否宕機(jī)。(備用服務(wù)器+服務(wù)器稱之為集群)
不管一個集群中有多少個服務(wù)器,但是在同一時間,只有一個服務(wù)器處于激活/工作狀態(tài)。
負(fù)載均衡的實現(xiàn)方案:
輪詢技術(shù)(NAT實現(xiàn))
靜態(tài)實現(xiàn)
動態(tài)實現(xiàn)
端口復(fù)用
直接路由(DR)
大流量的解決方案:
網(wǎng)站的圖片在保證使用情況下,盡可能小。
對數(shù)據(jù)壓縮再傳輸 例如:gzip,deflate
把占用流量大的資源,放到專門的服務(wù)器上.例如:圖片->圖片服務(wù)器,視頻->視頻服務(wù)器
買帶寬
大存儲對應(yīng)方案:
使用緩存:通過緩存來盡量減少或者不查詢數(shù)據(jù)庫。
常見的有:頁面靜態(tài)化(磁盤緩存),把動態(tài)頁面轉(zhuǎn)換成靜態(tài)頁面。 內(nèi)存緩存`redis,memcached,mysql數(shù)據(jù)庫的memory存儲引擎`。
表的設(shè)計要滿足3NF(3范式)
創(chuàng)建適當(dāng)?shù)乃饕ㄖ麈I索引,唯一索引,普通索引,全文索引,空間索引)
創(chuàng)建適當(dāng)存儲過程,視圖,函數(shù),觸發(fā)器
分表技術(shù)(水平分表和垂直分表):一個大表分成幾個小表。從邏輯上分開。
分區(qū)技術(shù):從物理上把數(shù)據(jù)分配到不同的磁盤空間
讀寫分離
優(yōu)化程序中的SQL語句
優(yōu)化apache的my.ini的配置,nginx的nginx.conf的配置,比如配置最大并發(fā),調(diào)整一些緩存大小。
硬件升級(使用64位機(jī)器,多個cpu)
頁面靜態(tài)化頁面靜態(tài)化分為:
真靜態(tài):把一個動態(tài)的頁面,轉(zhuǎn)成一個靜態(tài)的頁面。
偽靜態(tài):所謂偽靜態(tài)是從url地址上看是一個靜態(tài)頁面的,但是實際上還是對應(yīng)一個動態(tài)頁面。
偽靜態(tài)的原理:
第一次訪問的時候去查詢數(shù)據(jù)庫,并且生成靜態(tài)頁面。
第二次訪問返回靜態(tài)頁面。
linxingzhang.com/index.html -> 請求靜態(tài)頁面 <-- 首頁對應(yīng)的靜態(tài)頁面
偽靜態(tài)的局部配置:
RewriteRule ^index.html$ index.php [L]
概念
動態(tài)網(wǎng)址:
一般來說去查詢數(shù)據(jù)庫,linxingzhang.com/news.php?id=1
特點(diǎn):
查詢數(shù)據(jù)庫,速度慢
接口參數(shù),安全性注意(SQL注入)
不利于SEO
只要有數(shù)據(jù)的接收,則要求對在客戶端使用正則驗證,同時當(dāng)數(shù)據(jù)接收后,對數(shù)據(jù)再次通過正則驗證。
SQL注入
SQL注入:利用現(xiàn)有應(yīng)用程序,攻擊者將精心構(gòu)造的SQL語句注入到后臺數(shù)據(jù)庫,并使得數(shù)據(jù)庫引擎成功執(zhí)行。
SQL注入特點(diǎn):
變種極多
攻擊簡單
危害極大
SQL注入攻擊的危害性
未經(jīng)授權(quán)情況下操作數(shù)據(jù)庫中的數(shù)據(jù)
惡意篡改網(wǎng)頁的內(nèi)容
私自添加系統(tǒng)賬號或者是數(shù)據(jù)庫使用者賬號
網(wǎng)頁木馬
SQL注入工具:
掃描檢測
AWVS,web掃描器,APPScan Web掃描器等,抓包代理工具burpsuite
驗證測試
sqlmap
手工探測SQL漏洞:
通過拼接SQL語句來判斷和驗證漏洞
// 測試語句 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è)備
代碼層防御
編碼階段:
對輸入進(jìn)行驗證
靜態(tài)查詢
最小權(quán)限
通用防注入腳本
安全函數(shù)(PHP程序:addslashes, mysql_real_escape_string等)
測試階段:
代碼驗證
產(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語句驗證
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)[^0-9a-z@.-]{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ù)不會被使用,但是黑客會用它來操作文件,down掉數(shù)據(jù)庫 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ù)庫敏感信息 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ù)庫,速度快
不接收參數(shù),安全性比較高
利于SEO
偽靜態(tài)網(wǎng)址:
從形式上看是一個靜態(tài)的頁面,但是實際上對應(yīng)一個動態(tài)的頁面。
特點(diǎn):
本身需要查詢數(shù)據(jù)庫,速度慢
不接收參數(shù),安全比較高
利于SEO
局部動態(tài)的方式:
直接嵌入JS
ajax
如果動態(tài)的數(shù)據(jù)是因為用戶某個操作引發(fā)的,則可以使用事件+ajax來處理
如何實現(xiàn)頁面靜態(tài)化
實現(xiàn)頁面靜態(tài)化(真靜態(tài)),有兩種方法:
使用PHP的OB機(jī)制
使用模板替換技術(shù)(正則)
OB緩存機(jī)制OB就是output_buffering,輸出緩存,在請求一個PHP的過程中,實際上過三個緩存:1.程序緩存,2.OB緩存,3:瀏覽器緩存。
程序緩存,該緩存是PHP固有的,不能關(guān)閉。
每行代碼,每個函數(shù)在程序緩存中,處理結(jié)果之后,拼接在一起通過HTTP響應(yīng)返回給瀏覽器。開啟OB緩存:
在php.ini中開啟:output_buffering = 4096 4096 緩存大小。作用于所有的php后綴文件.
調(diào)用PHP函數(shù)ob_start(),只能作用于該頁面
如果沒有OB緩存,所有的緩存都放在程序緩存中。
header信息不管你是否開啟ob,總是放入到程序緩存中。ob_get_contents(); // 獲取OB中的內(nèi)容 ob_clean(); // 清除ob緩存,但不關(guān)閉ob緩存 ob_end_clean(); // 清除ob緩存,同時關(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,動態(tài)語言輸出的結(jié)果.ob放入的數(shù)據(jù),從ob_start()開始到ob_get_contents()之間的返回給瀏覽器的靜態(tài)頁面
并發(fā)測試工具常用工具
ab.exe,winrunner,loadrunner
ab.exe基本用法:
切換到apache-bin目錄底下,然后運(yùn)行ab.exe命令// ab.exe -n 總的請求次數(shù) -c 并發(fā)量 請求頁面地址 ab.exe -n 10000 -c 100 http://127.0.0.1 // 100個人完成10000次測試結(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 // 完成的時間,值越小,服務(wù)器越好,越強(qiáng)悍。 Complete requests: 10000 Failed requests: 0 Total transferred: 71060000 bytes HTML transferred: 68470000 bytes Requests per second: 1096.69 [#/sec] (mean) // 一秒鐘完成多少次請求 Time per request: 91.184 [ms] (mean) // 100個人并發(fā)一次花費(fèi)的時間 Time per request: 0.912 [ms] (mean, across all concurrent requests) // 一個人并發(fā)花費(fèi)的時間 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模式,線程消耗更?。?/p>
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)頁面帶參數(shù),否則spider不抓取
在前端盡量不使用frame,iframe
圖片alt信息需要添加上
關(guān)鍵字,描述
移動端首屏優(yōu)化DNS預(yù)解析
DNS預(yù)解析與業(yè)務(wù)相關(guān),
DNS缺點(diǎn):
比較耗時
每個鏈接都需要重新建立鏈路
域名收斂
域名收斂:將靜態(tài)資源只放在一個域名下面,而非發(fā)散情況下的多個域名下
作用:減少DNS解析的開銷一個頁面所產(chǎn)生的域名解析數(shù)不能超過5個
performance對象
performance對象作用:查看網(wǎng)頁性能數(shù)據(jù)
// 獲取 performance 數(shù)據(jù) var performance = { // memory 是非標(biāo)準(zhǔn)屬性,只在 Chrome 有 // 財富問題:我有多少內(nèi)存 memory: { usedJSHeapSize: 16100000, // JS 對象(包括V8引擎內(nèi)部對象)占用的內(nèi)存,一定小于 totalJSHeapSize totalJSHeapSize: 35100000, // 可使用的內(nèi)存 jsHeapSizeLimit: 793000000 // 內(nèi)存大小限制 }, // 哲學(xué)問題:我從哪里來? navigation: { redirectCount: 0, // 如果有重定向的話,頁面通過幾次重定向跳轉(zhuǎn)而來 type: 0 // 0 即 TYPE_NAVIGATENEXT 正常進(jìn)入的頁面(非刷新、非重定向等) // 1 即 TYPE_RELOAD 通過 window.location.reload() 刷新的頁面 // 2 即 TYPE_BACK_FORWARD 通過瀏覽器的前進(jìn)后退按鈕進(jìn)入的頁面(歷史記錄) // 255 即 TYPE_UNDEFINED 非以上方式進(jìn)入的頁面 }, timing: { // 在同一個瀏覽器上下文中,前一個網(wǎng)頁(與當(dāng)前頁面不一定同域)unload 的時間戳,如果無前一個網(wǎng)頁 unload ,則與 fetchStart 值相等 navigationStart: 1441112691935, // 前一個網(wǎng)頁(與當(dāng)前頁面同域)unload 的時間戳,如果無前一個網(wǎng)頁 unload 或者前一個網(wǎng)頁與當(dāng)前頁面不同域,則值為 0 unloadEventStart: 0, // 和 unloadEventStart 相對應(yīng),返回前一個網(wǎng)頁 unload 事件綁定的回調(diào)函數(shù)執(zhí)行完畢的時間戳 unloadEventEnd: 0, // 第一個 HTTP 重定向發(fā)生時的時間。有跳轉(zhuǎn)且是同域名內(nèi)的重定向才算,否則值為 0 redirectStart: 0, // 最后一個 HTTP 重定向完成時的時間。有跳轉(zhuǎn)且是同域名內(nèi)部的重定向才算,否則值為 0 redirectEnd: 0, // 瀏覽器準(zhǔn)備好使用 HTTP 請求抓取文檔的時間,這發(fā)生在檢查本地緩存之前 fetchStart: 1441112692155, // DNS 域名查詢開始的時間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等 domainLookupStart: 1441112692155, // DNS 域名查詢完成的時間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等 domainLookupEnd: 1441112692155, // HTTP(TCP) 開始建立連接的時間,如果是持久連接,則與 fetchStart 值相等 // 注意如果在傳輸層發(fā)生了錯誤且重新建立連接,則這里顯示的是新建立的連接開始的時間 connectStart: 1441112692155, // HTTP(TCP) 完成建立連接的時間(完成握手),如果是持久連接,則與 fetchStart 值相等 // 注意如果在傳輸層發(fā)生了錯誤且重新建立連接,則這里顯示的是新建立的連接完成的時間 // 注意這里握手結(jié)束,包括安全連接建立完成、SOCKS 授權(quán)通過 connectEnd: 1441112692155, // HTTPS 連接開始的時間,如果不是安全連接,則值為 0 secureConnectionStart: 0, // HTTP 請求讀取真實文檔開始的時間(完成建立連接),包括從本地讀取緩存 // 連接錯誤重連時,這里顯示的也是新建立連接的時間 requestStart: 1441112692158, // HTTP 開始接收響應(yīng)的時間(獲取到第一個字節(jié)),包括從本地讀取緩存 responseStart: 1441112692686, // HTTP 響應(yīng)全部接收完成的時間(獲取到最后一個字節(jié)),包括從本地讀取緩存 responseEnd: 1441112692687, // 開始解析渲染 DOM 樹的時間,此時 Document.readyState 變?yōu)?loading,并將拋出 readystatechange 相關(guān)事件 domLoading: 1441112692690, // 完成解析 DOM 樹的時間,Document.readyState 變?yōu)?interactive,并將拋出 readystatechange 相關(guān)事件 // 注意只是 DOM 樹解析完成,這時候并沒有開始加載網(wǎng)頁內(nèi)的資源 domInteractive: 1441112693093, // DOM 解析完成后,網(wǎng)頁內(nèi)資源加載開始的時間 // 在 DOMContentLoaded 事件拋出前發(fā)生 domContentLoadedEventStart: 1441112693093, // DOM 解析完成后,網(wǎng)頁內(nèi)資源加載完成的時間(如 JS 腳本加載執(zhí)行完畢) domContentLoadedEventEnd: 1441112693101, // DOM 樹解析完成,且資源也準(zhǔn)備就緒的時間,Document.readyState 變?yōu)?complete,并將拋出 readystatechange 相關(guān)事件 domComplete: 1441112693214, // load 事件發(fā)送給文檔,也即 load 回調(diào)函數(shù)開始執(zhí)行的時間 // 注意如果沒有綁定 load 事件,值為 0 loadEventStart: 1441112693214, // load 事件的回調(diào)函數(shù)執(zhí)行完畢的時間 loadEventEnd: 1441112693215 } };鏈路復(fù)用
TCP3次握手
keep-alive(鏈路復(fù)用)提升的部分
Server內(nèi)存消耗,預(yù)選擴(kuò)容
資源內(nèi)聯(lián)
在移動APP上面,在特定情況下會將CSS樣式放在.html中
組件化開發(fā)
按需/異步加載
異步渲染
結(jié)合服務(wù)端渲染
服務(wù)端渲染
Ajax模式下,數(shù)據(jù)與頁面資源串行
網(wǎng)絡(luò)路徑的增長,提升了網(wǎng)絡(luò)異常的影響
使用Node.js進(jìn)行服務(wù)端渲染
組件前后端同構(gòu)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/30674.html
摘要:而網(wǎng)站被降權(quán)基本上是每一個站長都會經(jīng)常的事情,能夠及時處理網(wǎng)站被降權(quán)才能稱為一個合格的。想要恢復(fù)網(wǎng)站,那么就要找出網(wǎng)站被降權(quán)的原因,有病因了才能找到對應(yīng)的解決方法。網(wǎng)站被降權(quán)的原因主要可以分為兩類,分別是站內(nèi)的主觀原因和站外的客觀原因。 一個運(yùn)營中的網(wǎng)站,最所什么?最怕降權(quán),即所謂的被K;如一個站長辛苦管理的站長,被K那他死的心都有了,哈哈。而網(wǎng)站被降權(quán)基本上是每一個站長都會經(jīng)常的事情...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時,主要是通過進(jìn)行通信。 最近項目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對整站進(jìn)行性能優(yōu)化。經(jīng)過一段時間的學(xué)習(xí),結(jié)合現(xiàn)在項目的實際性能情況,發(fā)現(xiàn)確實有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
摘要:淺談網(wǎng)站性能之前端性能優(yōu)化性能優(yōu)化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內(nèi)容本身。前端性能優(yōu)化減少請求數(shù)量基本原理在瀏覽器與服務(wù)器進(jìn)行通信時,主要是通過進(jìn)行通信。 最近項目慢慢走上正軌,需求趨于平穩(wěn),這才想起需要對整站進(jìn)行性能優(yōu)化。經(jīng)過一段時間的學(xué)習(xí),結(jié)合現(xiàn)在項目的實際性能情況,發(fā)現(xiàn)確實有許多地方可以進(jìn)行優(yōu)化。于是就開始了我的前端性能優(yōu)化之旅。以下...
閱讀 2419·2021-08-23 09:46
閱讀 994·2019-08-29 18:31
閱讀 1951·2019-08-29 17:04
閱讀 2615·2019-08-29 12:23
閱讀 1924·2019-08-26 14:05
閱讀 1160·2019-08-26 13:44
閱讀 3308·2019-08-26 12:23
閱讀 2349·2019-08-26 10:46