轉自:http://www.ibm.com/developerworks/cn/linux/l-cn-squid/
本文在介紹 squid 反向 Proxy的工作原理的基礎上,指出反向 Proxy技術在提高網站訪問速度,增強網站可用性、安全性方面有很好的用途。作者在具體的實驗環境下,利用 DNS 輪詢和 Squid 反向 Proxy技術,實現了網站的負載平衡,從而提高了網站的可用性和可靠性。
現在有許多大型的門戶網站如 SINA 都採用 squid 反向 Proxy技術來加速網站的訪問速度,可將不同的 URL 請求分發到後台不同的 WEB 伺服器上,同時互連網使用者只能看到反向 Proxy伺服器的地址,加強了網站的訪問安全。 反向 Proxy的概念
反向 Proxy伺服器又稱為 WEB 加速伺服器,它位於 WEB 伺服器的前端,充當 WEB 服
務器的內容緩衝器。其系統結構如圖 1 圖 1. 系統結構
反向 Proxy伺服器是針對 WEB 伺服器設定的,後台 WEB 伺服器對互連網使用者是透明的,使用者只能看到反向 Proxy伺服器的地址,不清楚後台 WEB 伺服器是如何組織架構的。當互連網使用者請求 WEB 服務時,DNS 將請求的網域名稱解析為反向 Proxy伺服器的 IP 位址,這樣 URL 請求將被發送到反向 Proxy伺服器,由反向 Proxy伺服器負責處理使用者的請求與應答、與後台 WEB 伺服器互動。利用反向 Proxy伺服器減輕了後台 WEB 伺服器的負載,提高了訪問速度,同時避免了因使用者直接與 WEB 伺服器通訊帶來的安全隱患。
回頁首 Squid 反向 Proxy的實現原理
目前有許多反向 Proxy軟體,比較有名的有 Nginx 和 Squid 。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 網站開發的,是一個高效能的 HTTP 和反向 Proxy伺服器,也是一個 IMAP/POP3/SMTP Proxy 伺服器。
Squid是由美國政府大力資助的一項研究計劃,其目的為解決網路頻寬不足的問題,支援HTTP,HTTPS,FTP 等多種協議,是現在 Unix 系統上使用、最多功能也最完整的一套軟體。下面將重點介紹 Squid 反向 Proxy的實現原理和在提高網站效能方面的應用。
Squid反向 Proxy伺服器位於本地 WEB 伺服器和 Internet 之間 , 組織架構如圖 2: 圖 2. 組織架構
用戶端請求訪問 WEB 服務時,DNS 將訪問的網域名稱解析為 Squid 反向 Proxy伺服器的 IP 位址,這樣用戶端的 URL 請求將被發送到反向 Proxy伺服器。如果 Squid 反向 Proxy伺服器中緩衝了該請求的資源,則將該請求的資源直接返回給用戶端,否則反向 Proxy伺服器將向背景 WEB 伺服器請求資源,然後將請求的應答返回給用戶端,同時也將該應答緩衝在本地,供下一個要求者使用。
Squid 反向 Proxy一般只緩衝可緩衝的資料(比如 html 網頁和圖片等),而一些 CGI 指令碼程式或者 ASP、JSP 之類的動態程式預設不緩衝。它根據從 WEB 伺服器返回的 HTTP 頭標記來緩衝靜態頁面。有四個最重要 HTTP 頭標記: Last-Modified: 告訴反向 Proxy頁面什麼時間被修改 Expires: 告訴反向 Proxy頁面什麼時間應該從緩衝區中刪除 Cache-Control: 告訴反向 Proxy頁面是否應該被緩衝 Pragma: 用來包含實現特定的指令,最常用的是 Pragma:no-cache
回頁首 利用 Squid 反向 Proxy加速網站執行個體
本執行個體的網域名稱是 wenjin.cache.ibm.com.cn,通過DNS的輪詢技術,將用戶端的請求分發給其中一台 Squid 反向 Proxy伺服器處理,如果這台 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 伺服器 下載 squid-3.0.STABLE8.tar.gz 源碼包,將其放在 /home 目錄下 解壓縮tar – zxvf squid-3.0.STABLE8.tar.gz
設定配置參數:cd squid-3.0.STABLE10
./configure – prefix=/usr/local/squid
將 squid 安裝在 /usr/local 目錄下 編譯安裝:make&make install安裝完以後會在 /usr/local 目錄下看見 squid 目錄。 配置 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 是一個開源的軟體,利用它的反向 Proxy技術可以提高網站系統的訪問速度。本文在真實的網路環境下,利用三台 squid 反向 Proxy伺服器加速了網站的效能,同時結合 DNS 輪詢技術實現了網站的負載平衡。經過一段時間的測試和試運行,該網站的訪問速度和可用性方面都有很大的提高,從未出現過網站服務中斷情況。