![]() 工作原理: 外部請求過來時,設置緩存根據(jù)配置文件進行轉向解析。這樣,服務器請求就可以轉發(fā)到我們指定的內部地址上。 在處理多虛擬主機轉向方面:mod_proxy比squid要簡單一些:可以把不同服務轉向后后臺多個IP的不同端口上。 而squid只能通過禁用DNS解析,然后根據(jù)本地的/etc/hosts文件根據(jù)請求的域名進行地址轉發(fā),后臺多個服務器必須使用相同的端口。 使用反向代理加速,我們不僅可以得到性能上的提升,而且還能獲得額外的安全性和配置的靈活度: 配置靈活性提高:可以自己在內部服務器上控制后臺服務器的DNS解析,當需要在服務器之間做遷移調整時,就不用大量修改外部DNS配置了,只需要修改內部DNS實現(xiàn)服務的調整。數(shù)據(jù)安全性增加:所有后臺服務器可以很方便的被保護在防火墻內。 后臺應用設計復雜程度降低:原先為了效率常常需要建立專門的圖片服務器images.chedong.com和負載比較高的應用服務器 bbs.chedong.com分離,在反向代理加速模式中,所有前臺請求都通過緩存服務器:實際上就都是靜態(tài)頁面,這樣,應用設計時就不用考慮圖片和應用本身分離了,也大大降低了后臺內容發(fā)布系統(tǒng)設計的復雜程度,由于數(shù)據(jù)和應用都存放在一起,也方便了文件系統(tǒng)的維護和管理。 基于Apache mod_proxy的反向代理緩存加速實現(xiàn)Apache包含了mod_proxy模塊,可以用來實現(xiàn)代理服務器,針對后臺服務器的反向加速 安裝apache 1.3.x 編譯時: --enable-shared=max --enable-module=most 注:Apache 2.x中mod_proxy已經(jīng)被分離成mod_proxy和mod_cache:同時mod_cache有基于文件和基于內存的不同實現(xiàn) 創(chuàng)建/var/www/proxy,設置apache服務所用戶可寫 mod_proxy配置樣例:反相代理緩存+緩存 架設前臺的www.example.com反向代理后臺的www.backend.com的8080端口服務。 修改:httpd.conf <VirtualHost *> ServerName www.example.com ServerAdmin admin@example.com # reverse proxy setting ProxyPass / http://www.backend.com:8080/ ProxyPassReverse / http://www.backend.com:8080/ # cache dir root CacheRoot "/var/www/proxy" # max cache storage CacheSize 50000000 # hour: every 4 hour CacheGcInterval 4 # max page expire time: hour CacheMaxExpire 240 # Expire time = (now - last_modified) * CacheLastModifiedFactor CacheLastModifiedFactor 0.1 # defalt expire tag: hour CacheDefaultExpire 1 # force complete after precent of content retrived: 60-90% CacheForceCompletion 80 CustomLog /usr/local/apache/logs/dev_access_log combined </VirtualHost> 基于Squid的反向代理加速實現(xiàn) Squid是一個更專用的代理服務器,性能和效率會比Apache的mod_proxy高很多。 如果需要combined格式日志補丁: http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html squid的編譯: ./configure --enable-useragent-log --enable-referer-log --enable-default-err-language=Simplify_Chinese \ --enable-err-languages="Simplify_Chinese English" --disable-internal-dns make #make install #cd /usr/local/squid make dir cache chown squid.squid * vi /usr/local/squid/etc/squid.conf 在/etc/hosts中:加入內部的DNS解析,比如: 192.168.0.4 www.chedong.com 192.168.0.4 news.chedong.com 192.168.0.3 bbs.chedong.com ---------------------cut here---------------------------------- # visible name visible_hostname cache.example.com # cache config: space use 1G and memory use 256M cache_dir ufs /usr/local/squid/cache 1024 16 256 cache_mem 256 MB cache_effective_user squid cache_effective_group squid http_port 80 httpd_accel_host virtual httpd_accel_single_host off httpd_accel_port 80 httpd_accel_uses_host_header on httpd_accel_with_proxy on # accelerater my domain only acl acceleratedHostA dstdomain .example1.com acl acceleratedHostB dstdomain .example2.com acl acceleratedHostC dstdomain .example3.com # accelerater http protocol on port 80 acl acceleratedProtocol protocol HTTP acl acceleratedPort port 80 # access arc acl all src 0.0.0.0/0.0.0.0 # Allow requests when they are to the accelerated machine AND to the # right port with right protocol http_access allow acceleratedProtocol acceleratedPort acceleratedHostA http_access allow acceleratedProtocol acceleratedPort acceleratedHostB http_access allow acceleratedProtocol acceleratedPort acceleratedHostC # logging emulate_httpd_log on cache_store_log none # manager acl manager proto cache_object http_access allow manager all cachemgr_passwd pass all ----------------------cut here--------------------------------- 創(chuàng)建緩存目錄: /usr/local/squid/sbin/squid -z 啟動squid /usr/local/squid/sbin/squid 停止squid: /usr/local/squid/sbin/squid -k shutdown 啟用新配置: /usr/local/squid/sbin/squid -k reconfig 通過crontab每天0點截斷/輪循日志: 0 0 * * * (/usr/local/squid/sbin/squid -k rotate)可緩存的動態(tài)頁面設計 什么樣的頁面能夠比較好的被緩存服務器緩存呢?如果返回內容的HTTP HEADER中有"Last-Modified"和"Expires"相關聲明,比如: Last-Modified: Wed, 14 May 2003 13:06:17 GMT Expires: Fri, 16 Jun 2003 13:06:17 GMT 前端緩存服務器在期間會將生成的頁面緩存在本地:硬盤或者內存中,直至上述頁面過期。 因此,一個可緩存的頁面: 頁面必須包含Last-Modified: 標記 一般純靜態(tài)頁面本身都會有Last-Modified信息,動態(tài)頁面需要通過函數(shù)強制加上,比如在PHP中: // always modified now header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 必須有Expires或Cache-Control: max-age標記設置頁面的過期時間: 對于靜態(tài)頁面,通過apache的mod_expires根據(jù)頁面的MIME類型設置緩存周期:比如圖片缺省是1個月,HTML頁面缺省是2天等。 <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/gif "access plus 1 month" ExpiresByType text/css "now plus 2 day" ExpiresDefault "now plus 1 day" </IfModule> 對于動態(tài)頁面,則可以直接通過寫入HTTP返回的頭信息,比如對于新聞首頁index.php可以是20分鐘,而對于具體的一條新聞頁面可能是1天后過期。比如:在php中加入了1個月后過期: // Expires one month later header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 30). " GMT"); 如果服務器端有基于HTTP的認證,必須有Cache-Control: public標記,允許前臺 ASP應用的緩存改造 首先在公用的包含文件中(比如include.asp)加入以下公用函數(shù): <% ' Set Expires Header in minutes Function SetExpiresHeader(ByVal minutes) ' set Page Last-Modified Header: ' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT) Response.AddHeader "Last-Modified", DateToHTTPDate(Now()) ' The Page Expires in Minutes Response.Expires = minutes ' Set cache control to externel applications Response.CacheControl = "public" End Function ' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT) Function DateToHTTPDate(ByVal OleDATE) Const GMTdiff = #08:00:00# OleDATE = OleDATE - GMTdiff DateToHTTPDate = engWeekDayName(OleDATE) & _ ", " & Right("0" & Day(OleDATE),2) & " " & engMonthName(OleDATE) & _ " " & Year(OleDATE) & " " & Right("0" & Hour(OleDATE),2) & _ ":" & Right("0" & Minute(OleDATE),2) & ":" & Right("0" & Second(OleDATE),2) & " GMT" End Function Function engWeekDayName(dt) Dim Out Select Case WeekDay(dt,1) Case 1:Out="Sun" Case 2:Out="Mon" Case 3:Out="Tue" Case 4:Out="Wed" Case 5:Out="Thu" Case 6:Out="Fri" Case 7:Out="Sat" End Select engWeekDayName = Out End Function Function engMonthName(dt) Dim Out Select Case Month(dt) Case 1:Out="Jan" Case 2:Out="Feb" Case 3:Out="Mar" Case 4:Out="Apr" Case 5:Out="May" Case 6:Out="Jun" Case 7:Out="Jul" Case 8:Out="Aug" Case 9:Out="Sep" Case 10:Out="Oct" Case 11:Out="Nov" Case 12:Out="Dec" End Select engMonthName = Out End Function %> 然后在具體的頁面中,比如index.asp和news.asp的“最上面”加入以下代碼:HTTP Header <!--#include file="../include.asp"--> <% '頁面將被設置20分鐘后過期 SetExpiresHeader(20) %> 應用的緩存兼容性設計經(jīng)過代理以后,由于在客戶端和服務之間增加了中間層,因此服務器無法直接拿到客戶端的IP,服務器端應用也無法直接通過轉發(fā)請求的地址返回給客戶端。但是在轉發(fā)請求的HTTD頭信息中,增加了HTTP_X_FORWARDED_????信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址。 下面是2個例子,用于說明緩存兼容性應用的設計原則:function getHostName () dim hostName as String = "" hostName = Request.ServerVariables("HTTP_HOST") if not isDBNull(Request.ServerVariables("HTTP_X_FORWARDED_HOST")) then if len(trim(Request.ServerVariables("HTTP_X_FORWARDED_HOST"))) > 0 then hostName = Request.ServerVariables("HTTP_X_FORWARDED_HOST") end if end if return hostNmae end function//對于一個需要記錄客戶端IP的PHP應用:不要直接引用REMOTE_ADDR,而是要使用HTTP_X_FORWARDED_FOR, function getUserIP (){ //注意這個函數(shù)中的¥字符是PHP的美元符號 ¥user_ip = ¥_SERVER["REMOTE_ADDR"]; if (¥_SERVER["HTTP_X_FORWARDED_FOR"]) { ¥user_ip = ¥_SERVER["HTTP_X_FORWARDED_FOR"]; } } |
溫馨提示:喜歡本站的話,請收藏一下本站!