中小型網站架構分析及優化

来源:https://www.cnblogs.com/xdclass/archive/2018/08/08/9442901.html
-Advertisement-
Play Games

先看網站架構圖: 以上網站架構廣泛運用中大型網站中,本文從架構每一層分析所用主流技術和解決手段,有助於初入網站運維朋友們,進一步對網站架構認識,從而自己形成一套架構概念。 第一層:CDN 國內網路分佈主要南電信北聯通,造成跨地區訪問延遲大問題,對於有一定訪問量網站來說,增加CDN(內容分髮網絡)層可 ...


先看網站架構圖:

wKiom1WKdbGgXLOGAAHVOEBTyTg628.jpg

以上網站架構廣泛運用中大型網站中,本文從架構每一層分析所用主流技術和解決手段,有助於初入網站運維朋友們,進一步對網站架構認識,從而自己形成一套架構概念。

第一層:CDN

  國內網路分佈主要南電信北聯通,造成跨地區訪問延遲大問題,對於有一定訪問量網站來說,增加CDN(內容分髮網絡)層可有效改善此現象,也是網站加速的最好選擇。CDN把網站頁面緩存到全國分佈的節點上,用戶訪問時從最近的機房獲取數據,這樣大大減少網路訪問的路徑。如果想自己搭建CDN,不建議這麼做,因為什麼呢?其實說白了,就是什麼事別往運維上攔。CDN架構部署不複雜,影響效果的因素卻很多,後期管理維護也比較複雜,想達到預期的效果確非易事,這是一個費力不討好的活,最後老闆還是感覺是你能力不足。建議找專做CDN的公司,費用也不貴,有抗流量***能力,效果也很好,運維也少很多事,何樂而不為呢!

第二層:反向代理(網頁緩存)

  如果CDN沒有緩存要請求的數據則向這層發起請求,在代理伺服器配置緩存功能(本地),代理伺服器就查找本地緩存是否有CDN請求的數據,如果有就直接返回給CDN,如果沒有則請求後端負載均衡器然後轉發給WEB伺服器返回數據給代理伺服器,代理伺服器再將結果給CDN。代理伺服器一般緩存不經常變動的靜態頁面,如image、js、css、html等,主流的緩存軟體有Squid、Varnish、Nginx。

第三層:負載均衡

  訪問量較大的網站都會用到負載均衡,因為這是解決單台伺服器性能瓶頸的最好辦法。反向代理將請求轉發給負載均衡器,負載均衡器根據演算法(輪訓、負載情況選擇後端等)交給後端WEB服務處理,WEB服務處理完成後直接返回數據給反向代理伺服器。負載均衡合理分配請求給後端多台WEB伺服器,減輕單台伺服器併發負載,並保證服務可用性。主流的負載均衡軟體有LVS、HAProxy、Nginx。

第四層:WEB服務

  WEB服務是處理用戶請求的,WEB服務處理效率,直接影響到訪問速度,為避免這層因素造成訪問慢,應對其進行調優,讓WEB服務發揮到最佳狀態。常見的WEB服務有Apache和Nginx。

Apache優化:

1).mod_deflate壓縮模塊

查看是否載入:

1 # apachectl –M |grep deflate

如果沒有安裝使用apxs編譯進去:

1 # /usr/local/apache/bin/apxs –c –I –A apache源碼目錄/modules/mod_deflate.c

deflate配置參數:

1 2 3 4 5 6 <IfModulemod_deflate.c> DeflateCompressionLevel6      #壓縮等級(1-9),數值越大效率越高,消耗CPU也就越高 SetOutputFilterDEFLATE      #啟用壓縮 AddOutputFilterByTypeDEFLATE text/html text/plain text/xml #壓縮類型 AddOutputFilterByTypeDEFLATE css js html htm xml php   </IfModule>

2).mod_expires緩存模塊

查看是否載入:

1 # apachectl –M |grep expires

如果沒有安裝使用apxs編譯進去:

1 # /usr/local/apache/bin/apxs –c –I –A apache源碼目錄/modules/mod_expires.c

再在httpd.conf啟用模塊:LoadModule expires_module modules/mod_expires.so 

緩存機制有三種用法:全局、目錄和虛擬主機

全局配置,在配置文件末尾添加:

1 2 3 4 5 6 <IfModulemod_expires.c> ExpiresActiveon       #啟用有效期控制,會自動清除已過期的緩存,然後從伺服器獲取新的 ExpiresDefault "accessplus 1 days"       #預設任意格式的文檔都是1天後過期 ExpiresByTypetext/html "access plus 12 months"   ExpiresByTypeimage/jpg "access plus 12 months"   #jpg格式圖片緩存12月 </IfModule>

3).工作模式選擇及優化

 apache有兩種常見工作模式,worker和prefork,預設是worker,是混合型的MPM(多路處理模塊),支持多進程和多線程,由線程來處理請求,所以可以處理更多請求,提高併發能力,系統資源開銷也小於基於進程的MPM,由於線程使用進程記憶體空間,進程崩潰會導致其下線程崩潰。而prefork是非線程型MPM,進程占用系統資源也比worker多,由於進程處理連接,在工作效率上也比worker更穩定。可通過apache2 –l查看當前工作模式,在編譯時使用—with-mpm參數指定工作模式。根據自己業務需求選擇不同工作模式,再適當增加工作模式相關參數,可提高處理能力。

配置參數說明:

1 2 3 4 5 6 7 8 <IfModuleprefork.c> StartServers      8   #預設啟動8個httpd進程 MinSpareServers    5    #最小的空閑進程數 MaxSpareServers    20   #最大的空閑進程數,如果大於這個值,apache會自動kill一些進程 ServerLimit      256   #伺服器允許進程數的上限 MaxClients       256  #同時最多發起多少個訪問,超過則進入隊列等待 MaxRequestsPerChild  4000  #每個進程啟動的最大線程 </IfModule>

Nginx優化:

1).gzip壓縮模塊

1 2 3 4 5 6 7 8 9 10 http {     ……     gzip on;     gzip_min_length 1k;   #允許壓縮的頁面最小位元組數,預設是0,多大都壓縮,小於1k的可能適得其反     gzip_buffers 4 16k;   #gzip申請記憶體的大小,按數據大小的4倍去申請記憶體     gzip_http_version 1.0;  #識別http協議版本     gzip_comp_level 2;    #壓縮級別,1壓縮比最小,處理速度最快,9壓縮比最大,處理速度最慢     gzip_types text/plainapplication/x-javascripttext/css application/xml image/jpg;  #壓縮數據類型     gzip_vary on;      #根據客戶端的http頭來判斷,是否需要壓縮 }

2).expires緩存模塊

1 2 3 4 5 6 7 8 9 10 server {     location ~ .*\.(gif|jpg|png|bmp|swf)$   #緩存數據尾碼類型     {       expires 30d;   #使用expires緩存模塊,緩存到客戶端30天     }     location ~ .*\.( jsp|js|css)?$     {       expires 1d;     } }

3).fastcgi優化

nginx不支持直接調用或者解析動態程式(php),必須通過fastcgi(通用網關介面)來啟動php-fpm進程來解析php腳本。也就是說用戶請求先到nginx,nginx再將動態解析交給fastcgi,fastcgi啟動php-fpm解析php腳本。所以我們有必要對fastcgi和php-fpm進行適當的參數優化。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 http {     ……     fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;       # FastCGI緩存指定一個文件路徑、目錄結構等級、關鍵字區域存儲時間和非活動刪除時間     fastcgi_connect_timeout 300;    #指定連接到後端FastCGI的超時時間     fastcgi_send_timeout 300;     #指定向FastCGI傳送請求的超時時間     fastcgi_read_timeout 300;     #指定接收FastCGI應答的超時時間     fastcgi_buffer_size 64k;      #指定讀取FastCGI應答第一部分需要多大的緩衝區     fastcgi_buffers 4 64k;      #指定本地需要用多少盒多大的緩衝區來緩衝FastCGI的應答請求     fastcgi_busy_buffers_size 128k;        fastcgi_temp_file_write_size 128k;  #表示在寫入緩存文件時使用多大的數據塊,預設值是fastcgi_buffers的兩倍     fastcgi_cache TEST;          #開啟fastcgi_cache緩存並指定一個TEST名稱     fastcgi_cache_valid 200 302 1h;   #指定200、302應答代碼的緩存1小時     fastcgi_cache_valid 301 1d;     #將301應答代碼緩存1天     fastcgi_cache_valid any 1m;     #將其他應答均緩存1分鐘 {

php-fpm.conf配置參數:

1 2 3 4 5 pm =dynamic        #兩種控制子進程方式(static和dynamic) pm.max_children= 5     #同一時間存活的最大子進程數 pm.start_servers= 2    #啟動時創建的進程數 pm.min_spare_servers= 1  #最小php-fpm進程數 pm.max_spare_servers= 3  #最大php-fpm進程數

4).proxy_cache本地緩存模塊

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 http {         ……    proxy_temp_path  /usr/local/nginx/proxy_cache/temp;    #緩存臨時目錄    proxy_cache_path /usr/local/nginx/proxy_cache/cache levels=1:2 keys_zone=one:10m inactive=1d max_size=1g;    #緩存文件實際目錄,levels定義層級目錄,1:2說明1是一級目錄,2是二級目錄,keys_zone存儲元數據,並分配10M記憶體空間。inctive表示1天沒有被訪問的緩存就刪除,預設10分鐘。max_size是最大分配磁碟空間    server {       listen 80;       server_name 192.168.1.10;       location / {         proxy_cache one;   #調用緩存區         #proxy_cache_valid 200 304 12h; #可根據HTTP狀態碼設置不同的緩存時間         proxy_cache_valid any  10m;    #緩存有效期為10分鐘       }       #清除URL緩存,允許來自哪個網段的IP可以清除緩存(需要安裝第三方模塊"ngx_cache_purge"),清除URL緩存方法:訪問http://192.168.1.10/purge/文件名       location ~ /purge(/.*){         allow 127.0.0.1;         allow 192.168.1.0/24;         deny all;         proxy_cache_purge cache_one$host$1$is_args$args;       }  }

小結:

  啟用壓縮模塊可以節省一部分帶寬,會增加WEB端CPU處理,但在上圖網站架構中,WEB端啟用壓縮模塊並沒有起到作用,因為傳輸到上層走的是區域網。對於直接面向用戶的架構還是要啟用的。WEB也不用啟用expires模塊,因為有了反向代理伺服器和CDN,所以到不了用戶瀏覽器,開啟起不到作用。

  如果反向代理使用nginx做代理,可開啟expires模塊,將靜態文件緩存到用戶瀏覽器,瀏覽器發起請求時,先判斷本地緩存是否有請求的數據,如果有再判斷是否過期,如果不過期就直接瀏覽緩存數據,哪怕伺服器資源已經改變,所以要根據業務情況合理設置過期時間。
5. 利用PHP緩存器提高代碼執行效率

 php程式在沒有使用緩存器情況下,每次請求php頁面,php都會對此頁面進行代碼編譯,這就意味著重覆的編譯工作會增加伺服器負載。有了緩存器就會把每次編譯後的數據緩存到共用記憶體中,下次訪問直接使用緩衝區已編譯好的代碼,從而避免重覆的編譯過程,以加快其執行效率。因此PHP網站使用緩存器是完全有必要的!主流的PHP緩存器有:eAccelerator、XCache

第五層:動靜分離

  動靜分離,顧名思義,是將動態頁面和靜態頁面分離到不同伺服器上處理,比如使用web是nginx,可以讓fastcgi部署到單獨一臺伺服器,專門解析php動態頁面,靜態頁面預設由nginx處理,並做好緩存策略。再比如一個商城網站,會有大量的圖片,可以考慮增加文件伺服器組,將請求圖片和上傳圖片的都交給文件伺服器處理。文件伺服器主流使用NFS,存在單點故障,可以DRBD+HeartBeat+NFS部署高可用,如果單台壓力過大,考慮使用分散式文件系統,如GlusterFS、MooseFS等。

DRBD+HeartBeat+NFS博文:http://lizhenliang.blog.51cto.com/7876557/1362539

第六層:資料庫緩存

  利用緩存技術,把熱數據緩存到記憶體中,如果請求的數據在緩存中,就直接返回,否則去資料庫中取,並更新把拿的數據更新到緩存系統,提高讀性能,降低資料庫壓力。緩存實現有本地緩存和分散式緩存,本地緩存是將數據緩存到本地伺服器記憶體中或者文件中。分散式緩存是將數據緩存到記憶體中,是分散式的,可以緩存海量數據,擴展性好。主流的分散式緩存系統有Memcached和Redis,Memcached性能穩定,速度很快,QPS可達8w左右。如果想數據持久化就選擇用Redis,性能不低於Memcached。

第七層:資料庫

  這層在整個網站架構中起著主導型作用,直接決定用戶體驗,相對架構優化也比較複雜,具體請參考博文:http://lizhenliang.blog.51cto.com/7876557/1657465

 

核心思路:減少請求層,儘可能讓前端層返回用戶請求的數據,減少後端伺服器訪問頻率,最重要是資料庫層。

 

轉載出處:http://blog.51cto.com/lizhenliang/1664428

版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝。

 

小編積累多年的乾貨文檔免費贈送,包含前端後端和測試,系統架構,高併發處理,優化等

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、背景:朋友請幫忙做一個比賽排程軟體 2、需求: ① 比賽人數未知,可以通過文本文件讀取參賽人員名稱; ② 對參賽人員隨機分組,一組兩人,兩兩PK,如果是奇數人數,某一個參賽人員成為幸運兒自動晉級; ③ 比賽線下進行,比賽結束後,可以線上選擇每組中晉級人員; ④ 晉級人員進行下一輪比賽分組,依此類 ...
  • 原型鏈 繼承 1 構造函數 2 原型鏈 3 組合繼承 把公共數據放在Parent中,這樣的話就不會公用一個引用類型 4 優化組合繼承 判斷原型和實例的關係 ...
  • MAIN結構 //// <%@ Master Language="C#" AutoEventWireup="true" CodeFile="Main.master.cs" Inherits="Main" %> <!DOCTYPE html><html xmlns="http://www.w3.org ...
  • 當父組件引用了子組件的時候,會遇到父組件執行子組件的方法,比如下拉刷新上拉載入等事件只有在頁面中才能檢測到,但是獲取數據的方法在子組件,這時就可以執行子組件方法。 思路很簡單,類似於vue中給子組件加ref執行子組件方法道理一樣,這裡是給子組件加一個 屬性: id="子組件名稱",比如: 然後在父組 ...
  • 引言 最近在學習node.js 連接redis的模塊,所以嘗試了一下在虛擬機中安裝cent OS7,並安裝redis,並使用node.js 操作redis。所以順便做個筆記。 如有不對的地方,歡迎大家指正! 1、cent OS7 下使用redis 1.1、配置編譯環境: 1.2、下載源碼: 1.3、 ...
  • 這一節內容超級簡單,純JS,就當給自己放個假了,V8引擎和node的C++代碼看得有點腦闊疼。 學過DOM的應該都知道一個API,叫addeventlistener,即事件綁定。這個東西貫穿了整個JS的學習過程,無論是剛開始的自己獲取DOM手動綁,還是後期vue的直接@click,所有的交互都離不開 ...
  • 一.顯式類型轉換 1.Number(mix) 把其他類型的數據轉換成數字類型的數據 2.parseInt(string,radix) 將字元串轉換成整型類型數字(不四捨五入)(截斷數字) 當參數string裡面既包括數字字元串又包括其他字元串的時候,它會將看到其他字元串就停止了,不會繼續轉換後面的數 ...
  • 問題 如圖一個表單: 在部分android機型上測試點擊靠下的輸入框時遇到彈出的軟鍵盤擋住輸入框問題,ios可自身彈起(ios自身的調整偶爾也會出問題,例如第三方鍵盤會遮擋,原因是第三方輸入法的tool bar或者鍵盤也被當做可視區域,這裡不做討論) 問題分析及解決辦法確立 最常見的是使用兩個方法: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...