国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

網站優化

lylwyy2016 / 883人閱讀

摘要:如何快速查詢數據庫常規解決方案并發對應方案對網站的架構重整,使用分層的結構,同時使用負載均衡讀寫分離集群。負載均衡的實現方案輪詢技術實現靜態實現動態實現端口復用直接路由大流量的解決方案網站的圖片在保證使用情況下,盡可能小。

優化方案

定義大型網站

pv值(page views)頁面瀏覽量:一個網站所有頁面在24小時內,被瀏覽的總的次數。達到千萬級別/百萬級別。

uv值(unique visitor)獨立訪客:一個網站在24小時內,有多少個用戶來訪問網站。達到10w左右。

獨立IP值:有多少個獨立的IP地址來訪問網站。達到10w左右。

uv值約等于獨立IP值??紤]局域網,或者校內網,則獨立IP小于uv值。

產生的問題

大并發(大訪問量):在同一個時間點,有多少個用戶來訪問網站。 --> web吞吐量

大流量:用戶訪問網站時,需要的大的帶寬,10G。 --> 流量

大存儲:網站的數據庫(表)數據流成海量趨勢,表到了1T。 --> 如何快速查詢數據庫

常規解決方案

并發對應方案:對網站的架構重整,使用分層的結構,同時使用負載均衡/讀寫分離+集群

負載均衡器(器,軟件/硬件):
硬件:BIG-IP,F5,Net-Scaler。硬件的特點:效率高,價格貴。
軟件:LVS(Linux virtual server)linux虛擬服務,NginxWeb服務器+反向代理

讀(select)寫(update,insert,delete)分離:
寫,一般把請求發送到master服務器上。
讀,根據實際情況均衡到其它多個服務器上。(網站的程序80%都是讀操作)

讀寫分離原理:
主服務器上操作完之后,會形成bin文件,操作的行為會記錄在bin文件中。在從服務器中讀取該文件,取在主服務器的行為,完成主從數據同步。(通過一個線程,不停的去讀取bin文件)
通過配置完成讀寫分離。

集群

解決單點故障的恢復(冗余技術)

備用`apache`,`nginx`(處于休眠狀態),通過心跳檢測來檢測`apache`,`nginx`(被檢測的服務器屬于激活狀態)是否宕機。(備用服務器+服務器稱之為集群)

不管一個集群中有多少個服務器,但是在同一時間,只有一個服務器處于激活/工作狀態。

負載均衡的實現方案:

輪詢技術(NAT實現)

靜態實現

動態實現

端口復用

直接路由(DR)

大流量的解決方案

網站的圖片在保證使用情況下,盡可能小。

對數據壓縮再傳輸 例如:gzip,deflate

把占用流量大的資源,放到專門的服務器上.例如:圖片->圖片服務器,視頻->視頻服務器

買帶寬

大存儲對應方案:

使用緩存:通過緩存來盡量減少或者不查詢數據庫。

常見的有:頁面靜態化(磁盤緩存),把動態頁面轉換成靜態頁面。 內存緩存`redis,memcached,mysql數據庫的memory存儲引擎`。

表的設計要滿足3NF(3范式)

創建適當的索引(主鍵索引,唯一索引,普通索引,全文索引,空間索引)

創建適當存儲過程,視圖,函數,觸發器

分表技術(水平分表和垂直分表):一個大表分成幾個小表。從邏輯上分開。

分區技術:從物理上把數據分配到不同的磁盤空間

讀寫分離

優化程序中的SQL語句

優化apache的my.ini的配置,nginx的nginx.conf的配置,比如配置最大并發,調整一些緩存大小。

硬件升級(使用64位機器,多個cpu)

頁面靜態化

頁面靜態化分為:

真靜態:把一個動態的頁面,轉成一個靜態的頁面。

偽靜態:所謂偽靜態是從url地址上看是一個靜態頁面的,但是實際上還是對應一個動態頁面。

偽靜態的原理:

第一次訪問的時候去查詢數據庫,并且生成靜態頁面。
第二次訪問返回靜態頁面。

linxingzhang.com/index.html -> 請求靜態頁面 <-- 首頁對應的靜態頁面

偽靜態的局部配置:

RewriteRule ^index.html$ index.php [L]

概念

動態網址:
一般來說去查詢數據庫,linxingzhang.com/news.php?id=1
特點:

查詢數據庫,速度慢

接口參數,安全性注意(SQL注入)

不利于SEO

只要有數據的接收,則要求對在客戶端使用正則驗證,同時當數據接收后,對數據再次通過正則驗證。

SQL注入

SQL注入:利用現有應用程序,攻擊者將精心構造的SQL語句注入到后臺數據庫,并使得數據庫引擎成功執行。

SQL注入特點:

變種極多

攻擊簡單

危害極大

SQL注入攻擊的危害性

未經授權情況下操作數據庫中的數據

惡意篡改網頁的內容

私自添加系統賬號或者是數據庫使用者賬號

網頁木馬

SQL注入工具:

掃描檢測

AWVS,web掃描器,APPScan Web掃描器等,抓包代理工具burpsuite

驗證測試

sqlmap

手工探測SQL漏洞:
通過拼接SQL語句來判斷和驗證漏洞

// 測試語句
id=1"
and 1=1
and 1=2
order by num
union 聯合查詢
and 1=2 union select 1,2,3,4
user()
database()
group_coucat(table_name) from information_schema.tables where table_schema=tableName // table名十六進制
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防御:

代碼層防御

第三方安全程序及設備

代碼層防御

編碼階段:

對輸入進行驗證

靜態查詢

最小權限

通用防注入腳本

安全函數(PHP程序:addslashes, mysql_real_escape_string等)

測試階段:

代碼驗證

產品化階段:

Web應用安全網關

第三方安全程序

軟件產品

mod_security
互聯網安全防護產品(阿里云盾,安全寶等同類產品)

硬件

web應用防火墻

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";
    }

    // 發布版本的程序可能比較少包括--,#這樣的注釋,但是黑客經常使用它們
    elseif (strpos($clean, "/*") > 2 || strpos($clean, "--") !== false || strpos($clean, "#") !== false) {
        $fail = true;
        $error="comment detect";
    }

    // 這些函數不會被使用,但是黑客會用它來操作文件,down掉數據庫
    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不支持子查詢,程序里可能也用得少,但是黑客可以使用它來查詢數據庫敏感信息
    elseif (preg_match("~([^)]*?select~s", $clean) != 0) {
        $fail = true;
        $error="sub select detect";
    }
}

靜態網址:
linxingzhang.com/a.html靜態的網址

特點:

一般不查詢數據庫,速度快

不接收參數,安全性比較高

利于SEO

偽靜態網址:
從形式上看是一個靜態的頁面,但是實際上對應一個動態的頁面。
特點:

本身需要查詢數據庫,速度慢

不接收參數,安全比較高

利于SEO

局部動態的方式:

直接嵌入JS

ajax

如果動態的數據是因為用戶某個操作引發的,則可以使用事件+ajax來處理

如何實現頁面靜態化

實現頁面靜態化(真靜態),有兩種方法:

使用PHP的OB機制

使用模板替換技術(正則)

OB緩存機制

OB就是output_buffering,輸出緩存,在請求一個PHP的過程中,實際上過三個緩存:1.程序緩存,2.OB緩存,3:瀏覽器緩存。




程序緩存,該緩存是PHP固有的,不能關閉。
每行代碼,每個函數在程序緩存中,處理結果之后,拼接在一起通過HTTP響應返回給瀏覽器。

開啟OB緩存:

php.ini中開啟:output_buffering = 4096 4096 緩存大小。作用于所有的php后綴文件.

調用PHP函數ob_start(),只能作用于該頁面

如果沒有OB緩存,所有的緩存都放在程序緩存中。
header信息不管你是否開啟ob,總是放入到程序緩存中。

ob_get_contents(); // 獲取OB中的內容
ob_clean(); // 清除ob緩存,但不關閉ob緩存
ob_end_clean(); // 清除ob緩存,同時關閉ob緩存
ob_end_flush(); // 強制把ob緩存刷新到程序緩存,并關閉ob緩存
ob_flush(); // 強制把ob緩存刷新到程序緩存
flush(); //  把程序緩存刷新到瀏覽器緩存中

ob緩存細節

ob緩存究竟可以存放什么樣的數據?
靜態數據:html,css,js,動態語言輸出的結果.

ob放入的數據,從ob_start()開始到ob_get_contents()之間的返回給瀏覽器的靜態頁面

并發測試工具

常用工具

ab.exe,winrunner,loadrunner

ab.exe基本用法:
切換到apache-bin目錄底下,然后運行ab.exe命令

// ab.exe -n 總的請求次數 -c 并發量 請求頁面地址
ab.exe -n 10000 -c 100 http://127.0.0.1 // 100個人完成10000次

測試結果:

> 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 // 并發數
Time taken for tests:   9.118 seconds // 完成的時間,值越小,服務器越好,越強悍。
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個人并發一次花費的時間
Time per request:       0.912 [ms] (mean, across all concurrent requests) // 一個人并發花費的時間
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

調整apache的最大并發數

在默認情況下,apache的最大并發數為150
配置文件:httpd-mpm.conf

MPM(多路處理模塊),就是apache處理并發的方式:

perfork 預派生模式:預先創建配置的進程,等待瀏覽器的連接

worker 工作者模式:有一定的進程,開了一些配置的線程,等待瀏覽器的連接(優于perfork模式,線程消耗更小)

winnt模式 (windows下默認的模式):父進程-->子進程-->線程,等待瀏覽器的連接

確定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文件中修改最大配置數

配置最大并發數,需要在合適數值之間,需要考慮服務器本身的性能問題

SEO

url地址255字節

不要給靜態頁面帶參數,否則spider不抓取

在前端盡量不使用frame,iframe

圖片alt信息需要添加上

關鍵字,描述

移動端首屏優化

DNS預解析

DNS預解析與業務相關,

DNS缺點:

比較耗時

每個鏈接都需要重新建立鏈路


域名收斂

域名收斂:將靜態資源只放在一個域名下面,而非發散情況下的多個域名下
作用:減少DNS解析的開銷

一個頁面所產生的域名解析數不能超過5個

performance對象

performance對象作用:查看網頁性能數據

// 獲取 performance 數據
var performance = {
    // memory 是非標準屬性,只在 Chrome 有
    // 財富問題:我有多少內存
    memory: {
        usedJSHeapSize:  16100000, // JS 對象(包括V8引擎內部對象)占用的內存,一定小于 totalJSHeapSize
        totalJSHeapSize: 35100000, // 可使用的內存
        jsHeapSizeLimit: 793000000 // 內存大小限制
    },

    //  哲學問題:我從哪里來?
    navigation: {
        redirectCount: 0, // 如果有重定向的話,頁面通過幾次重定向跳轉而來
        type: 0           // 0   即 TYPE_NAVIGATENEXT 正常進入的頁面(非刷新、非重定向等)
                          // 1   即 TYPE_RELOAD       通過 window.location.reload() 刷新的頁面
                          // 2   即 TYPE_BACK_FORWARD 通過瀏覽器的前進后退按鈕進入的頁面(歷史記錄)
                          // 255 即 TYPE_UNDEFINED    非以上方式進入的頁面
    },

    timing: {
        // 在同一個瀏覽器上下文中,前一個網頁(與當前頁面不一定同域)unload 的時間戳,如果無前一個網頁 unload ,則與 fetchStart 值相等
        navigationStart: 1441112691935,

        // 前一個網頁(與當前頁面同域)unload 的時間戳,如果無前一個網頁 unload 或者前一個網頁與當前頁面不同域,則值為 0
        unloadEventStart: 0,

        // 和 unloadEventStart 相對應,返回前一個網頁 unload 事件綁定的回調函數執行完畢的時間戳
        unloadEventEnd: 0,

        // 第一個 HTTP 重定向發生時的時間。有跳轉且是同域名內的重定向才算,否則值為 0 
        redirectStart: 0,

        // 最后一個 HTTP 重定向完成時的時間。有跳轉且是同域名內部的重定向才算,否則值為 0 
        redirectEnd: 0,

        // 瀏覽器準備好使用 HTTP 請求抓取文檔的時間,這發生在檢查本地緩存之前
        fetchStart: 1441112692155,

        // DNS 域名查詢開始的時間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等
        domainLookupStart: 1441112692155,

        // DNS 域名查詢完成的時間,如果使用了本地緩存(即無 DNS 查詢)或持久連接,則與 fetchStart 值相等
        domainLookupEnd: 1441112692155,

        // HTTP(TCP) 開始建立連接的時間,如果是持久連接,則與 fetchStart 值相等
        // 注意如果在傳輸層發生了錯誤且重新建立連接,則這里顯示的是新建立的連接開始的時間
        connectStart: 1441112692155,

        // HTTP(TCP) 完成建立連接的時間(完成握手),如果是持久連接,則與 fetchStart 值相等
        // 注意如果在傳輸層發生了錯誤且重新建立連接,則這里顯示的是新建立的連接完成的時間
        // 注意這里握手結束,包括安全連接建立完成、SOCKS 授權通過
        connectEnd: 1441112692155,

        // HTTPS 連接開始的時間,如果不是安全連接,則值為 0
        secureConnectionStart: 0,

        // HTTP 請求讀取真實文檔開始的時間(完成建立連接),包括從本地讀取緩存
        // 連接錯誤重連時,這里顯示的也是新建立連接的時間
        requestStart: 1441112692158,

        // HTTP 開始接收響應的時間(獲取到第一個字節),包括從本地讀取緩存
        responseStart: 1441112692686,

        // HTTP 響應全部接收完成的時間(獲取到最后一個字節),包括從本地讀取緩存
        responseEnd: 1441112692687,

        // 開始解析渲染 DOM 樹的時間,此時 Document.readyState 變為 loading,并將拋出 readystatechange 相關事件
        domLoading: 1441112692690,

        // 完成解析 DOM 樹的時間,Document.readyState 變為 interactive,并將拋出 readystatechange 相關事件
        // 注意只是 DOM 樹解析完成,這時候并沒有開始加載網頁內的資源
        domInteractive: 1441112693093,

        // DOM 解析完成后,網頁內資源加載開始的時間
        // 在 DOMContentLoaded 事件拋出前發生
        domContentLoadedEventStart: 1441112693093,

        // DOM 解析完成后,網頁內資源加載完成的時間(如 JS 腳本加載執行完畢)
        domContentLoadedEventEnd: 1441112693101,

        // DOM 樹解析完成,且資源也準備就緒的時間,Document.readyState 變為 complete,并將拋出 readystatechange 相關事件
        domComplete: 1441112693214,

        // load 事件發送給文檔,也即 load 回調函數開始執行的時間
        // 注意如果沒有綁定 load 事件,值為 0
        loadEventStart: 1441112693214,

        // load 事件的回調函數執行完畢的時間
        loadEventEnd: 1441112693215
    }
};

鏈路復用

TCP3次握手

keep-alive(鏈路復用)提升的部分

Server內存消耗,預選擴容

資源內聯

在移動APP上面,在特定情況下會將CSS樣式放在.html

組件化開發

按需/異步加載

異步渲染

結合服務端渲染

服務端渲染

Ajax模式下,數據與頁面資源串行

網絡路徑的增長,提升了網絡異常的影響

使用Node.js進行服務端渲染

組件前后端同構

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30674.html

相關文章

  • 網站被降權的原因分析

    摘要:而網站被降權基本上是每一個站長都會經常的事情,能夠及時處理網站被降權才能稱為一個合格的。想要恢復網站,那么就要找出網站被降權的原因,有病因了才能找到對應的解決方法。網站被降權的原因主要可以分為兩類,分別是站內的主觀原因和站外的客觀原因。 一個運營中的網站,最所什么?最怕降權,即所謂的被K;如一個站長辛苦管理的站長,被K那他死的心都有了,哈哈。而網站被降權基本上是每一個站長都會經常的事情...

    baukh789 評論0 收藏0
  • 淺聊SEO

    摘要:白帽是搜索引擎提倡的,也是一種良性競爭。這當然不被搜索引擎提倡,甚至于說是頭疼的,還需要想辦法如何在搜索結果內剔除掉那些頁面。影響搜索引擎對網站排名的合理和公正性。扁平化目錄層次網站層次既然要清晰,目錄最好不要超過三次分級。 SEO【search engine optimization】即搜索引擎優化。 搜索引擎對用戶來說,就是搜東西,那他是怎樣展示關鍵詞的相關東西呢?這就需要有人每天...

    yedf 評論0 收藏0
  • 淺談網站性能之前端性能優化

    摘要:淺談網站性能之前端性能優化性能優化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內容本身。前端性能優化減少請求數量基本原理在瀏覽器與服務器進行通信時,主要是通過進行通信。 最近項目慢慢走上正軌,需求趨于平穩,這才想起需要對整站進行性能優化。經過一段時間的學習,結合現在項目的實際性能情況,發現確實有許多地方可以進行優化。于是就開始了我的前端性能優化之旅。以下...

    Winer 評論0 收藏0
  • 淺談網站性能之前端性能優化

    摘要:淺談網站性能之前端性能優化性能優化的目的無非是減少用戶流量消耗,提升用戶首屏體驗,提升用戶訪問速度,讓用戶專注內容本身。前端性能優化減少請求數量基本原理在瀏覽器與服務器進行通信時,主要是通過進行通信。 最近項目慢慢走上正軌,需求趨于平穩,這才想起需要對整站進行性能優化。經過一段時間的學習,結合現在項目的實際性能情況,發現確實有許多地方可以進行優化。于是就開始了我的前端性能優化之旅。以下...

    philadelphia 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<