許多
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
if (req.request != "GET" && req.request != "HEAD") {
pipe;
}
elseif(req.url ~ "\.(php|cgi)($|\?)") {
pass;
}
else {
lookup;
}
另外還有個問題vcache這個目錄是用來保存cache文件的是嗎?我在ll vcache里什么文件都沒有。
還有用varnish這個方法還解決了一直讓我頭疼的squid不支持iis compress問題,實在太感謝了
但同時處理的請求數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
不過,不建議對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
用varnishncsa輸出日志,但發現里面有不少日志條目是127.0.0.1來的訪問,覺得比較奇怪,是不是varnishd工作時候產生的?上網找也沒找到相關的解釋。
老大你有沒有相關知識分享一下?嘿嘿
增加了
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里似乎沒看到類似情況
也許可以通過在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;
}
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 應該可以 不重啟的情況下重新載入配置文件
[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/下讀!
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? 實在看不出什么問題,
請張老師指點一下!
backend.host 如果有多臺的話 是否也可以象 SQUID 那樣設置在 hosts文件里面,
(3)、Varnish對域名為blog.s135.com的請求進行處理,非blog.s135.com域名的請求則返回“Zhang Yan Cache Server”;
squid 可以根據到目的IP是否符合在判斷是否可以使用 這樣就不用判斷域名 不知道在 Varnish 也可以這樣設置
原來本地是squid+nginx速度飛快,現在是varnish+nginx就卡得不行...
改成
if (req.http.host ~ ".abc.com") {
想問問如何,把訪問的地址的IP更換成www.XXXXX.com的類型呢?
需要什么才可以的嗎?
1.varnish專門做cache Server
2.F5 Bigip用做服務器負載均衡
還有種方案就是F5 BIGIP + Squid,Squid的緩存會保持在磁盤和內存,雖然Squid性能沒有Varnish高,但它停止、重啟的時候,可以直接先從磁盤讀取緩存數據。
還有種方案就是F5 BIGIP + Squid,Squid的緩存會保持在磁盤和內存,雖然Squid性能沒有Varnish高,但它停止、重啟的時候,可以直接先從磁盤讀取緩存數據。
這樣的話.重啟Varnish會導致邊緣節點訪問一定時間內卡一下吧?
內存方式雖然快.但是這點上會很郁悶了.
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.
請教一下怎樣解決。
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
這段不是很理解
每次獲取到以后就把生存期設置成0?
那么不是每次請求都是分發去backend了?
沒有起到cache的作用了?
通過瀏覽器訪問一個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;
}
倒是man里面非常詳細.
if (req.request != "GET" && req.request != "HEAD") {
pipe;
}
elseif(req.url ~ "\.(php|cgi)($|\?)") {
pass;
}
else {
lookup;
}
也還是沒解決。PHP是沒被緩存,但還是無法登陸后臺。
我測試了下,當varnish創建了100多個worker后
varnishlog -i debug出現大量的 Create worker thread failed 12 Cannot allocate memory錯誤,還沒發現該如何解決,我的環境是dell2950 4g mem/rhel4u4
然后squid用acl給purge的權限。
請教你個問題
我采用單機做下載服務器,本機varnish運行在80端口,nginx在81
下載的文件夾中的exe文件很快,但是下載其它的文件,比如:zip\dat\等文件就很慢,時常報
503 Service Temporarily Unavailable
還有就是dat文件我是要下載,但在IE中打開絕對路徑.卻是把文件中的內容給解釋出來了,
請幫幫我,應該如何配置!
謝謝
這個故障在我這里是反復出現。
但是,有寫命令卻用不了。比如/usr/local/varnish/bin/varnishstat,好像是沒有編譯好。不知道為什么
另外,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;
}
}
說明varnish沒有起作用,查看下配置文件
前端是一個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是怎么樣調用的呢,這塊有點迷惑
請張宴老師指點指點!!!!
張老師你好。我按照你這個成功建立了。
但是,有寫命令卻用不了。比如/usr/local/varnish/bin/varnishstat,好像是沒有編譯好。不知道為什么
沒有ncurses-devel