squid反向代理

squid反向代理

http://blog.csdn.net/lusterfly/archive/2009/09/25/4595244.aspx

 

代理服務器是使用非常普遍的一種將局域網主機聯入互聯網的一種方式, 使用代理上網可以節約緊缺的IP地址資源,而且可以阻斷外部主機對內部主機的訪問,使內部網主機免受外部網主機的攻擊。但是,如果想讓互聯網上的主機訪問 內部網的主機資源(例如:Web站點),又想使內部網主機免受外部網主機攻擊,一般的代理服務是不能實現的,需要使用反向代理來實現。  本文將詳細介紹反向代理服務的概念以及如何利用反向代理服務器提高WEB服務器的性能和安全性。

  一.反向代理的概念

什麼是反向代理呢?其實,反向代理也就是通常所說的WEB服務器加速,它是一種通過在繁忙的WEB服務器和Internet之間增加一個高速的WEB緩衝服務器(即:WEB反向代理服務器)來降低實際的WEB服務器的負載。典型的結構如下圖所示:

 

  Web服務器加速(反向代理)是針對Web服務器提供加速功能的。它作爲代理Cache,但並不針對瀏覽器用戶,而針對一臺或多臺特定 Web服務器(這也是反向代理名稱的由來)。實施反向代理(如上圖所示),只要將Reverse Proxy Cache設備放置在一臺或多臺Web服務器前端即可。當互聯網用戶訪問某個WEB服務器時,通過DNS服務器解析後的IP地址是Reverse Proxy Server的IP地址,而非原始Web服務器的IP地址,這時Reverse Proxy Server設備充當Web服務器,瀏覽器可以與它連接,無需再直接與Web服務器相連。因此,大量Web服務工作量被卸載到反向代理服務上。不但能夠防 止外部網主機直接和web服務器直接通信帶來的安全隱患,而且能夠很大程度上減輕web服務器的負擔,提高訪問速度。

  二. 反向代理和其它代理的比較

下面將對幾種典型的代理服務作一個簡單的比較。在網絡上常見的代理服務器有三種:

1. 標準的代理緩衝服務器

一個標準的代理緩衝服務被用於緩存靜態的網頁(例如:html文件和圖片文件等)到本地網絡上的一臺主機上(即代理服務器)。當被緩存的頁 面被第二次訪問的時候,瀏覽器將直接從本地代理服務器那裏獲取請求數據而不再向原web站點請求數據。這樣就節省了寶貴的網絡帶寬,而且提高了訪問速度。 但是,要想實現這種方式,必須在每一個內部主機的瀏覽器上明確指明代理服務器的IP地址和端口號。客戶端上網時,每次都把請求送給代理服務器處理,代理服 務器根據請求確定是否連接到遠程web服務器獲取數據。如果在本地緩衝區有目標文件,則直接將文件傳給用戶即可。如果沒有的話則先取回文件,先在本地保存 一份緩衝,然後將文件發給客戶端瀏覽器。

2. 透明代理緩衝服務器

透明代理緩衝服務和標準代理服務器的功能完全相同。但是,代理操作對客戶端的瀏覽器是透明的(即不需指明代理服務器的IP和端口)。透明代 理服務器阻斷網絡通信,並且過濾出訪問外部的HTTP(80端口)流量。如果客戶端的請求在本地有緩衝則將緩衝的數據直接發給用戶,如果在本地沒有緩衝則 向遠程web服務器發出請求,其餘操作和標準的代理服務器完全相同。對於Linux操作系統來說,透明代理使用Iptables或者Ipchains實 現。因爲不需要對瀏覽器作任何設置,所以,透明代理對於ISP(Internet服務器提供商)特別有用。

3. 反向代理緩衝服務器

反向代理是和前兩種代理完全不同的一種代理服務。使用它可以降低原始WEB服務器的負載。反向代理服務器承擔了對原始WEB服務器的靜態頁 面的請求,防止原始服務器過載。它位於本地WEB服務器和Internet之間,處理所有對WEB服務器的請求,組織了WEB服務器和Internet的 直接通信。如果互聯網用戶請求的頁面在代理服務器上有緩衝的話,代理服務器直接將緩衝內容發送給用戶。如果沒有緩衝則先向WEB服務器發出請求,取回數 據,本地緩存後再發送給用戶。這種方式通過降低了向WEB服務器的請求數從而降低了WEB服務器的負載。

  三.反向代理工作原理

  反向代理服務器位於本地WEB服務器和Internet之間,如下圖所示:

 

  當用戶瀏覽器發出一個HTTP請求時,通過域名解析將請求定向到反向代理服務器(如果要實現多個WEB服務器的反向代理,需要將多個WEB 服務器的域名都指向反向代理服務器)。由反向代理服務器處理器請求。反向代理一般只緩存可緩衝的數據(比如html網頁和圖片等),而一些CGI腳本程序 或者ASP之類的程序不緩存。它根據從WEB服務器返回的HTTP頭標記來緩衝靜態頁面。有四個最重要HTTP頭標記:

Last-Modified: 告訴反向代理頁面什麼時間被修改
Expires: 告訴反向代理頁面什麼時間應該從緩衝區中刪除
Cache-Control: 告訴反向代理頁面是否應該被緩衝
Pragma: 告訴反向代理頁面是否應該被緩衝.
  例如:在默認情況下,ASP頁面返回” Cache-control: private.” ,所以ASP頁面時不會在反向代理服務器緩存的

  四.代理服務器軟件squid簡介

  Squid Internet Object Cache (Harvest Project的後續版本) 是美國政府大力助的一項研究計劃,其目的爲解決網絡帶寬不足的問題,是現在Unix系統上使用者最多功能也最完整的一套軟體。Apache和 Netscape雖附有相關的Proxy模塊,但因其功能簡單而不夠普及。有關squid的詳細說明可到squid網站(http: //www.squid-cache.org)查詢。

Squid最典型的應用是代理局域網的機器聯入互聯網,它支持現在流行的網絡協議。Squid的另一項非常出色的功能就是實現反向代理功能。

  五.使用Squid配置反向代理(HTTP 加速器)

通過squid配置反向代理主要就是配置“squid.conf”這個配置文件。下面以Linux操作系統爲例進行介紹,其它版本的在 UNIX也同樣適用。在Linux中squid如果是以源代碼方式安裝的話,這個文件一般在“/usr/local/squid/etc/”目錄下。如果 是系統自帶的squid,一般配置文件在“/etc/squid/”目錄下。
1. Squid反向代理單個後臺WEB服務器

如果WEB服務器和反向代理服務器是兩臺單獨的機器(一般的反向代理應該有兩塊網卡分別連接了內外部網絡)。那麼,應該修改下面的內容來設置反向代理服務。

http_port 80 # squid監聽的端口
httpd_accel_host 172.16.250.250 # 內部WEB服務器的IP地址
httpd_accel_port 80 # WEB服務器的端口httpd_accel_single_host on # 轉發爲緩衝的請求到一臺單獨的機器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
       如果WEB服務器和反向代理服務器是同一臺機器。
那麼,應該設置WEB服務器的監聽端口爲非80端口(比如:81端口)。要修改的內容如下:
http_port 80 # squid監聽的端口
httpd_accel_host localhost # 內部WEB服務器的IP地址
httpd_accel_port 81 # WEB服務器的IP地址
httpd_accel_single_host on # 轉發爲緩衝的請求到一臺單獨的機器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off

 

  下面解釋一下配置指令。

  http_port 80

  選項 http_port 指定squid監聽HTTP請求的端口,一般都設置成80端口,這樣使用戶感覺不到反向代理的存在,就像訪問真正的WEB服務器一樣。

  httpd_accel_host 172.16.250.250 和 httpd_accel_port 80

  選項httpd_accel_host 和 httpd_accel_port 指定WEB服務器的IP地址和端口號,可以根據自己的WEB服務器的實際情況而定。

  httpd_accel_single_host on

  選項httpd_accel_single_host 爲on 時,squid被設置成僅對單一的web服務器作反向代理。不考慮HTTP頭信息,Squid轉發所有的未被緩衝的頁面請求到這個web服務器。如果 squid需要做多個web服務器反向代理,必須將此選項設置爲off,並且使用轉向器或者DNS去映射請求到合適的後臺WEB服務器。

  httpd_accel_with_proxy on

  如果希望squid既作反向代理服務器又作本地機器的上網代理,需要將httpd_accel_with_proxy 改爲 on,默認情況下是off

  httpd_accel_uses_host_header off

  在HTTP協議1.1中,HTTP請求包括一個主機頭信息,指定URL的主機名或者主機的IP地址。這個選項可以用來完成多個後臺WEB服務器的反向代理功能。

  2.Squid反向代理多個後臺WEB服務器

  我們可以用Squid反向代理多個後臺WEB服務器。例如:我們可以配置squid同時反向代理www.abc.com, www.xyz.com, www.lmn.com三個後臺WEB服務器,示意圖如下:

 

  Squid的配置如下:

 

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on
(注意:編譯Squid時需激活Internal DNS選項)

  然後設置設置反響代理需要的域名解析(Internet用戶通過這裏解析三個網站的域名)如下:

 

www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74

  使三個域名都指向反向代理服務器的IP地址202.102.240.74。

下面設置反向代理所需要的DNS入口信息(即設置內部DNS,僅僅是squid在內部使用,Internet用戶不可見)。有兩種方法可以設置內部DNS,使用內部DNS服務器來解析或者使用/etc/hosts文件來實現。

使用內部DNS服務器的資源記錄如下:


www.abc.com IN A 172.16.1.2
www.xyz.com IN A 172.16.1.3
www.lmn.com IN A 172.16.1.4

  如果使用/etc/hosts文件來實現內部DNS(編譯時應使用disable internal dns選項),編輯/etc/hosts文件添加如下條目:


172.16.1.2 www.abc.com
172.16.1.3 www.xyz.com
172.16.1.4 www.lmn.com


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lusterfly/archive/2009/09/25/4595244.aspx

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