天天看點

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

先看網站架構圖:

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

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

第一層:cdn

國内網絡分布主要南電信北聯通,造成跨地區通路延遲大問題,對于有一定通路量網站來說,增加cdn(内容分發網絡)層可有效改善此現象,也是網站加

速的最好選擇。cdn把網站頁面緩存到全國分布的節點上,使用者通路時從最近的機房擷取資料,這樣大大減少網絡通路的路徑。如果想自己搭建cdn,不建議這

麼做,因為什麼呢?其實說白了,就是什麼事别往運維上攔。cdn架構部署不複雜,影響效果的因素卻很多,後期管理維護也比較複雜,想達到預期的效果确非易

事,這是一個費力不讨好的活,最後老闆還是感覺是你能力不足。建議找專做cdn的公司,費用也不貴,有抗流量攻擊能力,效果也很好,運維也少很多事,何樂

而不為呢!

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

第三層:負載均衡

通路量較大的網站都會用到負載均衡,因為這是解決單台伺服器性能瓶頸的最好辦法。反向代理将請求轉發給負載均衡器,負載均衡器根據算法(輪訓、負載

情況選擇後端等)交給後端web服務處理,web服務處理完成後直接傳回資料給反向代理伺服器。負載均衡合理配置設定請求給後端多台web伺服器,減輕單台服

務器并發負載,并保證服務可用性。主流的負載均衡軟體有lvs、haproxy、nginx。

第四層:web服務

web服務是處理使用者請求的,web服務處理效率,直接影響到通路速度,為避免這層因素造成通路慢,應對其進行調優,讓web服務發揮到最佳狀态。常見的web服務有apache和nginx。

apache優化:

1).mod_deflate壓縮子產品

檢視是否加載:

# apachectl m |grep deflate

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

# /usr/local/apache/bin/apxs c i a apache源碼目錄/modules/mod_deflate.c

deflate配置參數:

deflatecompressionlevel6      #壓縮等級(1-9),數值越大效率越高,消耗cpu也就越高 

setoutputfilterdeflate      #啟用壓縮 

addoutputfilterbytypedeflate text/html text/plain text/xml #壓縮類型 

addoutputfilterbytypedeflate css js html htm xml php 

2).mod_expires緩存子產品

# apachectl m |grep expires

# /usr/local/apache/bin/apxs c i a apache源碼目錄/modules/mod_expires.c

再在httpd.conf啟用子產品:loadmodule expires_module modules/mod_expires.so

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

全局配置,在配置檔案末尾添加:

expiresactiveon       #啟用有效期控制,會自動清除已過期的緩存,然後從伺服器擷取新的

expiresdefault "accessplus 1 days"       #預設任意格式的文檔都是1天後過期

expiresbytypetext/html "access plus 12 months" 

expiresbytypeimage/jpg "access plus 12 months"   #jpg格式圖檔緩存12月

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

apache有兩種常見工作模式,worker和prefork,預設是worker,是混合型的mpm(多路處理子產品),支援多程序和多線程,由

線程來處理請求,是以可以處理更多請求,提高并發能力,系統資源開銷也小于基于程序的mpm,由于線程使用程序記憶體空間,程序崩潰會導緻其下線程崩潰。而

prefork是非線程型mpm,程序占用系統資源也比worker多,由于程序處理連接配接,在工作效率上也比worker更穩定。可通過apache2

l檢視目前工作模式,在編譯時使用—with-mpm參數指定工作模式。根據自己業務需求選擇不同工作模式,再适當增加工作模式相關參數,可提高處理能

力。

配置參數說明:

startservers      8   #預設啟動8個httpd程序 

minspareservers    5    #最小的空閑程序數 

maxspareservers    20   #最大的空閑程序數,如果大于這個值,apache會自動kill一些程序 

serverlimit      256   #伺服器允許程序數的上限 

maxclients       256  #同時最多發起多少個通路,超過則進入隊列等待 

maxrequestsperchild  4000  #每個程序啟動的最大線程 

nginx優化:

1).gzip壓縮子產品

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緩存子產品

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進行适當的參數優化。

    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配置參數: 

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本地緩存子產品

        …… 

   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等。

第六層:資料庫緩存

利用緩存技術,把熱資料緩存到記憶體中,如果請求的資料在緩存中,就直接傳回,否則去資料庫中取,并更新把拿的資料更新到緩存系統,提高讀性能,降低

資料庫壓力。緩存實作有本地緩存和分布式緩存,本地緩存是将資料緩存到本地伺服器記憶體中或者檔案中。分布式緩存是将資料緩存到記憶體中,是分布式的,可以緩

存海量資料,擴充性好。主流的分布式緩存系統有memcached和redis,memcached性能穩定,速度很快,qps可達8w左右。如果想資料

持久化就選擇用redis,性能不低于memcached。

第七層:資料庫

核心思路:減少請求層,盡可能讓前端層傳回使用者請求的資料,減少後端伺服器通路頻率,最重要是資料庫層。

來源:51cto