大型網站架構提速關鍵技術(頁面靜態化、memcached、Mysql優化)
原文地址:https://blog.csdn.net/phpfenghuo/article/details/20834211
大型網站關鍵技術介紹
1. pv值(page views),訪問量大
帶來問題
a. 流量大 10000000*2m ->解決方案 買頻寬 ,優化程式(處理圖片)
b. 併發量,同時訪問網站的人多.,解決方案
對程式的架構重新設計.->伺服器叢集 示意圖:
1. 資料量大->10億記錄
解決方法是
a. 表的設計合理
b. 分表技術(垂直分割,水平分割) c. 建立索引 d. 讀寫分離 e. mysql配置優化(調整最大併發量,定時對資料庫碎片整理,備份 crontab) f.硬體升級)
c. 頁面靜態化
d. 快取技術(memcached)
頁面靜態化
簡單解釋一下頁面靜態化:
看幾個概念,然後寫程式碼:
靜態網址: 比如 http://localhost/abc.html 即,如果我們訪問的頁面是靜態頁面,我們把這個url稱為靜態網站.
特點: 1. 利用seo (search engine optimization) 搜尋引擎優化2. 訪問速度快 3. 防止sql注入
http://localhost/index.php?u=xx&p=/*11288 */
如果我們寫程式 loginCheck.php
-
<?php
-
$id=$_GET[‘id’];
-
$pwd=$_GET[‘pwd’];
-
$sql=”select pwd from users where id=$id”;
-
$res=mysql_query($sql);
-
if($pwd= = =從資料庫中取出的密碼){
-
//說明該使用者存在
-
}
else{
-
//說明使用者密碼錯誤!
-
}
動態網址 :比如 http://localhost/news.php?id=112 , 即,訪問的是一個PHP頁面,可以傳入引數.稱為動態網之.
特點: 1. 不利用SEO 2. 訪問速度慢 3. 有被注入sql可能
偽靜態網址 : 在實際開發中,我們希望達到這樣目的,把下面的網址
http://localhost/ news.php?lang=cn&class=sprot&id=2
修改成如下網址
http://localhost/news-cn-sport-id2.html
上面的網址,我們稱為偽靜態網址 :
特點: 1. 利用SEO 2. 防止注入 3. 他任然要訪問資料庫,速度沒有變化
頁面靜態化技術分類:
從方式看(1. 真靜態 2.偽靜態)
從範圍看(1.全域性靜態2. 區域性靜態化[ajax+jquery])
介紹一款測試壓力的工具 ab.exe 該工具程式是apache自帶的, 大家在工作中可以使用該工具來測試自己的網站併發量大小,和某個頁面的訪問時間
基本用法,進入到cmd 控制檯
ab.exe –n 訪問的總次數 –c 有多少人訪問(併發量) 訪問的頁面url
舉例說明:
ab.exe –n 10000 –c 100 http://locahost/test.php
當我們把 –c 調整到1000時,發現apache癱瘓. 給大家說下如何調整apache的最大併發量.
MPM (多路處理模組, 即 apache採用怎樣的方式來處理併發.), 主要有三種方式
1. perfork 預處理程序方式
2. worker 工作模式
3. winnt 這個一般說是windows採用的.
原理示意圖:
u 如何設定我們的apache的最大併發數 ,步驟如下:
(1) 在httpd.conf 檔案中 修改
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
(2) 確定當前的apahce是什麼MPM模式
進入到 apache/bin
httpd.exe –l
說明: 看 mpm_xxx.c 如果xxx是 winnt 說明是winnt ,另外還可能是 perfork 或者 worker
(1) 修改httpd-mpm.conf 檔案.
<IfModule mpm_winnt_module>
ThreadsPerChild 1000
MaxRequestsPerChild 0
</IfModule>
(2) 重啟apahce ,測試
因為在linux下,一般說採用的MPM是 perfork模式,我們看看如何配置.
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 #併發量
MaxRequestsPerChild 0 #一個程序對應的執行緒數,對 worker更用.
</IfModule>
給大家一個合理的建議配置. 對大部分網站,中型網站,配置:
<IfModule mpm_prefork_module>
StartServers 5 #預先啟動
MinSpareServers 5
MaxSpareServers 10 #最大空閒程序
ServerLimit 1500 #用於修改apache程式設計引數
MaxClients 1000 #最大併發數
MaxRequestsPerChild 0
</IfModule>
如果你的網站pv值 百萬
ServerLimit 2500 #用於修改apache程式設計引數
MaxClients 2000 #最大併發數
最後有一個關於html和php的訪問效率圖 :
分享一下頁面seo技巧:
如果一個圖片希望被百度到
<img alt=’小狗’ src=’’/>
在網站前臺,我們建議 不要使用frame框架,不利用seo
如果我們給圖片或者視訊取名字,儘量簡短.
頁面靜態化的技術實現有兩種方式
1. 使用PHP自己的快取機制
先說明一下OB快取的機制.
ob1.php 程式碼:說明的ob的各個用法->專案中
ob2.php 程式碼,說明了瀏覽器快取存在.
說明: 在php5.2這個版本 在php.ini有一個配置 output_buffering ,預設是關閉,如果是關閉,這剛才的程式碼就會警告.
☞ 如何開啟ob快取
① 配置php.ini 檔案 output_buffering = 4096
② 直接在程式中 ob_start();
1. 使用模板替換技術實現(正則表示式)
使用ob快取機制,完成一個簡單的新聞管理系統-頁面靜態化(目標是實現全站靜態化)
開發步驟:
(1) 做的頁面:
(1) 簡單的分析頁面
(2) 建立資料表
create table news(
id int unsigned primary key auto_increment, /*新聞id,做成自增*/
title varchar(128) not null default ‘’, /*標題*/
content varchar(256) not null default ‘’, /*新聞內容*/
filename varchar(32) not null default ‘’ /*將來這個新聞對應靜態頁面*/
) engine=MyISAM charset utf8
測試資料:
insert into news (title,content) values('hello1','北京你好');
insert into news (title,content) values('hello2','四川你好');
(3) 走碼
到此,我們已經實現了傳統的查詢任務,
分析程式碼後,我們發現問題是,因為新聞內容相對穩定,所以沒有必要每次都查詢。優化的思路是: 當第一人檢視某個新聞時,我們就生成一個對應的靜態頁面,當後面的人在檢視,直接返回該靜態頁面即可.
程式碼實現:
newsList.php 程式碼
showNews.php程式碼
再想想,上面的程式碼缺點是什麼?
cms(內容管理系統,新聞,軟體釋出, 文章管理) 內容就固定不變,我們不能接受.
解決方案:
1 我設一個超時,30s, 我們保證30內不去修改,超過30秒,就更新一把.
走碼:
2 上面的解決方案有時間延時,所以如果我們希望靜態化沒有時間延時,就應該使用模板提換技術來搞定.
思路: 圖.
程式碼實現:整理
newslist.php
addnews.html頁面
newsAction.php 頁面
思考題:
① 請大家完成更新新聞的這個頁面靜態處理
② 如何把newsList.php 也做成一個靜態頁面.->思想
任務是: 把新聞管理系統的首頁面也靜態化.
通用的CMS系統的示意圖:
對我們的新聞管理系統首頁靜態化
思考: 我們能不能再新增新聞後,就直接靜態化首頁面, 如果你的確希望只要首頁的內容有變化,就立即更新,最後的代理整理:
把所有的動態頁面,放入到manage資料夾:
manage.html
-
<html>
-
<head>
-
<meta http-equiv='content-type' content='text/html;charset=utf-8'/>
-
</head>
-
<h1>管理新聞
</h1>
-
<hr/>
-
<a href='addNews.html'>新增新聞
</a>|
-
<a href='newsList.php'>更新首頁
</a>|
-
<a href='xxx.php'>列出所有資訊
</a>
-
</html>
-
-
addNews.html
-
<head>
-
<title>新聞標題
</title>
-
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
-
</head>
-
-
<!--我們在新增新聞時,就同時生成一個對應的新聞頁面(比如你設計好的一個新聞內容顯示模板)-->
-
-
<form action="newsAction.php" method="post">
-
<table>
-
<tr>
<td>新聞標題
</td>
<td>
<input type="text" name="title"/>
</td>
</tr>
-
<tr>
<td>新聞內容
</td>
<td>
<textarea cols="50" rows="10" name="content">
</textarea>
</td>
</tr>
-
<tr>
<td>
<input type="submit" value="新增"/>
</td>
<td>
<input type="reset" value="重新填寫"/>
</td>
</tr>
-
<!--隱藏區-->
-
<input type='hidden' name='oper' value='add'/>
-
</table>
-
</form>
-
</html>
newsAction.php
-
<?php
-
-
//處理使用者的新增/更新/刪除...請求
-
//先獲取 oper值
-
$oper=$_POST[
'oper'];
-
if($oper===
'add'){
-
//接收使用者的新聞的各個資訊
-
$title=$_POST[
'title'];
-
$content=$_POST[
'content'];
-
//把新聞新增到資料庫
-
//這裡大家可以使用工具類完成.
-
$con=mysql_connect(
"localhost",
"root",
"root");
-
if(!$con){
-
die(
"連線失敗");
-
}
-
mysql_select_db(
"newssys",$con);
-
$sql=
"insert into news values(null,'$title','$content','')";
-
//echo $sql;
-
if(mysql_query($sql,$con)){
-
//生成靜態檔案.
-
$id=mysql_insert_id();
-
$html_filename=
'news-id'.$id.
'.html';
-
$html_fp=fopen(
"../".$html_filename,
'w');
-
//把模板檔案讀取.
-
$fp=fopen(
'news.tpl',
'r');
-
//迴圈讀取
-
//如果沒有讀到檔案的最後,就一直讀取
-
while(!feof($fp)){
-
//一行行讀.
-
$row=fgets($fp);
-
//把佔位符替換掉->小函式 myreplace
-
//問題?
-
$row=str_replace(
'%title%',$title,$row);
-
$row=str_replace(
'%content%',$content,$row);
-
fwrite($html_fp,$row);
-
}
-
//關閉檔案
-
fclose($html_fp);
-
fclose($fp);
-
echo
"恭喜你,新增成功<a href='manage.html'>管理新聞</a>";
-
//怎樣讓首頁面立即更新.
-
include
"newsList.php";
-
-
}
else{
-
die(
'新增失敗');
-
}
-
}
else
if($oper===
'update'){
-
-
}
else
if($oper===
'delete'){
-
-
}
newsList.php
-
<?php
-
//列出新聞列表
-
//這裡,我使用最簡單的方法來操作,沒有使用mvc模式
-
//這裡你們可以使用工具類完成. db.class.php
-
$con=mysql_connect(
"localhost",
"root",
"root");
-
if(!$con){
-
die(
"連線失敗");
-
}
-
mysql_select_db(
"newssys",$con);
-
$sql=
"select * from news";
-
$res=mysql_query($sql,$con);
-
ob_start();
-
echo
"<head><meta http-equiv='content-type' content='text/html;charset=utf-8' /></head>";
-
echo
"<h1>新聞列表</h1>";
-
echo
"<table>";
-
echo
"<tr><td>id</td><td>標題</td><td>檢視詳情</td><td>修改新聞</td></tr>";
-
//迴圈的取出新聞列表
-
while($row=mysql_fetch_assoc($res)){
-
echo
'<tr><td>'.$row[
'id'].
'</td><td>'.$row[
'title'].
'</td><td><a href="news-id'.$row[
'id'].
'.html">檢視詳情</a></td><td><a href="#">修改頁面</a></td></tr>';
-
}
-
echo
"</table>";
-
$str_ob=ob_get_contents();
-
file_put_contents(
'../index.html',$str_ob);
-
//這裡關閉資源.
-
//清空ob
-
ob_clean();
-
echo
"恭喜你,首頁面更新成功<a href='../index.html'>點選檢視最新新聞列表</a>";
-
-
mysql_free_result($res);
-
mysql_close($con);
-
完畢,大家可以進一步深入的完成修改和刪除.
真靜態的優缺點分析
優點: 1. 利用SEO 2. 訪問速度快. 3. 防止sql注入
缺點: 1. 因為真靜態會生成大量的html檔案,佔用磁碟空間, 如果你把所有的靜態頁,都放在同一資料夾,尋找檔案的速度隨著檔案的增多,速度變慢,因此可以考慮建立子資料夾來放.
在以下情況不建議使用真靜態:
1.實時性要求高的網站或者頁面.(股票、基金)
2.資料量大,同時查詢一次後,以後很少查詢(國家學歷認證網,電信話費查詢系統.)
3.不願意被seo到的頁面或者網站
偽靜態技術
在我們實際開發中,有需要,不希望使用真靜態., 但是有希望利於SEO,可以考慮使用偽靜態.
http://localhost/news.php?type=music&id=100
我們希望這個地址可以用下面的訪問url來替換
http://localhost/news-music-id100.html
上面的問題可以使用偽靜態
1. 實現方式有 直接使用正則表示式來完成
2. 使用apache自帶的rewrite機制來完成
看需求:
http://localhost/content.php/1,122,8912.html
我希望上面的地址
http://localhost/content.php?a=1&b=122&c=8912
實現思路:
1. 我們可以使用str 函式,來進行分割處理->可行,但是不夠靈活
2. 使用正則來處理
程式碼是:
-
$path_info=$_SERVER['PATH_INFO'];
-
$reg=
'/(\d+),(\d+),(\d+)\.html$/i';
-
-
preg_match($reg,$path_info,$res);
-
-
echo
"<pre>";
-
print_r($res);
-
echo
"</pre>";
在實際開發中,我們實現偽靜態,用的更多的還是rewrite 機制,但是他任然是以正則技術為基礎的.
我們看看如何實現:
說明:
比如 http://www.hsp.com/news.php?type=music&id=100
希望上面的url 變成
http://www.hsp.comt/news-music-id100.html
原理圖
步驟開始:
(1) 啟用rewrite模組,在預設情況下,沒有啟用
修改httpd.conf檔案
#啟動rewrite模組
LoadModule rewrite_module modules/mod_rewrite.so
確認是否啟動成功
<?php phpinfo();?>
(2) 配置我們的虛擬主機
httpd.conf 開啟虛擬主機的配置檔案
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
修改 httpd-vhost.conf
-
<span style=
"font-family:SimSun;font-size:14px;">
<VirtualHost *:80>
-
DocumentRoot "C:/myenv/apache/htdocs/static2"
-
#Directory配置節點,用於指定該目錄下的檔案或是圖片.的訪問許可權
-
#設定虛擬主機的錯誤頁面,歡迎頁面
-
<Directory "C:/myenv/apache/htdocs/static2">
-
</
相關推薦
大型網站架構提速關鍵技術(頁面靜態化、memcached、Mysql優化)
原文地址:https://blog.csdn.net/phpfenghuo/article/details/20834211
大型網站關鍵技術介紹
1. pv值(page views),訪問量大
帶來問題
a. 流量大 10
大型網站架構技術一覽
定時執行 挖掘 cnblogs soa 動態頁面 服務架構 調用 技術分享 人際關系
大型網站架構技術一覽
網站系統架構層次如下圖所示:
1、 前端架構
前端指用戶請求到達網站應用服務器之前經歷的環節,通常不包含網站業務邏輯,不處理動態內容。
(1
大型網站架構系列:20本技術書籍推薦
架構模式 單機 部分 電子商務平臺 包括 定性 邏輯 net 初學
學習是技術人員成長的基礎,本次分享20本技術方面的書籍,這些書不是每一本都是經典,但是每一本都有其特點。以下20本大部分本人都看過,因此推薦給大家。(本次推薦的20本只是一個參考,比如像Head Firs
《大型網站技術架構》讀書筆記一:大型網站架構演化
硬件 解決方案 更新 獨立 流量 操作 大型網站技術架構 負責 思維導圖 一、大型網站系統特點
(1)高並發、大流量:PV量巨大
(2)高可用:7*24小時不間斷服務
(3)海量數據:文件數目分分鐘xxTB
(4)用戶分布廣泛,網絡情況復雜:網絡運營
大型網站架構系列:20本技術書籍推薦(轉)
學習是技術人員成長的基礎,本次分享20本技術方面的書籍,這些書不是每一本都是經典,但是每一本都有其特點。以下20本大部分本人都看過,因此推薦給大家。(本次推薦的20本只是一個參考,比如像Head First,Java程式設計思想等經典書籍是大家都知道,因此不在推薦之列)
本次分享大綱
大型網站架構系
《大型網站架構技術》系列分享專欄
在這裡整理一些大型網站架構方面的技術文章,包括大型網站儲存,架構,靜態化處理,高併發,高效能方面的問題處理,解決方案等知識
《大型網站架構技術》已整理成PDF文件,點選可直接下載至本地查閱 https://www.webfalse.com/read/201727.html
文章
架構師---(大型網站技術架構核心原理與案例分析)1大型網站架構演化
參考資料大型網站技術架構核心原理與案例分析(作者李智慧)
感悟:書讀百遍,其意自見
QQ群北京it—推薦–交流:300458205
群專注內推、大資料、雲端計算、Java、Android、UI等技術交流,歡迎你的加入。
1初始階段的網站架構
小型網站起初訪問量不是很高,只
《大型網站技術架構》——第一章 大型網站架構演化
初始階段的網站架構
應用程式、資料庫、檔案等所有等資源都在一臺伺服器上。
應用服務和資料服務分離
三臺伺服器:應用伺服器、檔案伺服器和資料庫伺服器。 三臺伺服器對硬體資源對要求各不相同:
應用伺服器需要處理大量的業務邏輯,因此需要更快更強大的CPU
檔案伺服器需
大型網站技術架構(一)--大型網站架構演化
看完了有一本書,就應該有所收穫,有所總結,最近把《大型網站技術架構》一書給看完了,給人的印象實在深刻,再加上之前也搞過書本上講的反向代理和負載均衡以及session獨立儲存和快取,因此書本看起來還是挺通俗易懂的,而且作者李智慧給人的印象(書本)也挺深刻的,
大型網站架構的技術演進
網站初期架構
幾乎所有的大型網站都是從小型網站發展而來的,網站架構也一樣,是從小型網站技術架構逐步演化而來的。小型網站最開始沒有太多訪問量,可能只需要一臺伺服器就能夠應付了,這時的網站架構如下圖所示。
即將應用程式、資料庫、檔案等所有的資源都在同一臺伺服器上。很多
大型網站架構系列:必看20本技術書籍推薦
《喜歡點個贊吧》
希望大家也可以在這裡交流其中比如某個階段什麼書可以替代這本,比這本更好,希望您留言進行交流!!!切記!!!
大型網站架構系列:20本技術書籍推薦
學習是技術人員成長的基礎,本次分享20本技術方面的書籍,這些書不是每一本都是經典,但是每
大型網站架構:推薦20本技術書籍
一、大型網站架構系列
第一本:《大型網站技術架構:核心原理與案例分析》
這是本算是國內大型網站架構的經典之作,由阿里人李智慧創作,聽名字就知道本書很有智慧。主要從大型網站架構的特點,架構目標(高效能,高可用,可伸縮等)基本理論講起,並介紹了幾個很有特色的案例
通用大型網站頁面靜態化解決方案
最近自己做了一個做網路廣告的網站叫全方位商機平臺的專案,由於網站首頁上板塊劃分很多,不同板塊的資料庫查詢方式不同,首頁內容量巨大,如果按照一般的動態jsp頁面的話那麼資料庫查詢將是巨大的開銷,會導致首頁訪問速度的下降。於是考慮將這個首頁全部靜態化。
整個網站才用struts2 + spring +
大型網站技術架構讀書筆記02—大型網站架構模式
模式描述了一個在我們周圍不斷重複發生的問題以及該問題解決方案的核心。
為了解決大型網站面臨的高訪問高併發、海量資料、高可靠執行等一系問題和挑戰,大型網際網路公司在實踐中提出了許多解決方案,並且被其他公司廣泛的利用。今天就帶大家瞭解瞭解這些模式。
1.分層
分層是企業中最常見
(轉載) 中大型網站架構演變之路
分布式文件系統 客戶端 應用層 七層 並發 mysql keepal 接口 mysql主從
標簽:網站架構 大型網站架構
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://lizhenliang
大型網站架構系列:電商網站架構案例(2)
嚴重 團隊 nbsp 很好 劃分 電商網站 架構圖 用戶 可能 電網網站架構案例系列的第二篇文章。主要講解網站架構分析,網站架構優化,業務拆分,應用集群架構,多級緩存,分布式Session。
五、網站架構分析
根據以上預估,有幾個問題:
需要部署大量的服務器,高峰期計算,
大型網站架構系列:負載均衡詳解(3)
lte 子進程 變化 rewrite acc smtp alived 傳輸 操作 本次分享大綱
軟件負載均衡概述
Ngnix負載均衡
Lvs負載均衡
Haproxy負載均衡
本次分享總結
一、軟件負載均衡概述
硬件負載均衡性能優越,功能全面,但是價格昂貴,一般適合初期或
大型網站架構之分布式消息隊列(轉)
工作經驗 大型網站 異步處理 消費 min 實現 通知 ima 可能 以下是消息隊列以下的大綱,本文主要介紹消息隊列概述,消息隊列應用場景和消息中間件示例(電商,日誌系統)。
本次分享大綱
消息隊列概述
消息隊列應用場景
消息中間件示例
JMS消息服務
常用
大型網站架構之分布式消息隊列
並且 other splay 2016年 均衡 tails lin 庫存 寫入 大型網站架構之分布式消息隊列 轉載
Freemarker頁面靜態化技術
view color 分享圖片 doctype nbsp fig ces 取數據 doc 初步理解:
架構優化:
靜態頁面的訪問速度優於從緩存獲取數據的動態頁面的訪問速度;
Freemarker:
導包
模板:hello.ftl
1 <!DOCTYPE