利用 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 服務器發生故障,也不影響服務的正常運行。

 

總結

Squid 是一個開源的軟件,利用它的反向代理技術可以提高網站系統的訪問速度。本文在真實的網絡環境下,利用三臺 squid 反向代理服務器加速了網站的性能,同時結合 DNS 輪詢技術實現了網站的負載均衡。經過一段時間的測試和試運行,該網站的訪問速度和可用性方面都有很大的提高,從未出現過網站服務中斷情況。

 

參考資料

關於作者

李明慧 ,在 IBM 中國軟件開發中心 BI 團隊工作從事 InfoSphere Warehouse Administration Console 的功能測試工作。曾在 DeveloperWorks 發表《將 DB2 DWE 9.1.X 遷移到 DB2 Warehouse 9.5》、《 InfoSphere Warehouse SQL 倉儲命令行接口》以及《Linux下利用 squid 反向代理提高網站性能》等文章。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章