Squid服務(wù)器的編譯與安裝全攻略
假如你使用unix有一段時(shí)間,并且已編譯過(guò)許多其他軟件包,那么只需快速的掃描本章。編譯安裝squid的過(guò)程與安裝其他軟件相似。
為了編譯squid,你需要一個(gè)ANSI C編譯器。不要被ANSI字眼嚇倒。假如你已經(jīng)有一個(gè)編譯器,它順從ANSI指令,那么也一樣。GNU C編譯器(gcc)是很好的選擇,它被廣泛使用。大部分操作系統(tǒng)在其標(biāo)準(zhǔn)安裝中附帶了C編譯器,不過(guò)Solaris和HP-UX除外。假如你使用這樣的操作系統(tǒng),那可能沒(méi)有安裝編譯器。
理論上你應(yīng)該在即將運(yùn)行squid的機(jī)器上編譯squid。安裝過(guò)程偵察你的操作系統(tǒng)以發(fā)現(xiàn)特定的參數(shù),例如可用文件描述符的數(shù)量。然而,假如你的系統(tǒng)沒(méi)有C編譯器存在,你也許會(huì)在其他機(jī)器上編譯squid,然后把二進(jìn)制代碼copy回來(lái)。如果操作系統(tǒng)不同,那么squid可能會(huì)遇到問(wèn)題。假如操作系統(tǒng)有不同的內(nèi)核配置,squid會(huì)變得混亂。
除了C編譯器,你還需要perl和awk。awk是所有unix系統(tǒng)的標(biāo)準(zhǔn)程序,所以你不必?fù)?dān)心它。perl也是相當(dāng)普及的,但它也許沒(méi)有默認(rèn)安裝在你的系統(tǒng)上。你需要gzip程序來(lái)解壓源代碼發(fā)布文件。
對(duì)Solaris用戶,請(qǐng)確認(rèn)/usr/ccs/bin包含在你的PATH環(huán)境變量里,即使你使用gcc編譯器。為了編譯squid,make和ar程序需要在這個(gè)目錄找到。
解開源代碼包
在下載完源代碼后,你需要在某個(gè)目錄解開它。具體哪個(gè)目錄無(wú)關(guān)緊要。你能解開squid在你的家目錄或任何其他地方,大概需要20M的自由磁盤空間。我個(gè)人喜歡用/tmp。使用tar命令來(lái)展開源代碼目錄:
% cd /tmp % tar xzvf /some/where/squid-2.5.STABLE4-src.tar.gz
一些tar程序不支持z選項(xiàng),該選項(xiàng)自動(dòng)解壓gzip文件。如果這樣,你需要運(yùn)行如下命令:
% gzip -dc /some/where/squid-2.5.STABLE4-src.tar.gz | tar xvf -
一旦源代碼被展開,下一步通常是配置源代碼樹。然而,假如這是你第一次編譯squid,你應(yīng)確認(rèn)特定的內(nèi)核資源限制足夠高。怎樣發(fā)現(xiàn),請(qǐng)繼續(xù)。
#p#
調(diào)整內(nèi)核
Squid在高負(fù)載下,需要大量的內(nèi)核資源。特別的,你需要給你的系統(tǒng)配置比正常情況更高的文件描述符和緩存。文件描述符的限制通常很惱人。你最好在開始編譯squid之前來(lái)增加這些限制的大小。
因?yàn)檫@點(diǎn),你可能為了避免重建內(nèi)核的麻煩,而傾向于使用預(yù)編譯的二進(jìn)制版本。不幸的是,不管如何你必須重建一個(gè)新內(nèi)核。squid和內(nèi)核通過(guò)數(shù)據(jù)結(jié)構(gòu)來(lái)交換信息,數(shù)據(jù)結(jié)構(gòu)的大小不能超過(guò)設(shè)置的文件描述符的限制。squid在運(yùn)行時(shí)檢查這些設(shè)置,并且使用最安全的(最小的)值。這樣,即使預(yù)編譯的二進(jìn)制版本有比你的內(nèi)核更高的文件描述符,但還是以你系統(tǒng)內(nèi)核的實(shí)際數(shù)值為主。
為了改編一些參數(shù),你需要重建新內(nèi)核。這個(gè)過(guò)程在不同的操作系統(tǒng)之間不同。假如需要,請(qǐng)參閱Unix系統(tǒng)管理員手冊(cè)(Prentice Hall出版)或者你的操作系統(tǒng)文檔。假如你正使用Linux,可能不必重建內(nèi)核。
文件描述符
文件描述符是一個(gè)簡(jiǎn)單的整數(shù),用以標(biāo)明每一個(gè)被進(jìn)程所打開的文件和socket。第一個(gè)打開的文件是0,第二個(gè)是1,依此類推。Unix操作系統(tǒng)通常給每個(gè)進(jìn)程能打開的文件數(shù)量強(qiáng)加一個(gè)限制。更甚的是,unix通常有一個(gè)系統(tǒng)級(jí)的限制。
因?yàn)閟quid的工作方式,文件描述符的限制可能會(huì)極大的影響性能。當(dāng)squid用完所有的文件描述符后,它不能接收用戶新的連接。也就是說(shuō),用完文件描述符導(dǎo)致拒絕服務(wù)。直到一部分當(dāng)前請(qǐng)求完成,相應(yīng)的文件和socket被關(guān)閉,squid不能接收新請(qǐng)求。當(dāng)squid發(fā)現(xiàn)文件描述符短缺時(shí),它會(huì)發(fā)布警告。
在運(yùn)行./configure之前,檢查你的系統(tǒng)的文件描述符限制是否合適,能給你避免一些麻煩。大多數(shù)情況下,1024個(gè)文件描述符足夠了。非常忙的cache可能需要4096或更多。在配置文件描述符限制時(shí),我推薦設(shè)置系統(tǒng)級(jí)限制的數(shù)量為每個(gè)進(jìn)程限制的2倍。
通常在你的Unix shell中能找到系統(tǒng)的文件描述符限制。所有的C shell及其類似的shell有內(nèi)建的limit命令。更新的Bourne shell及其類似的shell有一條叫做ulimit的命令。為了發(fā)現(xiàn)你的系統(tǒng)的文件描述符限制,試運(yùn)行如下命令:
csh% limit descriptors unlimited csh% limit descriptors descriptors 4096
或者
sh$ ulimit -n unlimited sh$ ulimit -n 4096
在Freebsd上,你能使用sysctl命令:
% sysctl -a | grep maxfiles kern.maxfiles: 8192 kern.maxfilesperproc: 4096
如果你不能確認(rèn)文件描述符限制,squid的./configure腳本能替你做到。當(dāng)你運(yùn)行./configure時(shí),請(qǐng)見3.4章節(jié),觀察末尾這樣的輸出:
checking Maximum number of file descriptors we can open... 4096
假如其他的limit,ulimit,或者./configure報(bào)告這個(gè)值少于1024,你不得不在編譯squid之前,花費(fèi)時(shí)間來(lái)增加這個(gè)限制值的大小。否則,squid在高負(fù)載時(shí)執(zhí)行性能將很低。
增加文件描述符限制的方法因系統(tǒng)不同而不同。下面的章節(jié)提供一些方法幫助你開始。
Freebsd,NetBSD,OpenBSD
編輯你的內(nèi)核配置文件,增加如下一行:
options MAXFILES=8192
在OpenBSD上,使用option代替options。然后,configure,編譯,和安裝新內(nèi)核。最后重啟系統(tǒng)以使內(nèi)核生效。
Linux
在Linux上配置文件描述符有點(diǎn)復(fù)雜。在編譯squid之前,你必須編輯系統(tǒng)include文件中的一個(gè),然后執(zhí)行一些shell命令。請(qǐng)首先編輯/usr/include/bits/types.h文件,改變_ _FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192
下一步,使用這個(gè)命令增加內(nèi)核文件描述符的限制:
# echo 8192 > /proc/sys/fs/file-max
最后,增加進(jìn)程文件描述符的限制,在你即將編譯squid的同一個(gè)shell里執(zhí)行:
sh# ulimit -Hn 8192
該命令必須以root運(yùn)行,僅僅運(yùn)行在bash shell。不必重啟機(jī)器。使用這個(gè)技術(shù),你必須在每一次系統(tǒng)啟動(dòng)后執(zhí)行上述echo和ulimit命令,或者至少在squid啟動(dòng)之前。假如你使用某個(gè)rc.d腳本來(lái)啟動(dòng)squid,那是一個(gè)放置這些命令的好地方。
Solaris
增加該行到你的/etc/system文件:
set rlim_fd_max = 4096
然后,重啟機(jī)器以使改動(dòng)生效。
Mbuf Clusters
BSD基礎(chǔ)的網(wǎng)絡(luò)代碼使用一個(gè)叫做mbuf(參閱W.R.Stevens的TCP/IP描述卷2)的數(shù)據(jù)結(jié)構(gòu)。Mbuf典型的是小塊內(nèi)存(例如128字節(jié))。較大的網(wǎng)絡(luò)包的數(shù)據(jù)存儲(chǔ)在mbuf clusters里。內(nèi)核可能給系統(tǒng)可用的mbuf clusters的總數(shù)量強(qiáng)加一個(gè)最高限制。你能使用netstat命令來(lái)發(fā)現(xiàn)這個(gè)限制:
% netstat -m 196/6368/32768 mbufs in use (current/peak/max): 146 mbufs allocated to data 50 mbufs allocated to packet headers 103/6182/8192 mbuf clusters in use (current/peak/max) 13956 Kbytes allocated to network (56% of mb_map in use) 0 requests for memory denied 0 requests for memory delayed 0 calls to protocol drain routines
在這個(gè)例子里,有8192個(gè)mbuf clusters可用,但是永遠(yuǎn)不會(huì)同時(shí)用到6182個(gè)。當(dāng)系統(tǒng)用盡mbuf clusters時(shí),I/O機(jī)制例如read()和write()返回“無(wú)緩存空間可用”的錯(cuò)誤信息。
NetBSD和OpenBSD使用netstat -m不會(huì)顯示mbuf的輸出。代替的,它們?cè)趕yslog里報(bào)告:"WARNING: mclpool limit reached" 。
為了增加mbuf clusters的數(shù)量,你必須在內(nèi)核配置文件里增加一個(gè)選項(xiàng):
options NMBCLUSTERS=16384
臨時(shí)端口范圍
臨時(shí)端口是TCP/IP棧分配給出去連接的本地端口。換句話說(shuō),當(dāng)squid發(fā)起一條連接到另一臺(tái)服務(wù)器,內(nèi)核給本地socket分配一個(gè)端口號(hào)。這些本地端口號(hào)有特定的范圍限制。例如,在FreeBSD上,默認(rèn)的臨時(shí)端口范圍是1024-5000。
臨時(shí)端口號(hào)的短缺對(duì)非常忙的代理服務(wù)器(例如每秒數(shù)百個(gè)連接)來(lái)說(shuō),會(huì)較大的影響性能。這是因?yàn)橐恍㏕CP連接在它們被關(guān)閉時(shí)進(jìn)入TIME_WAIT狀態(tài)。當(dāng)連接進(jìn)入TIME_WATI狀態(tài)時(shí),臨時(shí)端口號(hào)不能被重用。
你能使用netstat命令來(lái)顯示有多少個(gè)連接進(jìn)入這個(gè)狀態(tài):
% netstat -n | grep TIME_WAIT Proto Recv-Q Send-Q Local Address Foreign Address(state) tcp4 0 0 192.43.244.42.19583 212.67.202.80.80 TIME_WAIT tcp4 0 0 192.43.244.42.19597 202.158.66.190.80 TIME_WAIT tcp4 0 0 192.43.244.42.19600 207.99.19.230.80 TIME_WAIT tcp4 0 0 192.43.244.42.19601 216.131.72.121.80 TIME_WAIT tcp4 0 0 192.43.244.42.19602 209.61.183.115.80 TIME_WAIT tcp4 0 0 192.43.244.42.3128 128.109.131.47.25666 TIME_WAIT tcp4 0 0 192.43.244.42.3128 128.109.131.47.25795 TIME_WAIT tcp4 0 0 192.43.244.42.3128 128.182.72.190.1488 TIME_WAIT tcp4 0 0 192.43.244.42.3128 128.182.72.190.2194 TIME_WAIT
注意這個(gè)例子中既有客戶端連接又有服務(wù)器端的連接??蛻舳诉B接有3128作為臨時(shí)端口號(hào),服務(wù)器端連接有80作為遠(yuǎn)程主機(jī)的端口號(hào)。臨時(shí)端口號(hào)出現(xiàn)在本地地址欄里。在該例子里,它們是19000秒。
如果你沒(méi)有看到數(shù)千個(gè)臨時(shí)端口在TIME_WAIT狀態(tài),那也許不必增加這個(gè)端口范圍。在Freebsd上,用如下命令增加臨時(shí)端口范圍:
# sysctl -w net.inet.ip.portrange.last=30000
在OpenBSD上,命令類似,但sysctl變量有不同的名字:
# sysctl -w net.inet.ip.portlast=49151
在NetBSD上,事情稍有不同。默認(rèn)的值是49152-65535.為了增加這個(gè)范圍,需改變最低限制:
# sysctl -w net.inet.ip.anonportmin=10000
在Linux上,簡(jiǎn)單的寫一對(duì)數(shù)字到下列指定文件:
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range
不要忘記將這些命令加到你的系統(tǒng)啟動(dòng)腳本中,以使機(jī)器每一次重啟后都生效。
#p#
Configure腳本
象許多其他Unix軟件一樣,squid在開始編譯之前使用./configure腳本來(lái)了解操作系統(tǒng)信息。./configure腳本由流行的GNU autoconf程序產(chǎn)生。當(dāng)script運(yùn)行時(shí),它用不同的方法來(lái)偵察系統(tǒng),以發(fā)現(xiàn)關(guān)于庫(kù),函數(shù),類型,參數(shù),和有沒(méi)有功能被提供等。./configure所做的第一件事情是去找一個(gè)C編譯器。假如C編譯器沒(méi)有找到,或者編譯一個(gè)簡(jiǎn)單的測(cè)試程序失敗,./configure腳本不能繼續(xù)。./configure腳本有大量的選項(xiàng)。最重要的是安裝prefix。在運(yùn)行./configure之前,你需要決定squid被安裝在哪里。prefix選項(xiàng)指定squid日志,二進(jìn)制文件,和配置文件的默認(rèn)位置。你可以在安裝之后改變這些文件的位置,但假如你現(xiàn)在決定,事情更容易。
默認(rèn)的安裝位置是/usr/local/squid.squid將文件放在prefix指定目錄下面的7個(gè)子目錄:
% ls -l /usr/local/squid total 5 drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 bin drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 etc drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 libexec drwxr-x--- 3 wessels wheel 512 Apr 28 20:43 man drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 sbin drwxr-x--- 4 wessels wheel 512 Apr 28 20:42 share drwxr-x--- 4 wessels wheel 512 Apr 28 20:43 var
Squid使用bin,etc,libexec,man,sbin,和share目錄存放一些相對(duì)較小的文件(或其他目錄),這些文件不經(jīng)常改變。但var目錄的文件別有洞天。這里你可以發(fā)現(xiàn)squid的日志文件,它增長(zhǎng)得非常大(數(shù)十或數(shù)百兆)。var也是實(shí)際磁盤cache的默認(rèn)位置。你也許想將var目錄放在磁盤空間足夠的位置,這樣做較容易的方法是使用--localstatedir選項(xiàng):
% ./configure --localstatedir=/bigdisk/var
當(dāng)配置squid時(shí),你不必對(duì)這些路徑名稱擔(dān)心太多。你以后可以在squid.conf文件里改變這些路徑名。
configure選項(xiàng)
./configure腳本有大量的不同選項(xiàng),它們以-開始。當(dāng)你敲入./configure --help時(shí),能看到選項(xiàng)的完整列表。一些選項(xiàng)對(duì)所有configure腳本是通用的,還有一些是squid專有的。下面是你可能用得到的標(biāo)準(zhǔn)選項(xiàng):
--perfix =PREFIX
如前面描述的一樣,這里設(shè)置安裝目錄。安裝目錄是所有可執(zhí)行文件,日志,和配置文件的默認(rèn)目錄。在整本書中,$prefix指你選擇的安裝目錄。
--localstatedir =DIR
該選項(xiàng)允許你改變var目錄的安裝位置。默認(rèn)是$prefix/var,但也許你想改變它,以使squid的磁盤緩存和日志文件被存儲(chǔ)在別的地方。
--sysconfdir =DIR
該選項(xiàng)允許你改變etc目錄的位置。默認(rèn)的是$prefix/etc.假如你想使用/usr作為安裝位置,你也許該配置--sysconfdir為/etc. 以下是squid的專有./configure選項(xiàng):
--enable-dlmalloc[=LIB]
在一些系統(tǒng)上,內(nèi)建的內(nèi)存分配機(jī)制(malloc)在使用squid時(shí)表現(xiàn)不盡人意。使用--enable-dlmalloc選項(xiàng)將squid源代碼包中的dlmalloc包編譯和鏈接進(jìn)來(lái)。假如你的系統(tǒng)中已安裝dlmalloc,你能使用=LIB參數(shù)指定庫(kù)的路徑。請(qǐng)見http://g.oswego.edu/dl/html/malloc.html更多關(guān)于dlmalloc的信息。
--enable-gnuregex
在訪問(wèn)控制列表和其他配置指令里,squid使用正則表達(dá)式作為匹配機(jī)制。GNU的正則表達(dá)式庫(kù)包含在squid的源代碼包里;它可以在沒(méi)有內(nèi)建正則表達(dá)式的操作系統(tǒng)中使用。./configure腳本偵察你系統(tǒng)中的正則表達(dá)式庫(kù),假如必要,它可以激活使用GNU正則表達(dá)式。如果因?yàn)槟承├碛?,你想?qiáng)制使用GNU正則表達(dá)式,你可以將這個(gè)選項(xiàng)加到./configure命令后。
--enable-carp
Cache數(shù)組路由協(xié)議(CARP)用來(lái)轉(zhuǎn)發(fā)丟失的cache到父cache的數(shù)組或cluster。在10.9章有更多關(guān)于CARP的細(xì)節(jié)。
--enable-async-io[=N_THREADS]
異步I/O是squid技術(shù)之一,用以提升存儲(chǔ)性能。aufs模塊使用大量的線程來(lái)執(zhí)行磁盤I/O操作。該代碼僅僅工作在linux和solaris系統(tǒng)中。=N_THREADS參數(shù)改變squid使用的線程數(shù)量。aufs和異步I/O在8.4章中被討論。
請(qǐng)注意--enable-async-io是打開其他三個(gè)./configure選項(xiàng)的快捷方式,它等同于:
--with-aufs-threads=N_THREADS
--with-pthreads
--enable-storeio=ufs,aufs
--with-pthreads
該選項(xiàng)導(dǎo)致編譯過(guò)程鏈接到你系統(tǒng)中的P線程庫(kù)。aufs存儲(chǔ)模塊是squid中唯一需要使用線程的部分。通常來(lái)說(shuō),如果你使用--enable-saync-io選項(xiàng),那么不必再單獨(dú)指定該選項(xiàng),因?yàn)樗蛔詣?dòng)激活了。
--enable-storeio=LIST
Squid支持大量的不同存儲(chǔ)模塊。通過(guò)使用該選項(xiàng),你告訴squid編譯時(shí)使用哪個(gè)模塊。在squid-2.5中,支持ufs,aufs,diskd,和null模塊。通過(guò)查詢src/fs中的目錄,你能得到一個(gè)模塊列表。
LIST是一個(gè)以逗號(hào)分隔的模塊列表,例如:
% ./configure --enable-storeio=afus,diskd,ufs
ufs模塊是默認(rèn)的,看起來(lái)問(wèn)題最少。不幸的是,它性能有限。其他模塊可能在某些操作系統(tǒng)中不必編譯。關(guān)于squid存儲(chǔ)模塊的完整描述,請(qǐng)見第8章。
--with-aufs-threads=N_THREADS
指定aufs存儲(chǔ)機(jī)制使用的線程數(shù)量(見8.4章)。squid默認(rèn)根據(jù)緩存目錄的數(shù)量,自動(dòng)計(jì)算需要使用多少線程。
--enable-heap-replacement
該選項(xiàng)不再使用,但被保留用于向后兼容性。你該使用--enable-removal-policies來(lái)代替。
--enable-removal-policies=LIST
排除策略是squid需要騰出空間給新的cache目標(biāo)時(shí),用以排除舊目標(biāo)的機(jī)制。squid-2.5支持3個(gè)排除策略:最少近期使用(LRU),貪婪對(duì)偶大小(GDS),最少經(jīng)常使用(LFU)。然而,因?yàn)橐恍├碛桑?/configure選項(xiàng)使指定的替代策略和需要執(zhí)行它們的基本數(shù)據(jù)結(jié)構(gòu)之間的差別模糊化。LRU是默認(rèn)的,它以雙鏈表數(shù)據(jù)結(jié)構(gòu)執(zhí)行。GDS和LFU使用堆棧的數(shù)據(jù)結(jié)構(gòu)。
為了使用GDS或LFU策略,你指定:
% ./configure --enable-removal-policies=heap
然后你在squid的配置文件里選擇使用GDS或LFU。假如你想重新使用LRU,那么指定:
% ./configure --enable-removal-policies=heap,lru
更多的關(guān)于替換策略的細(xì)節(jié)請(qǐng)見7.5章。
--enable-icmp
如在10.5章中描述的一樣,squid能利用ICMP消息來(lái)確定回環(huán)時(shí)間尺寸,非常象ping程序。你能使用該選項(xiàng)來(lái)激活這些功能。
--enable-delay-pools
延時(shí)池是squid用于傳輸形狀或帶寬限制的技術(shù)。該池由大量的客戶端IP地址組成。當(dāng)來(lái)自這些客戶端的請(qǐng)求處于cache丟失狀態(tài),他們的響應(yīng)可能被人工延遲。關(guān)于延時(shí)池的更多細(xì)節(jié)請(qǐng)見附錄C。
--enable-useragent-log
該選項(xiàng)激活來(lái)自客戶請(qǐng)求的HTTP用戶代理頭的日志。更多細(xì)節(jié)請(qǐng)見13.5章。
--enable-referer-log
該選項(xiàng)激活來(lái)自客戶請(qǐng)求的HTTP referer日志。更多細(xì)節(jié)請(qǐng)見13.4章。
--disable-wccp
Web cache協(xié)調(diào)協(xié)議(WCCP)是CISCO的專有協(xié)議,用于阻止或分發(fā)HTTP請(qǐng)求到一個(gè)或多個(gè)caches。WCCP默認(rèn)被激活,假如你愿意,可以使用該選項(xiàng)來(lái)禁止該功能。
--enable-snmp
簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)是監(jiān)視網(wǎng)絡(luò)設(shè)備和服務(wù)器的流行方法。該選項(xiàng)導(dǎo)致編譯過(guò)程去編譯所有的SNMP相關(guān)的代碼,包括一個(gè)裁切版本的CMU SNMP庫(kù)。
--enable-cachemgr -hostname[=hostname]
cachemgr是一個(gè)CGI程序,你能使用它來(lái)管理查詢squid。默認(rèn)cachemgr的hostname值是空的,但你能使用該選項(xiàng)來(lái)指定一個(gè)默認(rèn)值。例如:
% ./configure --enable-cachemgr-hostname=mycache.myorg.net
--enable-arp-acl
squid在一些操作系統(tǒng)中支持ARP,或者以太地址訪問(wèn)控制列表。該代碼使用非標(biāo)準(zhǔn)的函數(shù)接口,來(lái)執(zhí)行ARP訪問(wèn)控制列表,所以它默認(rèn)被禁止。假如你在linux或solaris上使用squid,你可能用的上這個(gè)功能。
--enable-htcp
HTCP是超文本緩存協(xié)議--類似于ICP的內(nèi)部緩存協(xié)議。更多細(xì)節(jié)請(qǐng)見10.8章。
--enable-ssl
使用該選項(xiàng)賦予squid終止SSL/TLS連接的能力。注意這僅僅工作在web加速器中用以加速請(qǐng)求。更多細(xì)節(jié)請(qǐng)見15.2.2章節(jié)。
--with-openssl[=DIR]
假如必要,你使用該選項(xiàng)來(lái)告訴squid到哪里找到OpenSSL庫(kù)或頭文件。假如它們不在默認(rèn)位置,在該選項(xiàng)后指定它們的父路徑。例如:
% ./configure --enable-ssl --with-ssl=/opt/foo/openssl
在這個(gè)例子中,你的編譯器將在/opt/foo/openssl/include目錄中找頭文件,在/opt/foo/openssl/lib中找?guī)煳募?/p>
--enable-cache-digests
Cache消化是ICP的另一個(gè)替代,但有著截然不同的特性。請(qǐng)見10.7章。
--enable-err-languages="lang1 lang2 ..."
squid支持定制錯(cuò)誤消息,錯(cuò)誤消息可以用多種語(yǔ)言報(bào)告。該選項(xiàng)指定復(fù)制到安裝目錄($prefix/share/errors)的語(yǔ)言。假如你不使用該選項(xiàng),所有可用語(yǔ)言被安裝。想知道何種語(yǔ)言可用,請(qǐng)見源代碼包里errors目錄下的目錄列表。如下顯示如何激活多種語(yǔ)言:
% ./configure --enable-err-languages="Dutch German French" ...
--enable-default-err-language=lang
該選項(xiàng)設(shè)置error_directory指令的默認(rèn)值。例如,假如你想使用荷蘭語(yǔ),你能這樣指定:
% ./configure --enable-default-err-language=Dutch
你也能在squid.conf里指定error_directory指令,在附錄A中有描述。假如你忽略該選項(xiàng),英語(yǔ)是默認(rèn)錯(cuò)誤語(yǔ)言。
--with-coss-membuf-size=N
循環(huán)目錄存儲(chǔ)系統(tǒng)(coss)是squid的試驗(yàn)性存儲(chǔ)機(jī)制。該選項(xiàng)設(shè)置coss緩存目錄的內(nèi)存緩沖大小。注意為了使用coss,你必須在--enable-storeio選項(xiàng)里指定存儲(chǔ)類型。
該參數(shù)以字節(jié)形式賦值,默認(rèn)是1048576字節(jié)或1M。你能指定2M緩沖如下:
% ./configure --with-coss-membuf-size=2097152
--enable-poll
unix提供兩個(gè)相似的函數(shù)用以在I/O事件里掃描開放文件描述符:select()和poll()./configure腳本通常能非常好的計(jì)算出何時(shí)使用poll()來(lái)代替select().假如你想強(qiáng)制使用poll(),那么指定該選項(xiàng)。
--desable-poll
類似的,如果不使用poll(),那么指定該選項(xiàng)。
--disable-http-violations
squid默認(rèn)可以被配置成違背HTTP協(xié)議規(guī)范。你能使用該選項(xiàng)來(lái)刪除違背HTTP協(xié)議的代碼。
--enable-ipf-transparent
在第9章中,我將描述如何配置squid來(lái)攔截緩存。一些操作系統(tǒng)使用IP Filter包來(lái)協(xié)助攔截緩存。在這些環(huán)境下你應(yīng)該使用該./configure選項(xiàng)。如果你使用了該選項(xiàng),但是編譯器提示src/client_side.c文件出錯(cuò),那是因?yàn)镮P Filter包沒(méi)有或沒(méi)有正確的安裝在你的系統(tǒng)中。
--enable-pf-transparent
你可能需要指定該選項(xiàng),使用PF包過(guò)濾器在操作系統(tǒng)中攔截HTTP。PF是OpenBSD的標(biāo)準(zhǔn)包過(guò)濾器,也可能被發(fā)布到其他系統(tǒng)中。假如你使用該選項(xiàng),但是編譯器提示src/client_side.c文件出錯(cuò),那是因?yàn)镻F沒(méi)有實(shí)際安裝到你的系統(tǒng)中。
--enable-linux-netfilter
Netfilter是linux 2.4系列內(nèi)核的包過(guò)濾器名字。假如你想在linux2.4或以后的版本中使用HTTP攔截功能,那么激活該選項(xiàng)。
--disable-ident-lookups
ident是一個(gè)簡(jiǎn)單的協(xié)議,允許服務(wù)器利用客戶端的特殊TCP連接來(lái)發(fā)現(xiàn)用戶名。假如你使用該選項(xiàng),編譯器將把執(zhí)行這些查詢的代碼排除出去。即使你在編譯時(shí)保留了這些代碼,除非你在squid.conf文件里指定,squid不會(huì)執(zhí)行ident查詢。
--disable-internal-dns
squid源代碼包含兩個(gè)不同的DNS解決方案,叫做“內(nèi)部的”和“外部的”。內(nèi)部查詢是默認(rèn)的,但某些人可能要使用外部技術(shù)。該選項(xiàng)禁止內(nèi)部功能,轉(zhuǎn)向使用舊的方式。
內(nèi)部查詢使用 squid自己的DNS協(xié)議執(zhí)行工具。也就是說(shuō),squid產(chǎn)生未完成的DNS查詢并且將它們發(fā)送到一個(gè)解析器。假如超時(shí),它重新發(fā)送請(qǐng)求,你能指定任意數(shù)量的解析器。該工具的有利處之一是,squid獲得準(zhǔn)確無(wú)誤的DNS響應(yīng)的TTLs。
外部查詢利用C庫(kù)的gethostbyname()和gethostbyaddr()函數(shù)。squid使用一個(gè)外部進(jìn)程池來(lái)制造并行查詢。使用外部DNS解析的主要弊端是你需要更多的輔助進(jìn)程,增加squid的負(fù)載。另一個(gè)麻煩是C庫(kù)函數(shù)不在響應(yīng)里傳輸TTLs,這樣squid使用postive_dns_ttl指令提供的一個(gè)常量值。
--enable-truncate
truncate()系統(tǒng)調(diào)用是unlink()的替代品。unlink()完全刪除cache文件,truncate()將文件大小設(shè)為零。這樣做釋放了分配給該文件的磁盤空間,但留下適當(dāng)?shù)哪夸浗涌?。該選項(xiàng)存在的理由是,某些人相信(或希望)truncate()比unlink()性能表現(xiàn)更好。然而,壓力測(cè)試顯示兩者有很少的或根本沒(méi)有區(qū)別。
--disable-hostname-checks
默認(rèn)的,squid要求URL主機(jī)名在一定程度上遵守古老的RFC 1034規(guī)范:
標(biāo)簽必須遵循下列ARPANET主機(jī)名規(guī)則。它們必須以字母開始,以字母或數(shù)字結(jié)尾,僅僅包含字母,數(shù)字和下劃線。
這里字母意味著ASCII字符,從A到Z。既然國(guó)際域名日益流行,你可能希望使用該選項(xiàng)來(lái)移除限制。
--enable-underscores
該選項(xiàng)控制squid針對(duì)主機(jī)名里下劃線的行為。通用的標(biāo)準(zhǔn)是主機(jī)名里不包含下劃線字符,盡管有些人不贊成這點(diǎn)。squid默認(rèn)會(huì)對(duì)URL主機(jī)名里帶下劃線的請(qǐng)求產(chǎn)生一條錯(cuò)誤消息。你能使用該選項(xiàng),讓squid信任它們,把它們當(dāng)作合法的。然而,你的DNS解析器也許強(qiáng)迫使用非下劃線請(qǐng)求,并且對(duì)帶下劃線的主機(jī)名解析失敗。
--enable-auth[=LIST]
該選項(xiàng)控制在squid的二進(jìn)制文件里支持哪種驗(yàn)證機(jī)制。你能選擇下列機(jī)制的任意組合:basic,digest,ntlm.假如你忽略該選項(xiàng),squid僅僅支持basic驗(yàn)證。假如你使用不帶參數(shù)的--enable-auth選項(xiàng),編譯進(jìn)程將增加對(duì)所有驗(yàn)證機(jī)制的支持。你可以使用以逗號(hào)分隔的驗(yàn)證機(jī)制列表:
% ./configure --enable-auth=digest,ntlm
我在第六章和第十二章里會(huì)談得更多。
--enable-auth-helpers=LIST
這個(gè)舊選項(xiàng)現(xiàn)在已舍棄了,但為了保持向后兼容性仍保留著。你可以使用--enable-basic-auth-helperes=LIST來(lái)代替。
--enable-basic-auth-helpers=LIST
使用該選項(xiàng),你能將helpers/basic_auth目錄的一個(gè)或多個(gè)HTTP Basic驗(yàn)證輔助程序編譯進(jìn)來(lái)。請(qǐng)見12.2章找到它們的名字和描述。
--enable-ntlm-auth-helpers=LIST
使用該選項(xiàng),你能將helpers/ntlm_auth目錄的一個(gè)或多個(gè)HTTP NTLM驗(yàn)證輔助程序編譯進(jìn)來(lái)。請(qǐng)見12.4章找到它們的名字和描述。
--enable-digest-auth-modules=LIST
使用該選項(xiàng),你能將helpers/digest_auth目錄的一個(gè)或多個(gè)HTTP Digest驗(yàn)證輔助程序編譯進(jìn)來(lái)。請(qǐng)見12.3章找到它們的名字和描述。
--enable-external-acl-helpers=LIST
使用該選項(xiàng),你能編譯一個(gè)或多個(gè)擴(kuò)展ACL輔助程序,這些在12.5章中討論。例如:
% ./configure --enable-external-acl-helpers=ip_user,ldap_group
--disable-unlinkd
unlinkd是另一個(gè)squid的外部輔助進(jìn)程。它的基本工作是對(duì)cache文件執(zhí)行unlink()或truncate()系統(tǒng)調(diào)用。通過(guò)在外部進(jìn)程里執(zhí)行文件刪除工作,能給squid帶來(lái)明顯的性能提升。使用該選項(xiàng)來(lái)禁止外部unlink進(jìn)程功能。
--enable-stacktrace
某些系統(tǒng)支持在程序崩潰時(shí),自動(dòng)產(chǎn)生數(shù)據(jù)追蹤。當(dāng)你激活該功能后,如果squid崩潰,數(shù)據(jù)追蹤信息被寫到cache.log文件。這些信息對(duì)開發(fā)和程序bug調(diào)試有用。
--enable-x-accelerator-vary
該高級(jí)功能可能在squid被配置成加速器時(shí)使用。它建議squid在響應(yīng)請(qǐng)求時(shí),從后臺(tái)原始服務(wù)器中尋找X-Accelerator-Vary頭。請(qǐng)見15.5章。
運(yùn)行configure
現(xiàn)在我們準(zhǔn)備運(yùn)行./configure腳本。進(jìn)入源代碼的頂級(jí)目錄敲入./configure,后面跟上前面提到過(guò)的任意選項(xiàng),例如:
% cd squid-2.5.STABLE4 % ./configure --enable-icmp --enable-htcp
./configure的工作就是偵察你的操作系統(tǒng),以發(fā)現(xiàn)什么東西可用,什么不可用。它首先做的事情之一就是確認(rèn)你的C編譯器可用。假如./configure檢測(cè)到你的C編譯器有問(wèn)題,腳本會(huì)退出,返回如下錯(cuò)誤:
configure: error: installation or configuration problem: C compiler cannot create executables.
很可能你從不會(huì)看到這個(gè)消息。假如看到了,那意味著你的系統(tǒng)中沒(méi)有C編譯器存在,或者編譯器沒(méi)有正確安裝。請(qǐng)見config.log文件找到解決問(wèn)題的建議。假如你的系統(tǒng)中有多個(gè)C編譯器,你可以在運(yùn)行./configure之前設(shè)置CC環(huán)境變量,來(lái)告訴./configure使用哪個(gè):
% setenv CC /usr/local/bin/gcc % ./configure ...
在./configure檢查完該編譯器后,它查找頭文件,庫(kù)文件和函數(shù)的長(zhǎng)列表。通常你不必?fù)?dān)心該部分。在某些實(shí)際情況中,./configure會(huì)終止以引起你的注意,某些事情可能有問(wèn)題,例如沒(méi)有足夠的文件描述符。假如你指定不完整的或不合理的命令行選項(xiàng),它也會(huì)終止。假如有錯(cuò)誤發(fā)生,請(qǐng)檢查config.log輸出。./configure的最終任務(wù)是創(chuàng)造Makefiles和其他文件,這些文件基于squid從你系統(tǒng)中了解到的知識(shí)。到此為止,你準(zhǔn)備做編譯工作。
#p#
編譯
一旦./configure完成了它的工作,你簡(jiǎn)單的敲入make開始編譯源代碼:
%make
正常來(lái)說(shuō),該過(guò)程很順利,你可以見到大量的滾動(dòng)行。
你也許見到一些編譯器警告。大多數(shù)情況下,可以安全的忽略這些。假如這些警告非常多,并且一些看起來(lái)非常嚴(yán)重,請(qǐng)將它們報(bào)告給開發(fā)者,在第16.5章中有描述。
假如編譯過(guò)程沒(méi)有錯(cuò)誤,你可以轉(zhuǎn)移到下一節(jié),描述如何安裝你剛才編譯的程序。
為了驗(yàn)證編譯是否成功,你可以再次運(yùn)行make。你將看到如下輸出:
% make Making all in lib... Making all in scripts... Making all in src... Making all in fs... Making all in repl... 'squid' is up to date. 'client' is up to date. 'unlinkd' is up to date. 'cachemgr.cgi' is up to date. Making all in icons... Making all in errors... Making all in auth_modules...
因?yàn)樵S多理由,編譯步驟也許會(huì)失敗,包括:
源代碼bugs
通常squid源代碼是完整的調(diào)試過(guò)的。然而,你也許會(huì)遇到某些bugs或問(wèn)題從而阻止你編譯。這種問(wèn)題在新的開發(fā)版本中更容易出現(xiàn),請(qǐng)將它們報(bào)告給開發(fā)者。
編譯器安裝問(wèn)題
不正確安裝的C編譯器不能夠編譯squid或其他軟件包。通常編譯器隨著操作系統(tǒng)預(yù)安裝,所以你不必?fù)?dān)心它。然而,假如你在操作系統(tǒng)安裝完后,試圖升級(jí)編譯器,那么可能會(huì)犯錯(cuò)誤。絕對(duì)不要把已經(jīng)安裝好的編譯器從一臺(tái)機(jī)器拷貝到另一臺(tái),除非你絕對(duì)清楚你在做什么。我覺(jué)得在每臺(tái)機(jī)上獨(dú)立的安裝編譯器總是最好的。
請(qǐng)確認(rèn)你的編譯器的頭文件總是與庫(kù)文件同步。頭文件通常在/usr/include目錄,而庫(kù)文件在/usr/lib目錄。Linux的流行RPM系統(tǒng)允許它去升級(jí)其中之一,但并非另一個(gè)。假如庫(kù)文件基于不同的頭文件,squid不能編譯。
假如你想在開源BSD變種之一中升級(jí)編譯器,請(qǐng)確認(rèn)在/usr/src目錄中運(yùn)行make world,這好過(guò)從/usr/src/lib或/usr/src/include中運(yùn)行。
如下是一些通用的編譯器問(wèn)題和錯(cuò)誤消息:
Solaris: make[1]: *** [libmiscutil.a] Error 255
這意味著./configure不能發(fā)現(xiàn)ar程序。請(qǐng)確認(rèn)/usr/ccs/bin位于你的PATH環(huán)境變量里。假如你沒(méi)有安裝Sun的編譯器,那么需要GNU的工具。(http://www.gnu.org/directory/binutils.html).
Linux: storage size of 'rl' isn't known
這是因?yàn)轭^文件和庫(kù)文件不匹配所致,象前面描述的一樣。請(qǐng)確認(rèn)同時(shí)升級(jí)兩者。
Digital Unix: Don't know how to make EXTRA_libmiscutil_a_SOURCES. Stop.
Digital Unix的make程序不能兼容automake包產(chǎn)生的Makefile文件。例如,lib/Makefile.in包含如下行:
noinst_LIBRARIES = \ @LIBDLMALLOC@ \ libmiscutil.a \ libntlmauth.a \ @LIBREGEX@
在替換后,當(dāng)lib/Makefile被創(chuàng)建時(shí),它看起來(lái)如下:
noinst_LIBRARIES = \ \ libmiscutil.a \ libntlmauth.a \ <TAB>
象上面顯示的一樣,最后一行包括一個(gè)不可見的TAB字符,它阻止了make。通過(guò)安裝和使用GNU make,或者手工編輯lib/Makefile如下,來(lái)解決這個(gè)問(wèn)題:
noinst_LIBRARIES = \ \ libmiscutil.a \ libntlmauth.a
假如你在編譯squid時(shí)遇到問(wèn)題,請(qǐng)先檢查FAQ。你也許該在Squid的web站點(diǎn)上搜索(使用主頁(yè)里的搜索欄)。最后,假如你仍有問(wèn)題,請(qǐng)發(fā)郵件到squid-users@squid-cache.org列表。
#p#
3.6 安裝
在編譯完后,你需要把程序安裝到指定的目錄。可能需要超級(jí)用戶權(quán)限來(lái)把它們放置到安裝目錄。所以,請(qǐng)先切換到root:
%su password: #make install
假如你通過(guò)使用--enable-icmp選項(xiàng),激活了squid的ICMP衡量功能,那么必須安裝pinger程序。pinger程序必須以超級(jí)用戶權(quán)限安裝,因?yàn)閮H僅允許root來(lái)發(fā)送和接受ICMP消息。下列命令以相應(yīng)的許可來(lái)安裝pinger程序:
#make install-pinger
在安裝完后,你將在squid的安裝目錄里(默認(rèn)是/usr/local/squid)見到下列目錄和文件:
sbin
sbin目錄的程序正常只能被root啟動(dòng)
sbin/squid
Squid的主程序
bin
bin目錄包含對(duì)所有用戶可用的程序
bin/RunCache
RunCache是一個(gè)shell腳本,你能用它來(lái)啟動(dòng)squid。假如squid死掉,該腳本自動(dòng)重啟它,除非它檢測(cè)到經(jīng)常的重啟。RunCache是一個(gè)時(shí)間遺留的產(chǎn)物,那時(shí)Squid還不是后臺(tái)服務(wù)進(jìn)程。在最近的版本里,RunCache很少用到,因?yàn)镾quid自動(dòng)重啟它自身,當(dāng)你不使用-N選項(xiàng)時(shí)。
bin/RunAccel
RunAccel與RunCache幾乎一致,唯一的不同是它增加了一個(gè)命令行參數(shù),告訴squid在哪里偵聽HTTP請(qǐng)求。
bin/squidclient
squidclient是個(gè)簡(jiǎn)單的HTTP客戶端程序,你能用它來(lái)測(cè)試squid。它也有一些特殊功能,用以對(duì)運(yùn)行的squid進(jìn)程發(fā)起管理請(qǐng)求。
libexec
libexec目錄傳統(tǒng)的包含了輔助程序。有一些命令你不能正常的啟動(dòng)。然而,這些程序通常被其他程序啟動(dòng)。
libexec/unlinkd
unlinkd是一個(gè)輔助程序,它從cache目錄里刪除文件。如你后面看到的一樣,文件刪除是個(gè)性能瓶頸。通過(guò)在外部進(jìn)程里執(zhí)行刪除操作,Squid提升了一些執(zhí)行性能。
libexec/cachemgr.cgi
cachemgr.cgi是Squid管理功能的CGI接口。為了使用它,你需要拷貝該程序到你的WEB服務(wù)器的cgi-bin目錄。在14.2章中有更多描述。
libexec/diskd(optional)
假如你指定了--enable-storeio=diskd,你才能看到它。
libexec/pinger(optional)
假如你指定了--enable-icmp,你才能看到它。
etc
etc目錄包含squid的配置文件。
etc/squid.conf
這是squid的主要配置文件。初始的該文件包含了大量的注釋,用以解釋每一個(gè)選項(xiàng)做什么。在你理解了這些配置指令后,建議你刪除這些注釋,讓配置文件更小和更容易閱讀。注意假如該文件存在,安裝過(guò)程不會(huì)覆蓋該文件。
etc/squid.conf.default
這是從源代碼目錄中拷貝過(guò)來(lái)的默認(rèn)配置文件。在升級(jí)了squid安裝后,你也許發(fā)現(xiàn)有一份當(dāng)前默認(rèn)配置文件的拷貝是有用的。可能會(huì)增加新的配置指令,一些存在的舊指令可能有所改變。
etc/mime.conf
mime.conf文件告訴squid對(duì)從FTP和Gopher服務(wù)器獲取的數(shù)據(jù)使用何種MIME類型。該文件是一個(gè)關(guān)聯(lián)文件名擴(kuò)展到MIME類型的表。正常而言,你不必編輯該文件。然而,你可能需要增加特殊文件類型的接口,它們?cè)谀愕慕M織內(nèi)使用。
etc/mime.conf.default
這是從源代碼目錄里拷貝過(guò)來(lái)的默認(rèn)mime.conf文件。
share
share目錄通常包括squid的只讀數(shù)據(jù)文件。
share/mib.txt
這是squid的SNMP管理信息基礎(chǔ)(MIB)文件。squid自身不使用該文件,然而,你的SNMP客戶端軟件(例如snmpget和多路由走向圖(MRTG))需要該文件,用以理解來(lái)自squid的SNMP對(duì)象可用。
share/icons
share/icons目錄包含大量的小圖標(biāo)文件,squid用在FTP和Gopher目錄列舉里。正常而言,你不必?fù)?dān)心這些文件,但如果需要,你可以改變它們。
share/errors
share/errors目錄包含了squid顯示給用戶看的錯(cuò)誤消息模板。這些文件在你安裝squid時(shí),從源代碼目錄拷貝而來(lái)。如果需要你可以編輯它們。然而,在每次運(yùn)行make install時(shí),安裝過(guò)程總會(huì)覆蓋它們。所以假如你想定制錯(cuò)誤消息,建議你把它們放在不同的目錄。
var
var目錄包含了不是很重要的和經(jīng)常變化的文件。這些文件你不必正常的備份它們。
var/logs
var/logs目錄是squid不同日志文件的默認(rèn)位置。當(dāng)你第一次安裝squid時(shí),它是空的。一旦squid開始運(yùn)行,你能在這里看到名字為access.log,cache.log和store.log這樣的文件。
var/cache
假如你不在squid.conf文件里指定,這是默認(rèn)的緩存目錄(cache_dir)。第七章有關(guān)于緩存目錄的所有細(xì)節(jié)。
#p#
打補(bǔ)丁
在你運(yùn)行squid一段時(shí)間后,你可能發(fā)現(xiàn)需要打源代碼補(bǔ)丁,用以修正bug或者增加試驗(yàn)性的功能。在squid-cache.org站點(diǎn)上,對(duì)重要的bug修正會(huì)發(fā)布補(bǔ)丁。假如你不想等到下一個(gè)官方發(fā)布版本,你能下載補(bǔ)丁,并且打到你的源代碼中。然后你需要重新編譯squid。
為了打補(bǔ)丁-或者有時(shí)候叫差別文件-你需要一個(gè)叫做"patch"的程序。你的操作系統(tǒng)必須有該程序。如果沒(méi)有,你可以從GNU工具集里下載(http://www.gnu.org/directory/patch.html). 注意假如你在使用匿名CVS(見2.4節(jié)),你不必?fù)?dān)心補(bǔ)丁文件。當(dāng)你升級(jí)源代碼樹時(shí),CVS系統(tǒng)自動(dòng)升級(jí)了補(bǔ)丁。
為了打補(bǔ)丁,你必須把補(bǔ)丁文件存放在系統(tǒng)中某處。然后進(jìn)入到squid的源代碼目錄,運(yùn)行如下命令:
% cd squid-2.5.STABLE4 % patch < /tmp/patch_file
默認(rèn)的,在patch程序運(yùn)行時(shí),它告訴你它正在做什么。通常輸出滾動(dòng)非??欤怯袉?wèn)題。你能安全的忽略它輸出的offset NNN lines警告。假如你不想見到所有這些輸出,使用-s選項(xiàng)選擇安靜模式。
當(dāng)補(bǔ)丁更新了源代碼后,它創(chuàng)造了原始文件的拷貝。例如,假如你對(duì)src/http.c打一個(gè)補(bǔ)丁,備份文件名就是src/http.c.orig.這樣,假如你在打了補(bǔ)丁后想撤銷這個(gè)操作,簡(jiǎn)單的重命名所有的.orig文件到它們以前的格式。為了成功的使用該技術(shù),建議你在打補(bǔ)丁之前刪除所有的.orig文件。
假如patch程序遇到問(wèn)題,它停止運(yùn)行并且給出建議。通常問(wèn)題如下:
在錯(cuò)誤的目錄運(yùn)行patch程序。解決的方法是,進(jìn)入到正確的目錄,或者使用patch的-p選項(xiàng)。
補(bǔ)丁已打過(guò)。patch會(huì)告訴你是否已打過(guò)補(bǔ)丁文件。在這樣的情況下,它會(huì)問(wèn)你是否撤銷這個(gè)文件的補(bǔ)丁。
patch程序不能理解你賦給它的文件。補(bǔ)丁文件通常有三個(gè)風(fēng)格:正常的,context的和unified的。舊版本的patch程序可能不理解后兩者的差異輸出。從GNU的FTP站點(diǎn)獲取最近的版本能解決該問(wèn)題。
損壞的補(bǔ)丁文件。假如你在下載和存儲(chǔ)補(bǔ)丁文件時(shí)不小心,它有可能被損壞。有時(shí)候人們以email消息發(fā)送補(bǔ)丁文件,在新的窗口里,它們被簡(jiǎn)單的剪切和粘貼。
在這樣的系統(tǒng)中,剪切和粘貼能將Tab字符改變?yōu)榭崭瘢蛘卟徽_的捆綁長(zhǎng)行。這些改變混亂了patch。-l選項(xiàng)也許有用,但最好是正確的拷貝和存儲(chǔ)補(bǔ)丁文件。
某些時(shí)候patch不能應(yīng)用部分或所有的差別文件。在這樣的情況下,你能見到類似于Hunk 3 of 4 failed的消息。失敗的部分被存儲(chǔ)在命名為.rej的文件里。例如,假如在處理src/http.c時(shí)失敗,patch程序?qū)⒃摬顒e文件片斷存為src/http.c.rej.在這樣的情況下,你也許能手工修正這些問(wèn)題,但它通常不值得這么做。假如你有大量的"failed hunks"或者.rej文件,建議你去下載最近源代碼版本的完整新拷貝。
在你打完補(bǔ)丁后,你必須重新編譯squid。make的先進(jìn)功能之一就是它僅僅編譯改變了的文件。但有時(shí)候make不能理解錯(cuò)綜復(fù)雜的依賴關(guān)系,它沒(méi)有完整的重編譯所需文件。為了安全起見,通常建議你去重編譯所有文件。最好的方法是在開始編譯之前清除源代碼樹:
%make clean %make
#p#
重運(yùn)行configure
有時(shí)候你可能發(fā)現(xiàn)有必要重新運(yùn)行./configure。例如,假如你調(diào)整了內(nèi)核參數(shù),你必須再次運(yùn)行./configure以使它能發(fā)現(xiàn)新設(shè)置。當(dāng)你閱讀本書時(shí),你也發(fā)現(xiàn)你必須使用./configure選項(xiàng)來(lái)激活所需的功能。
以相同的選項(xiàng)重運(yùn)行./configure,使用如下命令:
%config.status --recheck
另一個(gè)技術(shù)是`touch config.status`文件,它更新了該文件的時(shí)間戳。這導(dǎo)致make在編譯源代碼之前,重新運(yùn)行./configure腳本:
% touch config.status % make
如果增加或刪除./configure選項(xiàng),你必須重新敲入完整的命令行。假如你記不住以前的選項(xiàng),請(qǐng)查看config.status文件的頂部。例如:
% head config.status #! /bin/sh # Generated automatically by configure. # Run this file to recreate the current configuration. # This directory was configured as follows, # on host foo.life-gone-hazy.com: # # ./configure --enable-storeio=ufs,diskd --enable-carp \ # --enable-auth-modules=NCSA # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists.
在運(yùn)行./configure之后,你必須再次編譯和安裝squid。安全起見,建議先運(yùn)行make clean:
%make clean %make
請(qǐng)回想一下,./configure會(huì)緩存它在你系統(tǒng)中發(fā)現(xiàn)的東西。在這樣的形式下,你可能想清除這些緩存,從頭開始編譯過(guò)程。假如喜歡,你可以簡(jiǎn)單的刪除config.cache文件。然后,下一次./configure運(yùn)行時(shí),它不會(huì)使用以前的數(shù)值。你也能恢復(fù)squid源代碼樹到它的configure之前的狀態(tài),使用如下命令:
%make distclean
這將刪除所有的目標(biāo)文件和其他被./configure和make程序產(chǎn)生的文件。