利用squid反向代理提高網站性能

本文在介紹 squid 反向代理的工作原理的基礎上,指出反向代理技術在提高網站訪問速度,增強網站可用性、安全性方面有很好的用途。作者在具體的實驗環境下,利用 DNS 輪詢和 Squid 反向代理技術,實現了網站的負載均衡,從而提高了網站的可用性和可靠性。

現在有許多大型的門戶網站如 SINA 都採用 squid 反向代理技術來加速網站的訪問速度,可將不同的 URL 請求分發到後臺不同的 WEB 服務器上,同時互聯網用戶只能看到反向代理服務器的地址,加強了網站的訪問安全。

反向代理的概念

反向代理服務器又稱爲 WEB 加速服務器,它位於 WEB 服務器的前端,充當 WEB 服

務器的內容緩存器。其系統結構如圖 1


圖 1. 系統結構
 


 
 

反向代理服務器是針對 WEB 服務器設置的,後臺 WEB 服務器對互聯網用戶是透明的,用戶只能看到反向代理服務器的地址,不清楚後臺 WEB 服務器是如何組織架構的。當互聯網用戶請求 WEB 服務時,DNS 將請求的域名解析爲反向代理服務器的 IP 地址,這樣 URL 請求將被髮送到反向代理服務器,由反向代理服務器負責處理用戶的請求與應答、與後臺 WEB 服務器交互。利用反向代理服務器減輕了後臺 WEB 服務器的負載,提高了訪問速度,同時避免了因用戶直接與 WEB 服務器通信帶來的安全隱患。


Squid 反向代理的實現原理

目前有許多反向代理軟件,比較有名的有 Nginx 和 Squid 。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。

Squid 是由美國政府大力資助的一項研究計劃,其目的爲解決網絡帶寬不足的問題,支持HTTP,HTTPS,FTP 等多種協議,是現在 Unix 系統上使用、最多功能也最完整的一套軟體。下面將重點介紹 Squid 反向代理的實現原理和在提高網站性能方面的應用。

Squid反向代理服務器位於本地 WEB 服務器和 Internet 之間 , 組織架構如圖 2:


圖 2. 組織架構
 


 
 

客戶端請求訪問 WEB 服務時,DNS 將訪問的域名解析爲 Squid 反向代理服務器的 IP 地址,這樣客戶端的 URL 請求將被髮送到反向代理服務器。如果 Squid 反向代理服務器中緩存了該請求的資源,則將該請求的資源直接返回給客戶端,否則反向代理服務器將向後臺的 WEB 服務器請求資源,然後將請求的應答返回給客戶端,同時也將該應答緩存在本地,供下一個請求者使用。

Squid 反向代理一般只緩存可緩衝的數據(比如 html 網頁和圖片等),而一些 CGI 腳本程序或者 ASP、JSP 之類的動態程序默認不緩存。它根據從 WEB 服務器返回的 HTTP 頭標記來緩衝靜態頁面。有四個最重要 HTTP 頭標記:

  • Last-Modified: 告訴反向代理頁面什麼時間被修改
  • Expires: 告訴反向代理頁面什麼時間應該從緩衝區中刪除
  • Cache-Control: 告訴反向代理頁面是否應該被緩衝
  • Pragma: 用來包含實現特定的指令,最常用的是 Pragma:no-cache

利用 Squid 反向代理加速網站實例

本實例的域名是 wenjin.cache.ibm.com.cn,通過DNS的輪詢技術,將客戶端的請求分發給其中一臺 Squid 反向代理服務器處理,如果這臺 Squid 緩存了用戶的請求資源,則將請求的資源直接返回給用戶,否則這臺 Squid 將沒有緩存的請求根據配置的規則發送給鄰居 Squid 和後臺的 WEB 服務器處理,這樣既減輕後臺 WEB 服務器的負載,又提高整個網站的性能和安全性。該系統結構圖 3 如下:


圖 3. 系統結構
 


 
 

配置的系統環境:

  • 一臺 DNS 服務器:操作系統 Freebsd,軟件 BIND 9.5,IP 192.168.76.222 ;
  • 三臺 Squid 服務器:操作系統 Linux AS 4,軟件 Squid 3.0,相應的 IP 如下:

Squid1:192.168.76.223 
 Squid2:192.168.76.224 
 Squid3:192.168.76.225

 
  • 三臺 WEB 服務器:操作系統 Linux AS 4,應用軟件 Tomcat 5.0+Mysql,相應的 IP 地址如下:

webServer1:210.82.118.195 
 webServer2:192.168.76.226 
 webServer1:192.168.76.227

 

應用軟件的安裝和配置

配置 DNS 服務器

軟件利用 Freebsd 自帶的 bind 9.5 。然後針對該系統配置 bind,首先修改 bind 的配置文件 /etc/namedb/named.conf,在文件中添加

zone "cache.ibm.com.cn"{ 
        type master; 
        file "master/ cache.ibm.com.cn "; 
 };

 

再在 /etc/namedb/master 目錄下添加 cache.ibm.com.cn 文件,該文件的內容如下:

$TTL    3600 
 @       IN      SOA     search. ibm.com.cn. root. ibm.com.cn.  ( 
                                20080807        ; Serial 
                                3600    ; Refresh 
                                900     ; Retry 
                                3600000 ; Expire 
                                3600 )  ; Minimum 
        IN      NS      search.ibm.com.cn. 
 1       IN      PTR     localhost.ibm.com.cn. 
 wenjin  IN      A       192.168.76.223 
 wenjin  IN      A       192.168.76.224 
 wenjin  IN      A       192.168.76.225

 

這樣當用戶請求的時候,DNS 通過輪詢機制將 wenjin.cache.ibm.com.cn 的域名解析爲 192.168.76.223、192.168.76.224 和 192.168.76.225 其中之一。

配置完成後,運行 rndc star t 啓動 bind 服務。可在 /etc/rc.conf 中設置 named_enable="YES" 使得開機自啓動。

用 ps – A |grep named 查看 bind 服務是否起來;

用 nslookup wenjin.cache.ibm.com.cn 測試 bind 服務是否正常運行。

配置 Squid1 服務器

  1. 下載 squid-3.0.STABLE8.tar.gz 源碼包,將其放在 /home 目錄下
  2. 解壓縮tar – zxvf squid-3.0.STABLE8.tar.gz
    設置配置參數:cd squid-3.0.STABLE10
    ./configure – prefix=/usr/local/squid

    將 squid 安裝在 /usr/local 目錄下
  3. 編譯安裝:make&make install安裝完以後會在 /usr/local 目錄下看見 squid 目錄。
  4. 配置 squid 配置文件

    編輯 squid.conf 文件,vi /usr/local/squid/etc/squid.conf

    cache_effective_user squid 
     cache_effective_group squid 
     ######### 設定 squid 的主機名 , 如無此項 squid 將無法啓動
     visible_hostname squid1.nlc.gov.cn 
     ############# 配置 squid 爲加速模式 ################# 
     http_port 80 accel vhost vport 
     icp_port 3130 
     ##### 配置 squid2、squid3 爲其鄰居,當 squid1 在其緩存中沒有找到請求的資源時,
              通過 ICP 查詢去其鄰居中取得緩存
     cache_peer squid2.ibm.com.cn sibling 80 3130 
     cache_peer squid3.ibm.com.cn sibling 80 3130 
     ##### squid1 的三個父節點,originserver 參數指明是源服務器,
     round-robin  參數指明 squid 通過輪詢方式將請求分發到其中一臺父節點;
     squid 同時會對這些父節點的健康狀態進行檢查,如果父節點 down 了,
    那麼 squid 會從剩餘的 origin 服務器中抓取數據
     cache_peer 210.82.118.195 parent 8080 0 no-query originserver round-robin \ 
                                                  name=webServer1 
     cache_peer 192.168.76.226 parent 8080 0 no-query originserver round-robin \ 
                                                  name=webServer2 
     cache_peer 192.168.76.227 parent 8080 0 no-query originserver round-robin \ 
                                                name=webServer3 
     #### 將 wenjin.cache.ibm.com.cn 域的請求通過 RR 輪詢方式轉發到三個父節點中的一個
     cache_peer_domain webServer1 webServer2 webServer3 wenjin.cache.ibm.com.cn 
     ##### 下面是一些訪問控制、日誌和緩存目錄的設置
     acl localnet src 192.168.76.223 192.168.76.224 192.168.76.225 
     acl all src 0.0.0.0/0.0.0.0 
     http_access allow all 
     icp_access allow localnet 
     cache_log /usr/local/squid/var/logs/cache.log 
     access_log /usr/local/squid/var/logs/access.log squid 
     cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256 
     ####### 對 squid 的一些優化 ############### 
     maximum_object_size 10240 KB  ### 能緩存的最大對象爲 10M 
     maximum_object_size_in_memory 512 KB ### 內存中緩存的最大對象 512K 
     cache_mem 256 MB  ###squid 用於緩存的內存量

    保存後 :wq 退出。

    在 /etc/hosts 文件中添加

    192.168.76.223  squid1.ibm.com.cn 
     192.168.76.224  squid2.ibm.com.cn 
     192.168.76.225  squid3.ibm.com.cn

    保存後 : wq 退出。

    檢查 squid 配置文件正確與否:/usr/local/squid/bin/squid – k parse

    生成緩存目錄/usr/local/squid/bin/squid – z

    啓動squid:/usr/local/squid/bin/squid

    配置 squid2 和 squid3 服務器

    squid2 和 squid3 服務器的配置方法和配置參數和 squid1 一樣,配置完成後,分別啓動這兩個服務器上的 squid 服務。

    在 squid 的日誌文件 cache.log 中,出現如下日誌信息則說明三臺 squid 之間成功配置爲 sibling,且配置了三個父代理。

    2008/11/17 10:08:47| Configuring Sibling squid1.ibm.com.cn/80/3130 
     2008/11/17 10:08:47| Configuring Sibling squid3.ibm.com.cn/80/3130 
     2008/11/17 10:08:47| Configuring Parent 210.82.118.195/8080/0 
     2008/11/17 10:08:47| Configuring Parent 192.168.76.226/8080/0 
     2008/11/17 10:08:47| Configuring Parent 192.168.76.227/8080/0 
     2008/11/17 10:08:47| Ready to serve requests.

     

測試

測試之前,保證 DNS 服務、三臺 squid 服務和三臺 web 服務都正常起來。在客戶端輸入http://wenjin.cache.ibm.com.cn,則正確的顯示該網頁。服務器端的響應對客戶端是透明的,客戶端不知道請求是由哪臺 WEB 服務器處理的;而且其中某臺 Squid 服務器或 WEB 服務器發生故障,也不影響服務的正常運行。

原創引自http://www.ibm.com/developerworks/cn/linux/l-cn-squid/

附加:

######強烈建議寫上下面兩句,經測試能顯著提高Mem_hit 至少我的很有效#####
memory_replacement_policy heap LFUDA      
cache_replacement_policy heap GDSF

下面是我的分析,不知道對不對,大家指正:
memory_replacement_policy 這個是設定內存替換策略的,默認的lrf 是根據請求時間來決定是否緩存,也就是說越早請求的內容,越可能被squid丟棄而不放在內存,越是最近請求的內容就越可能被緩存在內存;
lrf 這種有一個致命的缺陷,那就是根據時間來決定緩存對象,而不是根據訪問頻率

所以我們應該設定爲 heap LFUDA   這個策略是根據訪問頻率來測算一個權衡值,越頻繁訪問的內容,就越可能被squid緩存在內存

至於 cache_replacement_policy heap GDSF 這個設定,可能要根據個人情況來設,我自己嘗試GDSF比較適合我的情況

###############################################################

squid round-robin分發後無法限制域名
有的配置文件如下
cache_peer 10.11.12.51 parent 80 0 no-query originserver round-robin name=web1
cache_peer 10.11.12.52 parent 80 0 no-query originserver round-robin name=web2
cache_peer 10.11.12.53 parent 80 0 no-query originserver round-robin name=web3
cache_peer 10.11.12.54 parent 80 0 no-query originserver round-robin name=web4
cache_peer 10.11.12.160 parent 80 0 no-query originserver name=content
cache_peer 10.11.12.150 parent 80 0 no-query originserver name=bbs
cache_peer 172.16.10.140 parent 80 0 no-query originserver round-robin name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver round-robin name=game2

cache_peer_domain contentchina content.web.com
cache_peer_domain bbs bbs.web.com
cache_peer_domain game1 game2 game.web.com
cache_peer_domain web1 web2 web3 web4 .web.com
cache_peer_domain web1 web2 web3 web4 web.com

設定不同的二級域名分發到不同的服務器上.
www.web.com能夠正確訪問.
查看後臺鏈接.每次訪問時squid也會正常去連parent服務器,每次都輪詢訪問
測試game.web.com
返回有很多內容都是404
但是單獨訪問140以及141都是沒有問題
然後發現很多鏈接分發到了其他web服務器上
看了說明.裏面提到round-robin參數會設置一組隨機的訪問
感覺是寫了round-robin的都是一個組
所以將game的去掉round-robin參數

cache_peer 172.16.10.140 parent 80 0 no-query originserver name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver name=game2

訪問後仍舊發現還是有分發錯誤的情況
再次查看squid.conf.default
裏面的cache_peer_domain的語法如下

# cache_peer_domain cache-host domain [domain ...]
# cache_peer_domain cache-host !domain

感覺是否是因爲cache-host這裏只能寫一臺服務器而非一組的關係
隨將配置文件修改

cache_peer 10.11.12.51 parent 80 0 no-query originserver round-robin name=web1
cache_peer 10.11.12.52 parent 80 0 no-query originserver round-robin name=web2
cache_peer 10.11.12.53 parent 80 0 no-query originserver round-robin name=web3
cache_peer 10.11.12.54 parent 80 0 no-query originserver round-robin name=web4
cache_peer 10.11.12.160 parent 80 0 no-query originserver name=content
cache_peer 10.11.12.150 parent 80 0 no-query originserver name=bbs
cache_peer 172.16.10.140 parent 80 0 no-query originserver round-robin name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver round-robin name=game2

cache_peer_domain contentchina content.web.com
cache_peer_domain bbs bbs.web.com
cache_peer_domain game1 game.web.com
cache_peer_domain game2 game.web.com
cache_peer_domain web1 .web.com
cache_peer_domain web2 .web.com
cache_peer_domain web3 .web.com
cache_peer_domain web4 .web.com
cache_peer_domain web1 web.com
cache_peer_domain web2 web.com
cache_peer_domain web3 web.com
cache_peer_domain web4 web.com

修改後訪問game.web.com
問題解決.沒有出現404
後臺的分發很正常
可能由於cache-host這裏寫了一組
導致squid並無法辨識進行針對性的分發
隨即將所有的分發都分發到所有round-robin服務器上.
因爲www.web.com後端的服務器較多.命中的概率較大.
而命中後第二次取出文件即是squid中的緩存文件,所以訪問www.web.com時沒有發現問題
而game.web.com因爲真實服務器比例較小
分發時很多鏈接分發到其他web服務器.
導致反饋回很多404


發佈了26 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章