用C語言,php的擴展的書寫格式(ZEND API)寫PHP擴展的步驟:
          我用的php環境 php 5.2.5,完成最基本功能 helloword

          cd /php5.2.5/ext

          生成骨架 ./ext_skel --extname=cltest 會在當前目錄建立一個cltest的目錄

          進入該目錄 cd cltest

          修改 配置文件config.m4
          vi cltest/config.m4 

          注釋3個dnl [dnl代表注釋,對應shell的#]
          PHP_ARG_WITH(my_module, for my_module support,
          Make sure that the comment is aligned:
          [ --with-my_module Include my_module support])

          修改完畢。

          vi cltest.c
          改成這樣:
          function_entry my_module_functions[] = {
          PHP_FE(say_hello, NULL) /* ?添加這一行代碼   注冊函數say_hello() */
          PHP_FE(confirm_my_module_compiled, NULL) /* For testing, remove later. */
          {NULL, NULL, NULL} /* Must be the last line in my_module_functions[] */
          };

          另外在文件的最后添加下列代碼 函數程序主體
          PHP_FUNCTION(say_hello)
          {
                  RETURN_STRINGL("hello world",100,1);
          }

          修改完畢。

           

          vi php_cltest.h

          在文件中PHP_FUNCTION(confirm_my_module_compiled);一行前面添加下面的代碼 函數定義
          PHP_FUNCTION(say_hello);

          修改完畢。

           

          找到這個執行文件phpize ,在cltest目錄下執行命令,用于加載動態鏈接庫

          /usr/local/php/bin/phpize
          ./configure --enable-cltest --with-apxs2=/usr/local/apache2/bin/apxs --with-php-config=/usr/local/php/bin/php-config

          make
          會在當前的目錄下生成一個目錄叫modules他的下面就放著你要的cltest.so文件

          make install
          會cp modules/cltest.so /usr/local/php/include/php/ext/
          其余的就是修改 php.ini加載該.so webserver要生效需要重啟。

          posted @ 2009-08-31 17:55 小馬歌 閱讀(323) | 評論 (0)編輯 收藏
           
          2009-8-3 15:56:41 文/IT.com.cn 出處:IT.com.cn(IT世界網)

          前段時間,迅雷又進行了一次改版。這次改版可以說決心非常大,舍棄了近30%的非視頻類流量后,迅雷握緊拳頭全力進入了視頻門戶的行列。

            靠下載起家的迅雷,一直有著做門戶的夢想。先是下載門戶,但是覺得太單??;然后就是想做資訊門戶,但是一直都不受網友待見;直到迅雷看看的推出,迅雷才仿佛找到主心骨一樣在互聯網視頻點播領域嘗到了很大的甜頭,從而也逐步確立迅雷的門戶方向:中國最高清的影視視頻門戶,正版發行平臺!

            在迅雷正式轉型之前,雖然,迅雷靠視頻賺了大把的銀子,但是迅雷還是不敢大聲宣布自己的視頻門戶決定,因為,其中有個重要的制約因素――電影版權。這個是中國互聯網最為缺乏的東西,就像尚方寶劍一樣,你沒有,就會被拿著寶劍的人欺負;你有,就可以給你帶來大把好處;而且,這把劍還不是人人都可以拿在手上耀武揚威的。迅雷就被這個版權困擾了很久,雖然有GOUGOU搜索在規避部分版權,但在最賺的時候,迅雷還是被電影版權方告得焦頭爛額。

            那為什么現在迅雷敢打出視頻門戶的招牌,難道他已經解決了所有的版權問題?這還要從另外一家公司――深圳市快播科技有限公司說起。

            快播是一家提供高清視頻在線點播P2P技術的公司,本來也是一家默默無聞的公司,但是就在快播默默發展的3年中,中國互聯網有近5萬家中小電影網站使用了他們的技術,每天有近2000萬互聯網用戶使用他們的快播軟件(QvodPlayer)。快播本身專注于技術,只是為中小網站提供流媒體點播技術,但是諸多中小影視網站的豐富高清片源加上穩定的QVOD點播技術,用戶體驗不輸于看看,只是沒有成為一個完整的視頻平臺而已。

            迅雷看看在09年意識到了這個威脅,但同時也獲得了啟發――這種模式可以解決迅雷頭疼多年的版權問題。仿造快播的qvod,迅雷立馬推出了一個gvod;于是,有版權的電影用迅雷看看播,沒有版權的用GOUGOU搜索帶到使用gvod的電影站去播,完美的互聯網視頻點播流程宣告成立,迅雷也迫不及待的改版了。

            迅雷的新門戶化戰略貌似胸有成竹了,不過有些人可就要操心了。

            先是微視頻類網站,對于他們來說迅雷看看的高清視頻點播簡直就是大殺器。雖然土豆CEO王微在接受采訪的時候對土豆的前景表示樂觀,但也不得不承認:“目前的視頻網站格局未來很有可能會被新的進入者打破,將會對現有的各家產生很大的影響”。明眼人可以判斷王微所指的無疑就是迅雷。

            然后是幫助迅雷解決版權問題的中小電影網站。中小電影網站對迅雷的作用可以這樣來描述:現在,幫助迅雷渡過版權問題的難關,在版權談不攏的這段時間,中小電影網站的GVOD點播仍然為迅雷狗狗用戶提供了完整的內容體驗;隨后,成為迅雷和電影版權方談判的籌碼,使用GVOD技術的眾多影視網站已經被迅雷控制,迅雷可以幫助版權方從源頭上打擊控制他們,實現迅雷+版權方的利益最大化。

            迅雷看看高清點播技術加迅雷用戶基礎,狗狗搜索+GVOD在內容和片源上又不受目前不成熟的中國版權形勢的制約,高清、點播、版權、流量,這四大要素,對于已經拋棄用戶原創短視頻價值而挺進高清影視內容運營的三大視頻門戶來說,消化掉這個新進者的強大競爭壓力的市場代價會落到哪一家頭上還不好說,但是對于顯然無力解決版權問題的中國互聯網中小視頻網站來說,迅雷必將成為他們的掘墓人,這點是毫無疑問的。

          posted @ 2009-08-18 18:09 小馬歌 閱讀(239) | 評論 (0)編輯 收藏
           
          本文將討論在PHP4環境下如何運用進程間通訊機制——IPC(INTER-PROCESS-COMMUNICATION)。本文討論的軟件環境是LINUX+PHP4.0.4或更高版本。首先,我們假設你已經裝好了PHP4和UNIX, 為了使得PHP4可以運用共享內存和信號量,必須在編譯PHP4順序時激活SHMOP和SYSVSEM這兩個擴展模塊。
          實現方法:在PHP設定(CONFIGURE)時加入如下選項。
          --ENABLE-SHMOP --ENABLE-SYSVSEM  
          這樣就使得你的PHP系統可以處理相關的IPC函數了。
          IPC是什么?
          IPC (INTER-PROCESS COMMUNICATION) 是一個UNIX標準通訊機制,它提供了使得在同一臺主機不同進程之間可以互相通訊的方法?;镜腎PC處理機制有3種:它們分別是共享內存、信號量和消息隊列。本文中我們次要討論共享內存和信號量的運用。關于消息隊列,筆者在不久的將來還會專門介紹。
          在PHP中運用共享內存段
          在不同的處理進程之間運用共享內存是一個實現不同進程之間相互通訊的好方法。如果你在一個進程中向所共享的內存寫入一段信息,那么所有其他的進程也可以看到這段被寫入的數據。非常方便。在PHP中有了共享內存的幫助,你可以實現不同進程在運行同一段PHP腳本時返回不同的結果?;驅崿F對PHP同時運行數量的實時查詢等等。
          共享內存允許兩個或者多個進程共享一給定的存儲區。因為數據不需要在客戶機和服務器之間復制,所以這是最快的一種IPC。運用共享內存的唯一訣竅是多個進程對一給定存儲區的同步存取。
          如何建立一個共享內存段呢?下面的代碼可以幫你建立共享內存。
          $SHM_ID = SHMOP_OPEN($KEY, $MODE, $PERM, $SIZE);
          注意,每個共享內存段都有一個唯一的ID, 在PHP中,SHMOP_OPEN會把建立好的共享內存段的ID返回,這里我們用$SHM_ID記錄它。而$KEY是一個我們邏輯上表示共享內存段的KEY值。不同進程只要選擇同一個KEY ID就可以共享同一段存儲段。習慣上我們用一個串(類似文件名一樣的東西)的散列值作為KEY ID. $MODE指明了共享內存段的運用方式。這里由于是新建,因此值為’C’ –取CREATE之意。如果你是訪問已經建立過的共享內存那么請用’A’,-- 取ACCESS(小型網站之最愛)之意。$PERM參數定義了訪問的權限,8進制,關于權限定義請看UNIX文件系統幫助。$SIZE定義了共享內存的大小。盡管有點象FOPEN(文件處理)你可不要當它同文件處理一樣。后面的描述你將看到著一點。
          例如:
          $SHM_ID = SHMOP_OPEN(0XFF3, "C", 0644, 100);
          這里我們打開了一個共享內存段 鍵值0XFF3 –RW-R—R—格式,大小為100字節。
          如果需要訪問已有的共享內存段,你必須在調用SHMOP_OPEN中設第3、4個參數為0。
          IPC工作狀態的查詢
          在UNIX下,你可以用一個命令行順序IPCS查詢系統所有的IPC資源狀態。不過有些系統要求需要超級用戶方能執行。下圖是一段IPCS的運行結果。  


          上圖中系統顯示了4個共享內存段,注意其中第4個鍵值為0X00000FF3的就是我們剛剛運行過的PHP順序所創建的。關于IPCS的用法請參考UNIX用戶手冊。
          如何釋放共享內存呢
          釋放共享內存的辦法是調用PHP指令:SHMOP_DELETE($ID)
          SHMOP_DELETE($ID);
          $ID 就是你調用SHMOP_OPEN所存的SHMOP_OP的返回值。還有一個辦法就是用UNIX的管理指令:
          IPCRM ID, ID就是你用IPCS看到的ID.和你順序中的$ID不一樣。不過要小心,如果你用IPCRM直接刪除共享內存段那么有可能導致其他不知道這一情況的進程在引用這個已經不復存在的共享內存器時出現一些不可預測的錯誤(往往結果不妙)。
          如何運用(讀寫)共享內存呢
          運用如下所示函數向共享內存寫入數據
          INT SHMOP_WRITE (INT SHMID, STRING DATA, INT OFFSET)
          其中SHMID是用SHMOP_OPEN返回的句柄。$DATA變量存放了要存放的數據。$OFFSET描述了寫入從共享內存的開始第一個字節的位置(以0開始)。

          /Files/xiaomage234/shmop.rar
          posted @ 2009-08-13 11:36 小馬歌 閱讀(119) | 評論 (0)編輯 收藏
           
          許多 PHP 開發人員認為,由于標準的 PHP 缺少線程功能,因此實際 PHP 應用程序不可能執行多任務處理。例如,如果應用程序需要其他 Web 站點的信息,那么在遠程檢索完成之前它都必須停止。這是錯誤的!通過本文了解如何使用 stream_select 和 stream_socket_client 實現進程內 PHP 多任務處理。

          PHP 不支持線程。盡管如此,與前述大多數 PHP 開發人員所相信的想法形成對比的是,PHP 應用程序可以 執行多任務處理。讓我們開始盡可能清晰地描述一下 “多任務” 和 “線程” 對于 PHP 編程的意義。

          并發的種類

          首先拋開幾個和主題無關的例子。PHP 與多任務或并發的關系十分復雜。在較高層次上,PHP 經常涉及多任務:以多任務方式使用 標準的服務器端 PHP 安裝 —— 例如,作為 Apache 模塊。換句話說,若干個客戶機 —— Web 瀏覽器 —— 可以同時請求同一個 PHP 解釋的頁面,而 Web 服務器將差不多同時返回所有這些頁面。

          一個 Web 頁面不會妨礙其他 Web 頁面的發送,盡管可能會由于諸如服務器內存或網絡帶寬之類的受限資源而使它們相互之間略有妨礙。這樣,實現并發 的系統級需求可能適合使用基于 PHP 的解決方案。就實現而言,PHP 允許它的管理 Web 服務器負責實現并發。

          Ajax 名下的客戶端并發近幾年來也已成為開發人員關注的焦點。雖然 Ajax 的含義已經變得十分模糊,但是它的一個方面是瀏覽器顯示可以同時執行計算和 保留對諸如選擇菜單項之類的用戶操作的響應。這實際上就是某種 多任務。用 PHP 編碼的 Ajax 就是這樣 —— 但是不涉及任何特定的 PHP;用于其他語言的 Ajax 框架均以完全相同的方法操作。

          只粗略地涉及 PHP 的第三個并發實例是 PHP/TK。PHP/TK 是 PHP 的擴展,用于為核心 PHP 提供可移植圖形用戶界面(GUI)綁定。PHP/TK 允許用 PHP 編寫代碼構造桌面 GUI 應用程序。其基于事件的特性將模擬一種易于掌握并且比線程更少出錯的并發形式。此外,并發是 “繼承” 自一項輔助技術,而不是 PHP 的基本功能。

          向 PHP 本身添加線程支持的試驗已經做過多次。據我所知,沒有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的實現表明事件可能比線程能更好地體現 PHP 的并發。PHP V5 證明事實確實如此。

          PHP V5 將提供 stream_select()

          使用標準的 PHP V4 和更低版本,必須按順序執行 PHP 應用程序的所有工作。例如,如果程序需要在兩個商業站點檢索商品的價格,則請求第一個站點的價格,等待至響應到達,再請求第二個站點的價格,然后再次等待。

          如果程序請求同時完成若干項任務會怎么樣?總體來看,程序將在一段時間內完成,在這段時間內,將始終進行連續處理。

          第一個示例

          新的 stream_select 函數及它的幾個助手使這成為可能。請考慮以下示例。

          清單 1. 同時請求多個 HTTP 頁面

          <?php
          echo "Program starts at ". date('h:i:s') . ".\n";

          $timeout=10;
          $result=array();
          $sockets=array();
          $convenient_read_block=8192;

          /* Issue all requests simultaneously; there's no blocking. */
          $delay=15;
          $id=0;
          while ($delay > 0) {
          $s=stream_socket_client("phaseit.net:80", $errno,
          $errstr, $timeout,
          STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
          if ($s) {
          $sockets[$id++]=$s;
          $http_message="GET /demonstration/delay?delay=" .
          $delay . " HTTP/1.0\r\nHost: phaseit.net\r\n\r\n";
          fwrite($s, $http_message);
          } else {
          echo "Stream " . $id . " failed to open correctly.";
          }
          $delay -= 3;
          }

          while (count($sockets)) {
          $read=$sockets;
          stream_select($read, $w=null, $e=null, $timeout);
          if (count($read)) {
          /* stream_select generally shuffles $read, so we need to
          compute from which socket(s) we're reading. */
          foreach ($read as $r) {
          $id=array_search($r, $sockets);
          $data=fread($r, $convenient_read_block);
          /* A socket is readable either because it has
          data to read, OR because it's at EOF. */
          if (strlen($data) == 0) {
          echo "Stream " . $id . " closes at " . date('h:i:s') . ".\n";
          fclose($r);
          unset($sockets[$id]);
          } else {
          $result[$id] .= $data;
          }
          }
          } else {
          /* A time-out means that *all* streams have failed
          to receive a response. */
          echo "Time-out!\n";
          break;
          }
          }
          ?>

          如果運行此清單,您將看到如下所示的輸出。

          清單 2. 從清單 1 中的程序獲得的典型輸出

          Program starts at 02:38:50.
          Stream 4 closes at 02:38:53.
          Stream 3 closes at 02:38:56.
          Stream 2 closes at 02:38:59.
          Stream 1 closes at 02:39:02.
          Stream 0 closes at 02:39:05.

          了解這其中的工作原理至關重要。在較高層次上,第一個程序將發出幾個 HTTP 請求并接收 Web 服務器發送給它的頁面。雖然生產應用程序將很可能尋找若干個 Web 服務器的地址 —— 可能是 google.com、yahoo.com、ask.com 等 —— 但是此示例將把它的所有請求發送到位于 Phaseit.net 的企業服務器上,只為降低復雜度。

          Web 頁面請求在延遲(可變)后返回結果,如下所示。如果程序按順序發出請求,則需花費大約 15+12+9+6+3 (45) 秒鐘才能完成。如清單 2 所示,它實際上花費 15 秒鐘完成。性能提高了三倍。

          使這成為可能的是 PHP V5 的新 stream_select 函數。請求都是以常規方法發起,方法為打開幾個 stream_socket_client 并向對應于 http://phaseit.net/demonstration/delay?delay=$DELAY 的每個 stream_socket_client 寫入 GET。如果您通過瀏覽器請求此 URL,則在幾秒鐘之后,您將看到:

          Starting at Thu Apr 12 15:05:01 UTC 2007.
          Stopping at Thu Apr 12 15:05:05 UTC 2007.
          4 second delay.

          延遲服務器將作為 CGI 實現,如下所示:

          清單 3. 延遲服務器實現

          #!/bin/sh

          echo "Content-type: text/html

          <HTML> <HEAD></HEAD> <BODY>"

          echo "Starting at `date`."
          RR=`echo $REQUEST_URI | sed -e 's/.*?//'`
          DELAY=`echo $RR | sed -e 's/delay=//'`
          sleep $DELAY
          echo "<br>Stopping at `date`."
          echo "<br>$DELAY second delay.</body></html>"

          雖然清單 3 的特殊實現特定于 UNIX?,但是本文中幾乎所有實現都將很好地應用于 Windows?(尤其是 Windows 98 以后的版本)或 PHP 的 UNIX 安裝。特別地,清單 1 可以托管在任意一個操作系統中。因此,Linux? 和 Mac OS X 都是 UNIX 變體,因此這里所有的代碼都可以在兩者的任意一種中運行。

          按照以下順序向延遲服務器發出請求。

          清單 4. 進程啟動順序

          delay=15
          delay=12
          delay= 9
          delay= 6
          delay= 3

          stream_select 的作用是盡可能快速地接收結果。在這種情況下,它執行的順序與發出結果的順序剛好相反。3 秒后,第一個頁面已經準備好讀取。程序的這一部分也符合常規 PHP —— 在本例中,使用 fread。就像在其他 PHP 程序一樣,讀取可以很好地通過 fgets 完成。

          處理將以同樣的方法繼續。程序將在 stream_select 停止,直至數據就緒。重要的一點是,只要任何 連接具有數據,不管順序怎樣,程序都將開始讀取。這是程序進行多任務處理或并發處理來自多個請求的結果的方法。

          注意,這沒有對主機 CPU 造成任何負擔。經常會遇到這樣一些連網程序,以 CPU 使用率急速上升至 100% 的方式在 while 中使用 fread。那種情況不會出現在這里,因為 stream_select 擁有支持立即響應所需的屬性(只要有任何讀取信息),但是它將在各讀取操作間隙的等待時間內產生可忽略的 CPU 負載。

          必備的 stream_select() 知識

          諸如此類的基于事件的編程并不是最基本的。雖然清單 1 被簡化到只包含最基本要素,但是涉及作為多任務應用程序必要元素的回調或協調的任何編碼,比簡單的程序順序更讓人覺得陌生。在這種情況下,大多數挑戰集中 在 $read 數組上。注意,它是一個引用;stream_select 將通過改變 $read 的內容返回重要信息。就像指針是 C 的最大絆腳石一樣,引用似乎是 PHP 中最讓程序員感到棘手的一部分。

          您可以使用這項技術向任意個外部 Web 站點發出請求,確信您的程序會盡快收到所有結果,而無需等待其他請求。實際上,該技術將正確處理所有 TCP/IP 連接,而不只是 Web 端口 80 上的連接,因此您可以大體上管理 LDAP 檢索、SMTP 傳輸、SOAP 請求等。

          但那不是全部。PHP V5 將管理 “流” 之類的各種連接,而不僅是簡單的套接字。PHP 的 Client URL library (CURL) 支持 HTTPS 證書、FTP 上傳、cookie 等。(CURL 允許 PHP 應用程序使用各種協議連接至服務器)。由于 CURL 將提供流接口,因此從程序的角度來看,連接是透明的。下一個部分將展示 stream_select 如何多路傳輸本地計算。

          對于 stream_select 還有幾點需要注意。它還在進行文檔整理,因為即使最新的 PHP 書籍都沒有涉列它??稍?Web 上獲得的幾個代碼示例完全不能工作或者讓人產生混淆。stream_select 的第二個和第三個參數用于管理與清單 1 的 read 通道相對應的 write 和 exception 通道,應當始終為 null。除了少數例外情況,在可寫通道或異常通道中選擇這兩個參數是錯誤的。除非您有經驗,否則請堅持可讀選擇。

          此外,至少在 PHP V5.1.2 之前,stream_select 還明顯存在錯誤。最重要的是,不能信任函數的返回值。雖然我尚未調試過實現,但是經驗告訴我,可以安全地測試清單 1 中的 count($read),但是測試 stream_select 本身的返回值并不 安全(盡管有官方文檔)。

          本地 PHP 并發

          示例及上面的大部分討論主要討論了如何同時管理若干個遠程資源并接收到達的結果,而不是按照最初請求的順序等待處理各個請求。這肯定是 PHP 并發的重要應用。實際應用程序的速度有時候可以提高 10 倍或更多。

          如果出現性能衰退怎么辦?有沒有一種方法可以提升受限于本地處理的 PHP 結果的速度?方法有多種。要說有什么不同的話,這些方法不如清單 1 中的面向套接字的方法有名。造成這種情況的原因有很多,包括:

          大多數 PHP 頁面已經足夠快 —— 更好的性能會是一種優勢,但是還不值得對新代碼進行投入。
          在 Web 頁面中使用 PHP 可以放棄部分無關緊要的性能提升 —— 當惟一的價值標準是交付整個 Web 頁面需要的時間時,那么重新安排計算以更快地獲得中間結果并不重要。

          PHP 不能控制本地瓶頸 —— 用戶可能會為花 8 秒的時間提取帳戶記錄的詳細信息而抱怨,但是那很可能是數據庫處理或某種其他 PHP 外部資源的約束。即使將 PHP 處理降至零,單是查找就仍需要花費超過 7 秒的時間。

          甚至很少有約束是并行的 —— 假定某特定頁面將為具體列出的普通股計算建議交易價格,并且計算十分復雜,需要花費一段時間。計算在本質上可能是順序執行的。沒有一種明顯的方法可以將其劃分為 “團隊協作”。

          很少有 PHP 程序員能夠認識到 PHP 實現并發的潛力。在具有使用并行實現性能需求的少數人當中,我遇到的大多數人全都說 PHP “不支持線程”,并且甘于使用現有的計算模型。

          可是,有時我們可以做得更好。假定 PHP 頁面需要計算兩只股票價格,可能還需要將兩者相比較,并且底層主機剛好是多處理器。在這種情況下,通過將兩個截然不同并且十分耗時的計算分配給不同處理器,可能會提高幾乎兩倍的性能。

          在所有 PHP 計算領域中,此類實例很少見。但是,由于我發現到處都沒有對它的精確記錄,因此需要在這里包括用于此類加速的模型。

          清單 5. 延遲服務器實現

          <?php
          echo "Program starts at ". date('h:i:s') . ".\n";

          $timeout=10;
          $streams=array();
          $handles=array();

          /* First launch a program with a delay of three seconds, then
          one which returns after only one second. */
          $delay=3;
          for ($id=0; $id <= 1; $id++) {
          $error_log="/tmp/error" . $id . ".txt"
          $descriptorspec=array(
          0 => array("pipe", "r"),
          1 => array("pipe", "w"),
          2 => array("file", $error_log, "w")
          );
          $cmd='sleep ' . $delay . '; echo "Finished with delay of ' .
          $delay . '".';
          $handles[$id]=proc_open($cmd, $descriptorspec, $pipes);
          $streams[$id]=$pipes[1];
          $all_pipes[$id]=$pipes;
          $delay -= 2;
          }

          while (count($streams)) {
          $read=$streams;
          stream_select($read, $w=null, $e=null, $timeout);
          foreach ($read as $r) {
          $id=array_search($r, $strea**ms);
          echo stream_get_contents($all_pipes[$id][1]);
          if (feof($r)) {
          fclose($all_pipes[$id][0]);
          fclose($all_pipes[$id][1]);
          $return_value=proc_close($handles[$id]);
          unset($streams[$id]);
          }
          }
          }
          ?>

          此程序將生成如下輸出:

          Program starts at 10:28:41.
          Finished with delay of 1.
          Finished with delay of 3.

          這里的關鍵在于 PHP 啟動了兩個獨立子進程,取回待完成的第一個進程的輸出,然后取回第二個進程的輸出,即使后者啟動得較早。如果主機是多處理器計算機,并且操作系統已正確配 置,則操作系統本身負責將各個子程序分配給不同的處理器。這是在多處理器主機中良好應用 PHP 的一種方法。

          PHP 支持多任務。PHP 不按照諸如 Java 編程語言或 C++ 等其他語言所采用的方法支持線程,但是以上示例表明 PHP 具有更多的超乎想象的加速潛力。
          /Files/xiaomage234/thread.rar
          posted @ 2009-08-13 11:33 小馬歌 閱讀(141) | 評論 (0)編輯 收藏
           
          arnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙 Verdens Gang (http://www.vg.no) 使用3臺Varnish代替了原來的12臺squid,

          性能比以前更好。
          varnish的作者Poul-Henning Kamp是FreeBSD的內核開發者之一,他認為現在的計算機比起1975年已經復雜許多。在1975年時,儲存媒介只有兩

          種:內存與硬盤。但現在計算機系統的內存除了主存外,還包括了cpu內的L1、L2,甚至有L3快取。硬盤上也有自己的快取裝置,因此squid

          cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但操作系統可以得知這些情況,所以這部份的工作應該交給操作系統處理,

          這就是 Varnish cache設計架構。

          varnish項目:http://varnish.projects.linpro.no/
          varnish 中文WIKI:http://zh.wikipedia.org/wiki/Varnish_cache
          posted @ 2009-08-08 09:50 小馬歌 閱讀(213) | 評論 (0)編輯 收藏
           
          from: http://blog.s135.com/post/313/

          我曾經寫過一篇文章──《初步試用Squid的替代產品──Varnish Cache網站加速器》,但當時僅僅是用著玩,沒做深入研究。

          今天寫的這篇關于Varnish的文章,已經是一篇可以完全替代Squid做網站緩存加速器的詳細解決方案了。網上關于Varnish的資料很少,中文資料更是微乎其微,希望本文能夠吸引更多的人研究、使用Varnish。

          在我看來,使用Varnish代替Squid的理由有三點:
          1、Varnish采用了“Visual Page Cache”技術,在內存的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在內存、磁盤中交換文件,性能要比Squid高。
          2、Varnish的穩定性還不錯,我管理的一臺圖片服務器運行Varnish已經有一個月,沒有發生過故障,而進行相同工作的Squid服務器就倒過幾次。
          3、通過Varnish管理端口,可以使用正則表達式快速、批量地清除部分緩存,這一點是Squid不能具備的。

          點擊在新窗口中瀏覽此圖片


          下面來安裝Varnish網站緩存加速器(Linux系統):
          1、創建www用戶和組,以及Varnish緩存文件存放目錄(/var/vcache):
          /usr/sbin/groupadd www -g 48
          /usr/sbin/useradd -u 48 -g www www
          mkdir -p /var/vcache
          chmod +w /var/vcache
          chown -R www:www /var/vcache


          2、創建Varnish日志目錄(/var/logs/):
          mkdir -p /var/logs
          chmod +w /var/logs
          chown -R www:www /var/logs


          3、編譯安裝varnish:
          wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
          tar zxvf varnish-1.1.2.tar.gz
          cd varnish-1.1.2
          ./configure --prefix=/usr/local/varnish
          make && make install


          4、創建Varnish配置文件:
          vi /usr/local/varnish/vcl.conf

          輸入以下內容:
          引用
          backend myblogserver {
                 set backend.host = "192.168.0.5";
                 set backend.port = "80";
          }

          acl purge {
                 "localhost";
                 "127.0.0.1";
                 "192.168.1.0"/24;
          }

          sub vcl_recv {
                 if (req.request == "PURGE") {
                         if (!client.ip ~ purge) {
                                 error 405 "Not allowed.";
                         }
                         lookup;
                 }

                 if (req.http.host ~ "^blog.s135.com") {
                         set req.backend = myblogserver;
                         if (req.request != "GET" && req.request != "HEAD") {
                                 pipe;
                         }
                         else {
                                 lookup;
                         }
                 }
                 else {
                         error 404 "Zhang Yan Cache Server";
                         lookup;
                 }
          }

          sub vcl_hit {
                 if (req.request == "PURGE") {
                         set obj.ttl = 0s;
                         error 200 "Purged.";
                 }
          }

          sub vcl_miss {
                 if (req.request == "PURGE") {
                         error 404 "Not in cache.";
                 }
          }

          sub vcl_fetch {
                 if (req.request == "GET" && req.url ~ "\.(txt|js)$") {
                         set obj.ttl = 3600s;
                 }
                 else {
                         set obj.ttl = 30d;
                 }
          }

          這里,我對這段配置文件解釋一下:
          (1)、Varnish通過反向代理請求后端IP為192.168.0.5,端口為80的web服務器;
          (2)、Varnish允許localhost、127.0.0.1、192.168.0.***三個來源IP通過PURGE方法清除緩存;
          (3)、Varnish對域名為blog.s135.com的請求進行處理,非blog.s135.com域名的請求則返回“Zhang Yan Cache Server”;
          (4)、Varnish對HTTP協議中的GET、HEAD請求進行緩存,對POST請求透過,讓其直接訪問后端Web服務器。之所以這樣配置,是因為POST請求一般是發送數據給服務器的,需要服務器接收、處理,所以不緩存;
          (5)、Varnish對以.txt和.js結尾的URL緩存時間設置1小時,對其他的URL緩存時間設置為30天。

          5、啟動Varnish
          ulimit -SHn 51200
          /usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on


          6、啟動varnishncsa用來將Varnish訪問日志寫入日志文件:
          /usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &


          7、配置開機自動啟動Varnish
          vi /etc/rc.local

          在末尾增加以下內容:
          引用
          ulimit -SHn 51200
          /usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
          /usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &


          8、優化Linux內核參數
          vi /etc/sysctl.conf

          在末尾增加以下內容:
          引用
          net.ipv4.tcp_fin_timeout = 30
          net.ipv4.tcp_keepalive_time = 300
          net.ipv4.tcp_syncookies = 1
          net.ipv4.tcp_tw_reuse = 1
          net.ipv4.tcp_tw_recycle = 1
          net.ipv4.ip_local_port_range = 5000    65000



          再看看如何管理Varnish:
          1、查看Varnish服務器連接數與命中率:
          /usr/local/varnish/bin/varnishstat

          點擊在新窗口中瀏覽此圖片

          2、通過Varnish管理端口進行管理:
          用help看看可以使用哪些Varnish命令:
          /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help

          引用
          Available commands:
          ping [timestamp]
          status
          start
          stop
          stats
          vcl.load
          vcl.inline
          vcl.use
          vcl.discard
          vcl.list
          vcl.show
          param.show [-l] [
          ]
          param.set
          help [command]
          url.purge
          dump.pool

          3、通過Varnish管理端口,使用正則表達式批量清除緩存:
          (1)、例:清除類似http://blog.s135.com/a/zhangyan.html的URL地址):
          /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/

          (2)、例:清除類似http://blog.s135.com/tech的URL地址:
          /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$

          (3)、例:清除所有緩存:
          /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$


          4、一個清除Squid緩存的PHP函數(清除Varnish緩存同樣可以使用該函數,無需作任何修改,十分方便):
          1. <?php   
          2. function purge($ip$url)   
          3. {   
          4.     $errstr = '';   
          5.     $errno = '';   
          6.     $fp = fsockopen ($ip, 80, $errno$errstr, 2);   
          7.     if (!$fp)   
          8.     {   
          9.          return false;   
          10.     }   
          11.     else  
          12.     {   
          13.         $out = "PURGE $url HTTP/1.1\r\n";   
          14.         $out .= "Host:blog.s135.com\r\n";   
          15.         $out .= "Connection: close\r\n\r\n";   
          16.         fputs ($fp$out);   
          17.         $out = fgets($fp , 4096);   
          18.         fclose ($fp);   
          19.         return true;   
          20.     }   
          21. }   
          22.   
          23. purge("192.168.0.4""/index.php");   
          24. ?>  


          附1:Varnish官方網站:http://www.varnish-cache.org/

          附2:2007年12月10日,我寫了一個每天0點運行,按天切割Varnish日志,生成一個壓縮文件,同時刪除上個月舊日志的腳本(/var/logs/cutlog.sh):
          /var/logs/cutlog.sh文件內容如下:
          引用
          #!/bin/sh
          # This file run at 00:00
          date=$(date -d "yesterday" +"%Y-%m-%d")
          pkill -9 varnishncsa
          mv /var/logs/youvideo.log /var/logs/${date}.log
          /usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &
          mkdir -p /var/logs/youvideo/
          gzip -c /var/logs/${date}.log > /var/logs/youvideo/${date}.log.gz
          rm -f /var/logs/${date}.log
          rm -f /var/logs/youvideo/$(date -d "-1 month" +"%Y-%m*").log.gz

          設置在每天00:00定時執行:
          /usr/bin/crontab -e
          或者
          vi /var/spool/cron/root
          輸入以下內容:
          引用
          0 0 * * * /bin/sh /var/logs/cutlog.sh



          Tags: , , ,
          技術大類 » Cache與存儲 | 評論(42) | 引用(0) | 閱讀(24422)
          Jacky
          2007-12-3 10:28
          varnish如何做到在不重啟的情況下重新載入配置文件
          Jacky
          2007-12-3 10:29
          用varnish做反向代理的時候,登錄一般的網站沒有任何問題。登錄DZ論壇的后臺出現無法登錄,沒有任何提示。用squid就沒有這樣的問題,不知道那位老大遇到過這樣的問題。
          張宴 回復于 2007-12-5 19:08
          出問題是肯定的,因為本文中的Varnish配置將緩存所有類型的文件,而你使用squid之所以正常,是因為在squid配置文件中沒有配置去緩存php文件。同樣,對于Varnish,你可以選擇不緩存.php文件,修改vcl.conf配置文件:
          if (req.request != "GET" && req.request != "HEAD") {
            pipe;
          }
          elseif(req.url ~ "\.(php|cgi)($|\?)") {
            pass;
          }
          else {
            lookup;
          }
          itsea
          2007-12-4 23:42
          張兄,今天測了一下varnish,原來用nginx+squid ESTAB連接大概在1700的機器換了varnish后連接數只有300多了,訪問起來一切正常,cacti查看到流量也是正常的,難道varnish就強在這shock?配置是按您的配置做的。
          另外還有個問題vcache這個目錄是用來保存cache文件的是嗎?我在ll vcache里什么文件都沒有。
          還有用varnish這個方法還解決了一直讓我頭疼的squid不支持iis compress問題,實在太感謝了grin
          張宴 回復于 2007-12-5 20:02
          TCP連接數Varnish要比Squid少,因為Varnish的TCP連接釋放要比Squid快。

          但同時處理的請求數Varnish要比Squid高一些,這是我在F5 BIG-IP下的兩臺服務器,一臺Varnish、另一臺Squid,F5 BIG-IP分給它們的連接數相同,Varnish實時處理的請求數比Squid多1倍,平均處理的請求數也比Squid多100余個:

          /usr/local/webserver/varnish/bin/varnishstat
          -----------------------------------------------------------
             70979868       580.97       356.55 Client requests received
             70897998       580.97       356.14 Cache hits

          /usr/local/squid/bin/squidclient -p 80 mgr:5min
          -----------------------------------------------------------
          client_http.requests = 248.425264/sec
          client_http.hits = 245.135282/sec


          如果正常的話,vcache這個目錄里只有一個大小為1G的文件:varnish_cache.data
          itsea
          2007-12-5 10:06
          今天遇到的問題貌似跟樓上說的一樣,varnish做反向代理后dvbbs登陸不正常,用戶登陸后顯示同一個用戶名,驗證碼不變。
          張宴 回復于 2007-12-5 19:21
          同理,有些URL是實時的,不需要被緩存,可以自己修改配置文件,用req.url ~過濾掉這些URL。

          不過,不建議對discus!、dvbbs等別人寫的論壇程序使用Squid、Varnish做緩存,因為這些程序本身就沒有用PURGE指令去刷新Squid、Varnish緩存的功能。

          就連Discuz!的官方論壇www.discuz.net,也只不過對圖片、css、js文件用squid進行了緩存,php等其他文件都是MISS透過:

          http://www.discuz.net/
          Via  1.0 www1.discuz.net:80 (squid)
          X-Cache  MISS from www1.discuz.net
          X-Powered-By  PHP/5.2.4

          http://www.discuz.net/register.php
          Via  1.0 www1.discuz.net:80 (squid)
          X-Cache  MISS from www1.discuz.net
          X-Powered-By  PHP/5.2.4

          http://www.discuz.net/forumdata/cache/style_1.css
          Via  1.0 www1.discuz.net:80 (squid)
          X-Cache  HIT from www1.discuz.net

          http://www.discuz.net/images/default/logo.gif
          Via  1.0 www1.discuz.net:80 (squid)
          X-Cache  HIT from www1.discuz.net
          minuteman
          2007-12-6 16:20
          正好這兩天我在自己的BLOG上也做了varnish緩存的實驗
          用varnishncsa輸出日志,但發現里面有不少日志條目是127.0.0.1來的訪問,覺得比較奇怪,是不是varnishd工作時候產生的?上網找也沒找到相關的解釋。
          老大你有沒有相關知識分享一下?嘿嘿
          leftleg
          2007-12-7 12:50
          discuz 做緩存的話 ,可以試試使用緩存帖子分頁。
          Jacky
          2007-12-7 14:12
          varnish可以實現類似于squid那樣的父子節點關系嗎?
          itsea
          2007-12-7 14:51
          今天在另外一個平臺上使用varnish測試
          增加了
          if (req.request != "GET" && req.request != "HEAD") {
                             pipe;
                           }
                        elseif(req.url ~ "\.(aspx|asp|shtml|vimg)($|\?)") {
                             pass;
                           }
                        else {
                             lookup;
                           }
          }
          后還是偶爾有用戶登陸后顯示別人的用戶名
          而且程序員更新js文件后不能馬上看到
          /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
          purge所有后也不行,還發現一個小問題執行 varnishadm后容易使varnishd父進程吃cpu 100%一直下不來
          我的訪問量在 350 request/sec
          e文的理解能力比較查在man跟官方faq里似乎沒看到類似情況
          minuteman
          2007-12-7 17:57
          緩存不該緩存的對象的問題
          也許可以通過在recv里
             if (req.http.Cache-Control ~ "no-cache") {
                 pass;
             }
          在fetch里加
             if (obj.http.Pragma ~ "no-cache" || obj.http.Cache-Control ~ "no-cache" || obj.http.Cache-Control ~ "private") {
                 pass;
             }
          leftleg
          2007-12-10 16:00
          ping [timestamp]
          status
          start
          stop
          stats
          vcl.load <configname> <filename>
          vcl.inline <configname> <quoted_VCLstring>
          vcl.use <configname>
          vcl.discard <configname>
          vcl.list
          vcl.show <configname>
          param.show [-l] [<param>]
          param.set <param> <value>
          help [command]

          telnet 管理有個 vcl.load 應該可以 不重啟的情況下重新載入配置文件
          小春
          2007-12-20 12:02
          張老師,我裝好了,一切正常,只提到的管理這些功能不正常:
          [root@linux1 ~]# /usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500
          usage: varnishadm -T [address]:port command [...]

          上面命令明明沒有問題,端口監聽也正常.

          [root@linux1 ~]# /usr/local/varnish/bin/varnishstat
          Cannot open /usr/local/varnish/var/varnish/www.38hao.org/_.vsl: No such file or directory
          但是我的,這_.vsl文件明明是在/data/cache目錄下,他非到 /usr/local/varnish/var/varnish/下讀!
          張宴 回復于 2007-12-20 21:31
          /usr/local/varnish/bin/varnishstat -n /data/vcache
          jack
          2007-12-21 09:59
          [root@localhost root]# cat start_cache.sh
          ulimit -SHn 51200
          /usr/local/varnish/sbin/varnishd -n /home/cache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:81 -s file,/home/cache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
          /usr/local/varnish/bin/varnishncsa -n /home/cache -w /home/logs/www.log &
          [root@localhost root]# sh start_cache.sh
          file /home/cache/varnish_cache.data size 1073741824 bytes (262144 fs-blocks, 262144 pages)
          Using old SHMFILE
          [root@localhost root]# netstat -untl
          Active Internet connections (only servers)
          Proto Recv-Q Send-Q Local Address               Foreign Address             State      
          tcp        0      0 0.0.0.0:199                 0.0.0.0:*                   LISTEN      
          tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      
          tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
          tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
          tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
          udp        0      0 0.0.0.0:161                 0.0.0.0:*  

          服務啟動時也不報錯,就是看不到varnish監聽的端口,如何debug? 實在看不出什么問題,
          請張老師指點一下!
          coffee
          2007-12-21 16:49
          (1)、Varnish通過反向代理請求后端IP為192.168.0.5,端口為80的web服務器;
          backend.host  如果有多臺的話 是否也可以象 SQUID 那樣設置在 hosts文件里面,
          (3)、Varnish對域名為blog.s135.com的請求進行處理,非blog.s135.com域名的請求則返回“Zhang Yan Cache Server”;  
          squid 可以根據到目的IP是否符合在判斷是否可以使用 這樣就不用判斷域名 不知道在 Varnish 也可以這樣設置
          阿木
          2007-12-23 08:34
          張老師,我服務器上用varnish+nginx在同一臺機器上跑,運行沒有三分鐘的時候,就開始卡,仍后幾乎網頁打不開。不知道什么原因,而我在本地虛擬環境測試一點問題都沒有,只是本地的是varnish+apache,而線上服務器是varnish+nginx,有點不解,請張老師指點一下,有遇到想關問題的朋友指點一下!
          原來本地是squid+nginx速度飛快,現在是varnish+nginx就卡得不行...
          varnish
          2008-1-4 17:41
          問下varnish 怎么配置 泛域名 的主機,我很很多二級域名,比如 xx.abc.com    ,一個一個加好麻煩。。。squid 或者nginx 都支持 .abc.com 的
          張宴 回復于 2008-1-4 21:24
          if (req.http.host ~ "^blog.s135.com") {
          改成
          if (req.http.host ~ ".abc.com") {
          aiqingno
          2008-1-5 11:38
          張老師,我連菜鳥都算不上。。
          想問問如何,把訪問的地址的IP更換成www.XXXXX.com的類型呢?
          需要什么才可以的嗎?
          antiaiqingno
          2008-1-6 16:56
          需要反向DNS
          xia_you_mu Email
          2008-1-6 18:30
          問個問題,如果要做個全國性的網站負載均衡,可否搭配varnish+F5 bigip實現
          1.varnish專門做cache  Server
          2.F5 Bigip用做服務器負載均衡
          張宴 回復于 2008-1-7 08:16
          F5 BIGIP + Varnish是可行的,但是Varnish的緩存基本上在內存中,如果Varnish進程停止再啟動,Varnish就會重新訪問后端Web服務器。
          還有種方案就是F5 BIGIP + Squid,Squid的緩存會保持在磁盤和內存,雖然Squid性能沒有Varnish高,但它停止、重啟的時候,可以直接先從磁盤讀取緩存數據。
          代碼罐頭
          2008-1-9 15:36
          引用
          F5 BIGIP + Varnish是可行的,但是Varnish的緩存基本上在內存中,如果Varnish進程停止再啟動,Varnish就會重新訪問后端Web服務器。
          還有種方案就是F5 BIGIP + Squid,Squid的緩存會保持在磁盤和內存,雖然Squid性能沒有Varnish高,但它停止、重啟的時候,可以直接先從磁盤讀取緩存數據。


          這樣的話.重啟Varnish會導致邊緣節點訪問一定時間內卡一下吧?
          內存方式雖然快.但是這點上會很郁悶了.
          powerv
          2008-1-16 01:45
          張老師:我出現如下錯誤
          101 32      
          all commands are in lower-case.

          我的配置是這樣的 Varnish 和 nginx 同在一臺機器上,沒辦法,只有一臺機器。我把Varnish配置為公網的80,如 210.21.21.21:80 這樣,nginx配置為:127.0.0.1:80 啟動是正常的,但訪問時出現
          101 32      
          all commands are in lower-case.

          請教一下怎樣解決。
          代碼罐頭
          2008-1-16 12:42
          sub vcl_hit {
                if (req.request == "PURGE") {
                        set obj.ttl = 0s;
                        error 200 "Purged.";
                }
          }

          這段不是很理解
          每次獲取到以后就把生存期設置成0?
          那么不是每次請求都是分發去backend了?
          沒有起到cache的作用了?
          張宴 回復于 2008-1-16 14:50
          HTTP協議通常有三種方法,GET、HEAD和POST。而PURGE是一種由Squid作者定義的非HTTP官方方法,用來清除Squid緩存,我為了兼容Squid,也沿用Squid的PURGE方法來清除Varnish緩存。

          通過瀏覽器訪問一個URL地址,發送的HTTP請求頭是:
          GET http://www.abc.com/test.php
          當遇到GET或HEAD方法,Varnish會從緩存中返回網頁:

          當從瀏覽器提交表單時(請求頭中的方法為POST),需要透過Varnish將信息傳遞給后端Web服務器上的PHP程序處理,下面這幾行表示如果請求頭中的方法不是GET和HEAD,則透過Varnish訪問后端Web服務器:
          if (req.request != "GET" && req.request != "HEAD") {
          pipe;
          }

          當遇到PURGE方法時,Varnishd會set obj.ttl = 0s;使某個URL的緩存失效,從而達到刷新Varnish緩存的目的。Varnish配置了只接收并處理以下IP發送PURGE請求:
          acl purge {
                "localhost";
                "127.0.0.1";
                "192.168.1.0"/24;
          }
          代碼罐頭
          2008-1-16 17:21
          謝謝.今天看到varnish沒有txt格式的help和sample.
          倒是man里面非常詳細.
          powerv
          2008-1-19 18:30
          不知道大家DZ后臺登陸問題解決沒有,有的話請給個方案。我按
          if (req.request != "GET" && req.request != "HEAD") {
           pipe;
          }
          elseif(req.url ~ "\.(php|cgi)($|\?)") {
           pass;
          }
          else {
           lookup;
          }
          也還是沒解決。PHP是沒被緩存,但還是無法登陸后臺。
          25hours
          2008-2-1 15:18
          看你的數據,跑得相當不錯
          我測試了下,當varnish創建了100多個worker后
          varnishlog -i debug出現大量的 Create worker thread failed 12 Cannot allocate memory錯誤,還沒發現該如何解決,我的環境是dell2950 4g mem/rhel4u4
          1
          2008-2-26 18:14
          有沒有加速網頁刷新后不變的加速器
          雞尾酒
          2008-3-16 22:01
          squid可以批量刪除,需要安裝purge
          然后squid用acl給purge的權限。
          geminis
          2008-3-17 17:19
          這個軟件不知道是否支持 反向代理??
          gerry
          2008-4-1 18:20
          sir,我發現varnish在日志操過2G的時候就不寫日志了,哪個參數可以修改?
          redhat9
          2008-6-20 11:10
          張哥
          請教你個問題
          我采用單機做下載服務器,本機varnish運行在80端口,nginx在81
          下載的文件夾中的exe文件很快,但是下載其它的文件,比如:zip\dat\等文件就很慢,時常報
          503 Service Temporarily Unavailable

          還有就是dat文件我是要下載,但在IE中打開絕對路徑.卻是把文件中的內容給解釋出來了,
          請幫幫我,應該如何配置!
          謝謝
          likuku Email Homepage
          2008-6-20 17:59
          我們試用時,發現 varnish 在將 virtual memory 占用達到 3G 時( linux 的 top 顯示), cache 命中率會直接返回到 0%, 似乎是 varnish 的處理程序自動 reset 了,不知這個是個已知的 bug 還是什么其他問題?

          這個故障在我這里是反復出現。
          網友一個
          2008-6-24 16:34
          張老師你好。我按照你這個成功建立了。
          但是,有寫命令卻用不了。比如/usr/local/varnish/bin/varnishstat,好像是沒有編譯好。不知道為什么
          Kevin Homepage
          2008-7-2 16:36
          您好,請問Varnish配置生效除了重啟以外沒有別的辦法么?
          另外,vcl.conf控制訪問的時候不支持非運算么?
          我想實現除了所有的靜態文件都轉發到后臺的web服務器,但是好像失敗了
          if (req.http.host ~ ".test.com") {
                        set req.backend = webserver;
                        if (req.request != "GET" && req.request != "HEAD") {
                                pipe;
                        }
                         elseif(req.url !~ "\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|htm|html)($|\?)") {
                                pass;
                        }
                        else {
                                lookup;
                        }
                }
          yyjun2008 Email
          2008-8-28 11:59
          varnish 做代理服務cache 怎么實現?
          yyrjw
          2008-8-29 09:50
          varnish 2.0出來了,不知道張大哥對其參數設置有沒有做過測試,想把1.2升到2.0,具體的參數調優不大清楚
          freeke Email
          2008-9-4 10:25
          強烈支持張老師再將這個版本更新V2
          dell
          2008-9-11 18:05
          /usr/local/varnish/bin/varnishstat  執行這個命令的時候.全是0.怎么回事
          chaing
          2008-10-10 16:22
          引用
          /usr/local/varnish/bin/varnishstat  執行這個命令的時候.全是0.怎么回事

          說明varnish沒有起作用,查看下配置文件
          hello
          2008-10-30 09:49
          請問如何緩存動態網頁?
          meikuai Email
          2008-11-26 18:32
          請問 varnish只用內存做緩存, 機器 如果內存只有2G, 但緩存的內容 有幾十G,是不是就不合適用它呢, 另外大的(超過2m)文件,也不適合用它吧。 這點還是squid 比較合適。
          張宴 回復于 2008-11-26 18:41
          是的。
          key
          2008-12-30 18:24
          我的網站架構是:
          前端是一個LVS,后端是apache+tomcat,假設域名www.dayan.com指向LVS的59.141.45.67這個IP
          例如:
          TCP  59.141.45.67:80 wlc persistent 900
           -> 192.168.1.116:80            
           -> 192.168.1.113:80          
          后端的192.168.1.116和192.168.1.113是用的apache+tomcat,準備加varnish cache
          現在已經是把動態和靜態分開了,現在就是想把靜態的做varnish cache

          不知道這樣的架構varnish cache 加在什么地方,是LVS上,還是其他的機器上
          比如說我的域名是www.dayan.com指向的是LVS的IP,當我訪問www.yan.com的時候它首先訪問LVS,
          然后通過LVS分到兩臺realserver,那cache是怎么樣調用的呢,這塊有點迷惑

          請張宴老師指點指點!!!!
          狂亂
          2009-5-12 12:28
          有最新版的說明么?現在最新2.0.4沒有辦法按照你的安裝
          一刀砍死
          2009-7-21 17:09
          引用
          網友一個2008-6-24 16:34
          張老師你好。我按照你這個成功建立了。
          但是,有寫命令卻用不了。比如/usr/local/varnish/bin/varnishstat,好像是沒有編譯好。不知道為什么

          沒有ncurses-devel


          posted @ 2009-08-08 09:42 小馬歌 閱讀(988) | 評論 (0)編輯 收藏
           
          from http://user.qzone.qq.com/174658021/blog/1249104620

          Linux系統出現問題時,我們不僅需要查看系統日志信息,而且還要使用大量的性能監測工具來判斷究竟是哪一部分(內存、CPU、硬盤……)出了問題。在Linux系統中,所有的運行參數保存在虛擬目錄/proc中,換句話說,我們使用的性能監控工具取到的數據值實際上就是源自于這個目錄,當涉及到系統高估時,我們就可以修改/proc目錄中的相關參數了,當然有些是不能亂改的。下面就讓我們了解一下這些常用的性能監控工具。
          1、uptime
          uptime命令用于查看服務器運行了多長時間以及有多少個用戶登錄,快速獲知服務器的負荷情況。

          uptime的輸出包含一項內容是load average,顯示了最近1,5,15分鐘的負荷情況。它的值代表等待CPU處理的進程數,如果CPU沒有時間處理這些進程,load average值會升高;反之則會降低。
          load average的最佳值是1,說明每個進程都可以馬上處理并且沒有CPU cycles被丟失。對于單CPU的機器,1或者2是可以接受的值;對于多路CPU的機器,load average值可能在8到10之間。
          也可以使用uptime命令來判斷網絡性能。例如,某個網絡應用性能很低,通過運行uptime查看服務器的負荷是否很高,如果不是,那么問題應該是網絡方面造成的。
          以下是uptime的運行實例:
          9:24am up 19:06, 1 user, load average: 0.00, 0.00, 0.00
          也可以查看/proc/loadavg和/proc/uptime兩個文件,注意不能編輯/proc中的文件,要用cat等命令來查看,如:
          liyawei:~ # cat /proc/loadavg
          0.00 0.00 0.00 1/55 5505

          2、dmesg
          dmesg命令主要用來顯示內核信息。使用dmesg可以有效診斷機器硬件故障或者添加硬件出現的問題。
          另外,使用dmesg可以確定您的服務器安裝了那些硬件。每次系統重啟,系統都會檢查所有硬件并將信息記錄下來。執行/bin/dmesg命令可以查看該記錄。
          dmesg輸入實例:
          ReiserFS: hda6: checking transaction log (hda6)
          ReiserFS: hda6: Using r5 hash to sort names
          Adding 1044184k swap on /dev/hda5. Priority:-1 extents:1 across:1044184k
          parport_pc: VIA 686A/8231 detected
          parport_pc: probing current configuration
          parport_pc: Current parallel port base: 0×378
          parport0: PC-style at 0×378 (0×778), irq 7, using FIFO [PCSPP,TRISTATE,COMPAT,ECP]
          parport_pc: VIA parallel port: io=0×378, irq=7
          lp0: using parport0 (interrupt-driven).
          e100: Intel(R) PRO/100 Network Driver, 3.5.10-k2-NAPI
          e100: Copyright(c) 1999-2005 Intel Corporation
          ACPI: PCI Interrupt 0000:00:0d.0[A] -> GSI 17 (level, low) -> IRQ 169
          e100: eth0: e100_probe: addr 0xd8042000, irq 169, MAC addr 00:02:55:1E:35:91
          usbcore: registered new driver usbfs
          usbcore: registered new driver hub
          hdc: ATAPI 48X CD-ROM drive, 128kB Cache, UDMA(33)
          Uniform CD-ROM driver Revision: 3.20
          USB Universal Host Controller Interface driver v2.3

          3、top
          top命令顯示處理器的活動狀況。缺省情況下,顯示占用CPU最多的任務,并且每隔5秒鐘做一次刷新。
          Process priority的數值決定了CPU處理進程的順序。LIUNX內核會根據需要調整該數值的大小。nice value局限于priority。priority的值不能低于nice value(nice value值越低,優先級越高)。您不可以直接修改Process priority的值,但是可以通過調整nice level值來間接地改變Process priority值,然而這一方法并不是所有時候都可用。如果某個進程運行異常的慢,可以通過降低nice level為該進程分配更多的CPU。
          Linux 支持的 nice levels 由19 (優先級低)到-20 (優先級高),缺省值為0。
          執行/bin/ps命令可以查看到當前進程的情況。

          4、iostat
          iostat由Red Hat Enterprise Linux AS發布。同時iostat也是Sysstat的一部分,可以下載到,網址是
          http://perso.wanadoo.fr/sebastien.godard/
          執行iostat命令可以從系統啟動之后的CPU平均時間,類似于uptime。除此之外,iostat還對創建一個服務器磁盤子系統的活動報告。該報告包含兩部分:CPU使用情況和磁盤使用情況。
          iostat顯示實例:
          avg-cpu: %user %nice %system %iowait %steal %idle
          0.16 0.01 0.03 0.10 0.00 99.71
          Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
          hda 0.31 4.65 4.12 327796 290832
          avg-cpu: %user %nice %system %iowait %steal %idle
          1.00 0.00 0.00 0.00 0.00 100.00
          Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
          hda 0.00 0.00 0.00 0 0
          avg-cpu: %user %nice %system %iowait %steal %idle
          0.00 0.00 0.00 0.00 0.00 99.01
          Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
          hda 0.00 0.00 0.00 0 0
          CPU占用情況包括四塊內容
          %user:顯示user level (applications)時,CPU的占用情況。
          %nice:顯示user level在nice priority時,CPU的占用情況。
          %sys:顯示system level (kernel)時,CPU的占用情況。
          %idle: 顯示CPU空閑時間所占比例。
          磁盤使用報告分成以下幾個部分:
          Device: 塊設備的名字
          tps: 該設備每秒I/O傳輸的次數。多個I/O請求可以組合為一個,每個I/O請求傳輸的字節數不同,因此可以將多個I/O請求合并為一個。
          Blk_read/s, Blk_wrtn/s: 表示從該設備每秒讀寫的數據塊數量。塊的大小可以不同,如1024, 2048 或 4048字節,這取決于partition的大小。
          例如,執行下列命令獲得設備/dev/sda1 的數據塊大?。?br /> dumpe2fs -h /dev/sda1 |grep -F “Block size”
          輸出結果如下
          dumpe2fs 1.34 (25-Jul-2003)
          Block size: 1024
          Blk_read, Blk_wrtn: 指示自從系統啟動之后數據塊讀/寫的合計數。
          也可以查看這幾個文件/proc/stat,/proc/partitions,/proc/diskstats的內容。

          5、vmstat
          vmstat提供了processes, memory, paging, block I/O, traps和CPU的活動狀況
          procs ———–memory———- —swap– —–io—- -system– —–cpu——
          r b swpd free buff cache si so bi bo in cs us sy id wa st
          1 0 0 513072 52324 162404 0 0 2 2 261 32 0 0 100 0 0
          0 0 0 513072 52324 162404 0 0 0 0 271 43 0 0 100 0 0
          0 0 0 513072 52324 162404 0 0 0 0 255 27 0 0 100 0 0
          0 0 0 513072 52324 162404 0 0 0 28 275 51 0 0 97 3 0
          0 0 0 513072 52324 162404 0 0 0 0 255 21 0 0 100 0 0
          各輸出列的含義:
          Process
          – r: The number of processes waiting for runtime.
          – b: The number of processes in uninterruptable sleep.
          Memory
          – swpd: The amount of virtual memory used (KB).
          – free: The amount of idle memory (KB).
          – buff: The amount of memory used as buffers (KB).
          Swap
          – si: Amount of memory swapped from the disk (KBps).
          – so: Amount of memory swapped to the disk (KBps).
          IO
          – bi: Blocks sent to a block device (blocks/s).
          – bo: Blocks received from a block device (blocks/s).
          System
          – in: The number of interrupts per second, including the clock.
          – cs: The number of context switches per second.
          CPU (these are percentages of total CPU time)
          - us: Time spent running non-kernel code (user time, including nice time).
          – sy: Time spent running kernel code (system time).
          – id: Time spent idle. Prior to Linux 2.5.41, this included IO-wait time.
          – wa: Time spent waiting for IO. Prior to Linux 2.5.41, this appeared as zero.

          6、sar
          sar是Red Hat Enterprise Linux AS發行的一個工具,同時也是Sysstat工具集的命令之一,可以從以下網址下載:
          http://perso.wanadoo.fr/sebastien.godard/
          sar用于收集、報告或者保存系統活動信息。sar由三個應用組成:sar顯示數據、sar1和sar2用于收集和保存數據。
          使用sar1和sar2,系統能夠配置成自動抓取信息和日志,以備分析使用。配置舉例:在/etc/crontab中添加如下幾行內容
          同樣的,你也可以在命令行方式下使用sar運行實時報告。如圖所示:
          從收集的信息中,可以得到詳細的CPU使用情況(%user, %nice, %system, %idle)、內存頁面調度、網絡I/O、進程活動、塊設備活動、以及interrupts/second
          liyawei:~ # sar -u 3 10
          Linux 2.6.16.21-0.8-default (liyawei) 05/31/07
          10:17:16 CPU %user %nice %system %iowait %idle
          10:17:19 all 0.00 0.00 0.00 0.00 100.00
          10:17:22 all 0.00 0.00 0.00 0.33 99.67
          10:17:25 all 0.00 0.00 0.00 0.00 100.00
          10:17:28 all 0.00 0.00 0.00 0.00 100.00
          10:17:31 all 0.00 0.00 0.00 0.00 100.00
          10:17:34 all 0.00 0.00 0.00 0.00 100.00

          7、KDE System Guard
          KDE System Guard (KSysguard) 是KDE圖形方式的任務管理和性能監視工具。監視本地及遠程客戶端/服務器架構體系的中的主機。

          8、free
          /bin/free命令顯示所有空閑的和使用的內存數量,包括swap。同時也包含內核使用的緩存。
          total used free shared buffers cached
          Mem: 776492 263480 513012 0 52332 162504
          -/+ buffers/cache: 48644 727848
          Swap: 1044184 0 1044184

          9、Traffic-vis
          Traffic-vis是一套測定哪些主機在IP網進行通信、通信的目標主機以及傳輸的數據量。并輸出純文本、HTML或者GIF格式的報告。
          注:Traffic-vis僅僅適用于SUSE LINUX ENTERPRISE SERVER。
          如下命令用來收集網口eth0的信息:
          traffic-collector -i eth0 -s /root/output_traffic-collector
          可以使用killall命令來控制該進程。如果要將報告寫入磁盤,可使用如下命令:
          killall -9 traffic-collector
          要停止對信息的收集,執行如下命令:killall -9 traffic-collector
          注意,不要忘記執行最后一條命令,否則會因為內存占用而影響性能。
          可以根據packets, bytes, TCP連接數對輸出進行排序,根據每項的總數或者收/發的數量進行。
          例如根據主機上packets的收/發數量排序,執行命令:
          traffic-sort -i output_traffic-collector -o output_traffic-sort -Hp
          如要生成HTML格式的報告,顯示傳輸的字節數,packets的記錄、全部TCP連接請求和網絡中每臺服務器的信息,請運行命令:
          traffic-tohtml -i output_traffic-sort -o output_traffic-tohtml.html
          如要生成GIF格式(600X600)的報告,請運行命令:
          traffic-togif -i output_traffic-sort -o output_traffic-togif.gif -x 600 -y 600
          GIF格式的報告可以方便地發現網絡廣播,查看哪臺主機在TCP網絡中使用IPX/SPX協議并隔離網絡,需要記住的是,IPX是基于廣播包的協議。如果我們需要查明例如網卡故障或重復IP的問題,需要使用特殊的工具。例如SUSE LINUX Enterprise Server自帶的Ethereal。
          技巧和提示:使用管道,可以只需執行一條命令來產生報告。如生成HTML的報告,執行命令:
          cat output_traffic-collector | traffic-sort -Hp | traffic-tohtml -o output_traffic-tohtml.html
          如要生成GIF文件,執行命令:
          cat output_traffic-collector | traffic-sort -Hp | traffic-togif -o output_traffic-togif.gif -x 600 -y 600

          10、pmap
          pmap可以報告某個或多個進程的內存使用情況。使用pmap判斷主機中哪個進程因占用過多內存導致內存瓶頸。
          pmap
          liyawei:~ # pmap 1
          1: init
          START SIZE RSS DIRTY PERM MAPPING
          08048000 484K 244K 0K r-xp /sbin/init
          080c1000 4K 4K 4K rw-p /sbin/init
          080c2000 144K 24K 24K rw-p [heap]
          bfb5b000 84K 12K 12K rw-p [stack]
          ffffe000 4K 0K 0K —p [vdso]
          Total: 720K 284K 40K
          232K writable-private, 488K readonly-private, and 0K shared

          11、strace
          strace截取和記錄系統進程調用,以及進程收到的信號。是一個非常有效的檢測、指導和調試工具。系統管理員可以通過該命令容易地解決程序問題。
          使用該命令需要指明進程的ID(PID),例如:
          strace -p
          # strace –p 2582
          rt_sigprocmask(SIG_SETMASK, [], NULL, = 0
          read(7, “\”\\\”\\\\\\\”\\\\\\\\\\\\\\\”\\\\\\\\\\\\\\\\\\\\\\\\”…, 16384) = 321
          write(3, “}H\331q\37\275$\271\t\311M\304$\317~)R9\330Oj\304\257\327″…, 360) = 360
          select(8, [3 4 7], [3], NULL, NULL) = 2 (in [7], out [3])
          rt_sigprocmask(SIG_BLOCK, [CHLD], [], = 0
          rt_sigprocmask(SIG_SETMASK, [], NULL, = 0
          read(7, “\”\\\”\\\\\\\”\\\\\\\\\\\\\\\”\\\\\\\\\\\\\\\\\\\\\\\\”…, 16384) = 323
          write(3, “\204\303\27$\35\206\\\306VL\370\5R\200\226\2\320^\253\253″…, 360) = 360
          select(8, [3 4 7], [3], NULL, NULL) = 2 (in [7], out [3])
          rt_sigprocmask(SIG_BLOCK, [CHLD], [], = 0
          rt_sigprocmask(SIG_SETMASK, [], NULL, = 0
          read(7, “\”\\\”\\\\\\\”\\\\\\\\\\\\\\\”\\\\\\\\\\\\\\\\\\\\\\\\”…, 16384) = 323
          write(3, “\243\207\204\277Cw162\2ju=\205\’L\352?0J\256I\376\32″…, 360) = 360
          select(8, [3 4 7], [3], NULL, NULL) = 2 (in [7], out [3])
          rt_sigprocmask(SIG_BLOCK, [CHLD], [], = 0
          rt_sigprocmask(SIG_SETMASK, [], NULL, = 0
          read(7, “\”\\\”\\\\\\\”\\\\\\\\\\\\\\\”\\\\\\\\\\\\\\\\\\\\\\\\”…, 16384) = 320
          write(3, “6\270S\3i\310\334\301\253!ys\324\’\234%\356\305\26\233″…, 360) = 360
          select(8, [3 4 7], [3], NULL, NULL) = 2 (in [7], out [3])
          rt_sigprocmask(SIG_BLOCK, [CHLD], [], = 0
          rt_sigprocmask(SIG_SETMASK, [], NULL, = 0

          12、ulimit
          ulimit內置在bash shell中,用來提供對shell和進程可用資源的控制
          liyawei:~ # ulimit -a
          core file size (blocks, -c) 0
          data seg size (kbytes, -d) unlimited
          file size (blocks, -f) unlimited
          pending signals (-i) 6143
          max locked memory (kbytes, -l) 32
          max memory size (kbytes, -m) unlimited
          open files (-n) 1024
          pipe size (512 bytes, -p) 8
          POSIX message queues (bytes, -q) 819200
          stack size (kbytes, -s) 8192
          cpu time (seconds, -t) unlimited
          max user processes (-u) 6143
          virtual memory (kbytes, -v) unlimited
          file locks (-x) unlimited
          -H和-S選項指明所給資源的軟硬限制。如果超過了軟限制,系統管理員會收到警告信息。硬限制指在用戶收到超過文件句炳限制的錯誤信息之前,可以達到的最大值。
          例如可以設置對文件句炳的硬限制:ulimit -Hn 4096
          例如可以設置對文件句炳的軟限制:ulimit -Sn 1024
          查看軟硬值,執行如下命令:
          ulimit -Hn
          ulimit -Sn
          例如限制Oracle用戶. 在/etc/security/limits.conf輸入以下行:
          soft nofile 4096
          hard nofile 10240
          對于Red Hat Enterprise Linux AS,確定文件/etc/pam.d/system-auth包含如下行
          session required /lib/security/$ISA/pam_limits.so
          對于SUSE LINUX Enterprise Server,確定文件/etc/pam.d/login 和/etc/pam.d/sshd包含如下行:
          session required pam_limits.so
          這一行使這些限制生效。

          13、mpstat
          mpstat是Sysstat工具集的一部分,下載地址是
          http://perso.wanadoo.fr/sebastien.godard/
          mpstat用于報告多路CPU主機的每顆CPU活動情況,以及整個主機的CPU情況。
          例如,下邊的命令可以隔2秒報告一次處理器的活動情況,執行3次
          mpstat 2 3
          liyawei:~ # mpstat 2 3
          Linux 2.6.16.21-0.8-default (liyawei) 05/31/07
          10:23:03 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
          10:23:05 all 0.50 0.00 0.00 1.99 0.00 0.00 0.00 97.51 271.64
          10:23:07 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 261.00
          10:23:09 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 261.50
          Average: all 0.17 0.00 0.00 0.67 0.00 0.00 0.00 99.17 264.73
          如下命令每隔1秒顯示一次多路CPU主機的處理器活動情況,執行3次
          mpstat -P ALL 1 3
          liyawei:~ # mpstat -P ALL 1 10
          Linux 2.6.16.21-0.8-default (liyawei) 05/31/07
          10:23:31 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
          10:23:32 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 273.00
          10:23:32 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 272.00
          10:23:33 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 254.00
          10:23:33 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 254.00
          10:23:34 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 271.00
          10:23:34 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 271.00
          10:23:35 all 0.00 0.00 0.00 1.98 0.00 0.00 0.00 98.02 254.46
          10:23:35 0 0.00 0.00 0.00 1.98 0.00 0.00 0.00
          posted @ 2009-08-02 20:08 小馬歌 閱讀(238) | 評論 (0)編輯 收藏
           

          visible_hostname squid1.abc.com

          #設定squid的主機名,如無此項squid將無法啟動

          http_port 
          80 accel vhost vport

          #設定squid為accel加速模式,vhost必須要加.否則將無法將主機頭轉發至后端服務器,訪問時就會出現無法找到主機頭的錯誤

          cache_peer 
          192.168.1.88 parent 80 0 no-query originserver name=contentchina

          cache_peer 
          192.168.1.88 parent 80 0 no-query originserver name=bbs

          cache_peer 
          192.168.1.1 parent 80 0 no-query originserver name=ihompy

          #定義不同的父節點,將節點設為no-query以及originserver說明這些節點是實際服務器

          cache_peer_domain contentchina 
          aaa.abc.com

          cache_peer_domain bbs bbb.abc.com

          cache_peer_domain ihompy ccc.abc.com

          #設定不同域名轉發到不同的cache_peer上,如果沒有這項.不同域名的域名可能被分發到同一臺服務器上.

          acl all src 
          0.0.0.0/0.0.0.0

          no_cache deny all

          http_access allow all

          #允許所有客戶端訪問

          cache_log /var/log/squid/cache.log

          #記錄日志

          #***********ACL存取控制*************

          #acl QueryString url_regex .php?

          #***********緩沖存取控制*************

          #no_cache deny QueryString

          #不對符合QueryString的ACL內容進行緩沖

          #***********性能優化配置*************

          maximum_object_size 
          320010 KB

          #大于此容量的對象將不會被保存在磁盤上,默認大小是4M,如果squid服務器用于緩沖flash等大型文件,建議將此值變大.否則過大的文件在下次重啟后將需要重新獲取

          maximum_object_size_in_memory 
          100 KB

          #最大位于內存中的對象的大小,默認大小是8K,如果服務器內存很大.可以適當提高此值的大小,建議根據網站的80%圖片的大小來定.或者根據WEB服務器實際存取文件中最常訪問的文件大小來定制

          #***********其他可選配置*************

          #dns_nameservers 
          10.0.0.1 192.172.0.4

          #配置DNS服務器地址.獲取后端時將從此dns獲取IP地址

          #cache_mgr ggg_g@tom.com

          #在錯誤日志中出現的webmaster地址.

          posted @ 2009-07-28 11:51 小馬歌 閱讀(1881) | 評論 (1)編輯 收藏
           
          做為眼下最流行的操作系統,Linux已經越來越受到世人的關注。雖然目前Linux的軟件還不是很豐富,替代WINDOWS作為普通PC機操作系統還為時過早,但是在服務器領域,Linux的穩定性,可操作性決不輸于任何操作系統,并且也有優秀的軟件支持。Squid就是其中之一。Linux加Squid的組合做為代理服務器,性能遠遠超過WINNT加MSPROXY2.0(個人觀點),為幾百人的小型局域網代理綽綽有余。下面,我就詳細的介紹Squid 的安裝及使用技巧,希望大家能夠喜歡上它。
          1.Squid 簡介
            Squid 是一個緩存internet數據的一個軟件,它接收用戶的下載申請,并自動處理所下載的數據。也就是說,當一個用戶象要下載一個主頁時,它向Squid 發出一個申請,要Squid 替它下載,然后Squid連接所申請網站并請求該主頁,接著把該主頁傳給用戶同時保留一個備份,當別的用戶申請同樣的頁面時,Squid 把保存的備份立即傳給用戶,使用戶覺得速度相當快。目前,Squid 可以代理HTTP, FTP, GOPHER, SSL 和 WAIS 協議,暫不能代理POP, NNTP等協議。不過,已經有人開始修改Squid,相信不久的將來,Squid能夠代理這些協議。
            Squid能夠緩存任何數據嗎?不是的。象緩存信用卡帳號、可以遠方執行的scripts、經常變換的主頁等是不合適的也是不安全的。Squid可以自動的進行處理,你也可以根據自己的需要設置Squid,使之過濾掉你不想要的東西。
            Squid可以工作在很多的操作系統中,如AIX, Digital Unix, FreeBSD, HP-UX, Irix, Linux, NetBSD, Nextstep, SCO, Solaris,OS/2等,也有不少人在其他操作系統中重新編譯過Squid。
            Squid對硬件的要求是內存一定要大,不應小于128M,硬盤轉速越快越好,最好使用服務器專用SCSI硬盤,處理器要求不高,400MH以上既可。
          2. Squid的編譯和運行
            其實現在的Linux發行套件中基本都有已經編譯好的Squid,你所作的就是安裝它既可。如果你手頭沒有現成的編譯好的Squid或想使用最新的版本,去ftp:squid.nlanr.net下載一份,自己編譯。
            Squid的編譯是非常簡單的,因為它基本上是自己配置自己。最容易出現的問題是你的系統上沒有合適的編譯器,這可以通過安裝相應的編譯器解決。如果出現其他問題,你可以問一下有經驗的用戶或到相應的郵件列表尋找幫助。
            編譯Squid之前,最好建一個專門運行Squid的用戶和組。我就在自己的服務器上建了一個名為squid的用戶和組,用戶目錄設為/usr/local/squid。然后su為用戶squid并從squid.nlanr.net下載Squid的源文件到目錄 /usr/local/squid/src中,用如下命令進行解壓:
           ?。ar xzf squid-2.0.RELEASE-src.tar.gz
           ?。d /usr/local/squid/src/ squid-*.*.RELEASE /
           ?。?/configure
            %make
            %make install
            第一個命令在目錄/usr/local/squid/src中產生一個新的子目錄/squid-*.*.RELEASE/。命令./configure會自動查詢你的系統配置情況以及你系統中使用的頭文件。不加參數的./configure會把Squid安裝在目錄/usr/local/squid中,如果你想使用其他目錄,用如下命令./configure --prefix=/some/other/directory,這會把Squid安裝在目錄/some/other/directory中。make命令編譯Squid,make install命令安裝Squid。
            不出意外的話,目錄/usr/local/squid中會出現如下目錄:
            /bin
            /cache
            /etc
            /logs/
            /src (自己創建的)
            目錄/bin中含有Squid可執行程序,包括Squid本身,ftpget等。
            目錄/cache包含Squid緩存的數據,其中包含象/00/ /01/ /02/ 以及/03/這樣的目錄,這些目錄中還有子目錄,因為目錄多了比在一個目錄成千上萬的文件中尋找一個文件更容易,速度更快。
            目錄/etc中包含Squid的唯一的配置文件squid.conf。
            目錄/logs中包含Squid的日志。
          3. squid.conf文件的配置
            在安裝Squid后,在目錄/usr/local/squid /etc中會自動產生一個樣本squid.conf文件,文件中對每一個選項都有詳細的說明,用戶可以通過修改該文件以滿足不同的需要。
            總的來說,有如下幾個重要選項:
           ???http_port:設定Squid監聽的端口,你最好設一個比較好記的端口號,以便在進行客戶機配置時容易記住。我的機器上端口號設的是8080。缺省為3128。
           ???cache_mem:設定Squid占用的物理內存,根據我的經驗,cache_mem的大小不應超過你的服務器物理內存的三分之一,否則將會影響機器的總體性能。
           ???maximum_object_size:設定Squid可以接收的最大對象的大小。Squid缺省值為4M,我自己入認為太大,你可以根據自己的需要進行設定。
            ?cache_dir:設定緩存的位置、大小。一般看起來形式如下“cache_dir /usr/local/squid/cache 100 16 256”。 /usr/local/squid/cache代表緩存的位置;100代表緩存最大為100M;16和256代表一級和二級目錄數。
           ???cache_effective_user:設定使用緩存的有效用戶。缺省為用戶nobody,如果你的系統中沒有用戶nobody,最好建一個或以非root用戶運行Squid。
            下面我給出一個最簡單的squid.conf文件:
            #squid.conf - a very basic config file for squid
            #Turn logging to its lowest level
            debug_options ALL,1
            #defines a group (or Access Control List) that includes all IP addresses
            acl all src 0.0.0.0/0.0.0.0
            #define RAM used
            cache_mem 32M
            #defines the cache size
            cache_dir /usr/local/squid/cache 100 16 256
            #allow all sites to use connect to us via HTTP
            http_access allow all
            #allow all sites to use us as a sibling
            icp_access allow all
            #test the following sites to check that we are connected
            dns_testnames internic.net usc.edu cs.colorado.edu mit.edu yale.edu
            #run as the squid user
            cache_effective_user squid squid
            這個配置文件允許所有人使用Squid,創建了100M緩存,使用32M內存,在缺省位置"/usr/local/squid/cache"緩存數據,所有緩存數據以組squid和用戶squid身份保存,端口為3128。雖然這個配置很不安全,但是它已經能使用了。
          4. 運行Squid
            首先以root身份登陸。運行如下命令:
           ?。?usr/local/squid/bin/squid ?z
            該命令會產生Squid所有的緩存目錄。
            如果你想前臺執行Squid,接著執行命令:
           ?。?usr/local/squid/bin/squid -NCd1
            該命令正式啟動Squid。如果一切正常,你會看到一行輸出
            Ready to serve requests.
            如果想后臺運行Squid,把它做為一個精靈進程,執行命令:
           ?。?usr/local/squid/bin/squid
            觀察Squid是否運行使用命令:
            % squid -k check
            輸出會告訴你Squid的當前狀態。
            好了,文章先寫到這里,其實這里介紹的都是最基本的東西,Squid有好多高級的功能,如做WEB服務器的高速緩存,做二級代理服務器,做為防火墻,以及怎樣設定過濾規則等,這里就不詳述了,如果有機會再奉獻給大家。
          posted @ 2009-07-28 11:44 小馬歌 閱讀(209) | 評論 (0)編輯 收藏
           
          from : http://i.yoho.cn/logview/278079.html

          以前的squid都是一個同事編譯安裝的,所有我只知道方法,具體安裝沒有去時間過,這次由于網站帶寬吃緊,又購買了兩臺dell的服務器作為squid緩存服務器,以前安裝的同事由于個人原因辭職了,沒辦法,值得自己動手了,第一次安裝基本順利,上架試用,運行一段時間就報錯“WARNING! Your cache is running out of filedescriptors”查看了squid 權威指南,說是squid用完了所有可用文件描述符,按照說明,把squid刪除了,重新編譯,但是還是不行,在網上找了半天,沒找到原因,最后又去看squid 權威指南,終于找到了原因“,./configure會緩存它在你系統中發現的東西”,因為我第二次編譯的時候偷了點懶,是在第一次減壓出來的文件夾下去編譯的,也沒有運行“#make clean和#make distclean”所有編譯后和原來的系統內核一樣,下面列出我的最終編譯安裝步驟:

          1:減壓文件:# tar xzvf /some/where/squid-2.5.STABLE4-src.tar.gz

          2:調整內核:(我使用的是linux)
                首先編輯/usr/include/bits/typesizes.h 文件,改變__FD_SETSIZE 的值:#define _ _FD_SETSIZE 32768
                使用命令增加內核文件描述符的限制:# echo 32768 > /proc/sys/fs/file-max
                運行#sh
                最后,增加進程文件描述符的限制,在你即將編譯squid 的同一個shell 里執行:sh# ulimit -Hn 32768
               該命令必須以root 運行,僅僅運行在bash shell。不必重啟機器。

          3:編譯、安裝squid
               編譯./configure設置:./configure --prefix=/usr/local/squid
                                    --enable-removal-policies="heap,lru"
                                   --enable-storeio="aufs,coss,diskd,null,ufs"
                                   --enable-delay-pools
                                   --enable-linux-netfilter
                                   --enable-useragent-log
                                   --enable-referer-log
                                  --enable-truncate
                                  --enable-underscores
                                  --enable-basic-auth-helpers="NCSA"
                                  --enable-err-language="Simplify_Chinese"
                                  --enable-default-err-language="Simplify_Chinese"
                                  --enable-stacktrace
                                  --enable-auth="basic"
                                  --disable-dependency-tracking
                                 --disable-internal-dns
                                --with-pthreads
                 編譯:make
                 安裝:make install

          4:創建squid登陸ID(useradd usrname password),創建緩存目錄,賦予squid的緩存目錄的權限和squid 的logs的權限(chown squid:squid  /usr/local/squid/var/logs)

          5:設置配置文件,和系統hosts文件

          6:創建緩存目錄:
                # cd /usr/local/squid/sbin
                #./squid –z  ( 出現Creating Swap Directories提示,表示建立成功)

          7:調試運行:
                #./squid –NCd1 # 成功后將出現"Ready to serve requests".否則請檢查配置文件。(說明,用squid -NCd1來以debug模式啟動,這樣如果有錯誤會報出來(FATAL: ipcache_init: DNS name lookup tests failed),因為squid啟動時會去檢查一些常用的DNS,但是如果這時候沒有接入internet,自然就出錯了,所以我們需要在啟動的時候不檢查DNS,這就需要用加上-D選項來啟動squid,命令如下:#./squid –NCDd1 # 參數Dd1的目的是禁止測試DNS的連通性并且把squid在開始運行后的一些提示信息顯示在屏幕上)

          8:注冊squid為服務:
                編寫shell腳本存放到目錄 /etc/init.d/:
          #!/bin/bash
          # squid  This shell script takes care of starting and stopping
          #  Squid Internet Object Cache
          #
          # chkconfig: 546 36 76
          # description: a name server
          #
          case "$1" in
               start)
                    ulimit -HSn 32768 --這句比較重要
                    /usr/local/squid/sbin/squid -D
                    ;;
               stop)
                   /usr/local/squid/sbin/squid -k shutdown
                   /usr/local/squid/sbin/squid -k shutdown
                   ;;
               reload)
                   /usr/local/squid/sbin/squid -k reconfig
                   ;;
               info)
                   /usr/local/squid/bin/squidclient -p 80 cache_object://localhost/info
                   ;;
          esac
          添加權限和開啟自動啟動
          chmod   +x   squid
          chkconfig squid on

           

          OK,安裝成功,重啟測試是否自動開啟squid。

          posted @ 2009-07-28 11:43 小馬歌 閱讀(318) | 評論 (0)編輯 收藏
          僅列出標題
          共95頁: First 上一頁 64 65 66 67 68 69 70 71 72 下一頁 Last 
           
          主站蜘蛛池模板: 安仁县| 东乡族自治县| 德庆县| 新建县| 奉节县| 冀州市| 南康市| 黔东| 治县。| 舟曲县| 海伦市| 卢湾区| 凤凰县| 商河县| 青冈县| 泊头市| 永和县| 类乌齐县| 攀枝花市| 瑞丽市| 靖安县| 依安县| 望都县| 商水县| 吉林省| 深圳市| 五台县| 乐业县| 石楼县| 龙口市| 三亚市| 阿尔山市| 苍梧县| 五寨县| 南昌市| 唐河县| 云龙县| 剑川县| 普格县| 桂东县| 保康县|