Squid中文權威指南 第三章(編譯和安裝)

第3章 編譯和安裝



3.1 安裝之前

假如你使用unix有一段時間,並且已編譯過許多其他軟件包,那麼只需快速的掃描本章。編譯安裝squid的過程與安裝其他軟件相似。

爲了編譯squid,你需要一個ANSI C編譯器。不要被ANSI字眼嚇倒。假如你已經有一個編譯器,它順從ANSI指令,那麼也一樣。GNU C編譯器(gcc)是很好的選擇,它被廣泛使用。大部分操作系統在其標準安裝中附帶了C編譯器,不過Solaris和HP-UX除外。假如你使用這樣的操作系統,那可能沒有安裝編譯器。

理論上你應該在即將運行squid的機器上編譯squid。安裝過程偵察你的操作系統以發現特定的參數,例如可用文件描述符的數量。然而,假如你的系統沒有C編譯器存在,你也許會在其他機器上編譯squid,然後把二進制代碼copy回來。如果操作系統不同,那麼squid可能會遇到問題。假如操作系統有不同的內核配置,squid會變得混亂。

除了C編譯器,你還需要perl和awk。awk是所有unix系統的標準程序,所以你不必擔心它。perl也是相當普及的,但它也許沒有默認安裝在你的系統上。你需要gzip程序來解壓源代碼發佈文件。

對Solaris用戶,請確認/usr/ccs/bin包含在你的PATH環境變量裏,即使你使用gcc編譯器。爲了編譯squid,make和ar程序需要在這個目錄找到。



3.2 解開源代碼包

在下載完源代碼後,你需要在某個目錄解開它。具體哪個目錄無關緊要。你能解開squid在你的家目錄或任何其他地方,大概需要20M的自由磁盤空間。我個人喜歡用/tmp。使用tar命令來展開源代碼目錄:

% cd /tmp

% tar xzvf /some/where/squid-2.5.STABLE4-src.tar.gz

一些tar程序不支持z選項,該選項自動解壓gzip文件。如果這樣,你需要運行如下命
令:

% gzip -dc /some/where/squid-2.5.STABLE4-src.tar.gz | tar xvf -

一旦源代碼被展開,下一步通常是配置源代碼樹。然而,假如這是你第一次編譯squid,你應確認特定的內核資源限制足夠高。怎樣發現,請繼續。



3.3 調整內核

Squid在高負載下,需要大量的內核資源。特別的,你需要給你的系統配置比正常情況更高的文件描述符和緩存。文件描述符的限制通常很惱人。你最好在開始編譯squid之前來增加這些限制的大小。

因爲這點,你可能爲了避免重建內核的麻煩,而傾向於使用預編譯的二進制版本。不幸的是,不管如何你必須重建一個新內核。squid和內核通過數據結構來交換信息,數據結構的大小不能超過設置的文件描述符的限制。squid在運行時檢查這些設置,並且使用最安全的(最小的)值。這樣,即使預編譯的二進制版本有比你的內核更高的文件描述符,但還是以你係統內核的實際數值爲主。

爲了改編一些參數,你需要重建新內核。這個過程在不同的操作系統之間不同。假如需要,請參閱Unix系統管理員手冊(Prentice Hall出版)或者你的操作系統文檔。假如你正使用Linux,可能不必重建內核。


3.3.1 文件描述符

文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。Unix操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix通常有一個系統級的限制。

因爲squid的工作方式,文件描述符的限制可能會極大的影響性能。當squid用完所有的文件描述符後,它不能接收用戶新的連接。也就是說,用完文件描述符導致拒絕服務。直到一部分當前請求完成,相應的文件和socket被關閉,squid不能接收新請求。當squid發現文件描述符短缺時,它會發布警告。

在運行./configure之前,檢查你的系統的文件描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024個文件描述符足夠了。非常忙的cache可能需要4096或更多。在配置文件描述符限制時,我推薦設置系統級限制的數量爲每個進程限制的2倍。

通常在你的Unix shell中能找到系統的文件描述符限制。所有的C shell及其類似的shell有內建的limit命令。更新的Bourne shell及其類似的shell有一條叫做ulimit的命令。爲了發現你的系統的文件描述符限制,試運行如下命令:

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

如果你不能確認文件描述符限制,squid的./configure腳本能替你做到。當你運行./configure時,請見3.4章節,觀察末尾這樣的輸出:

checking Maximum number of file descriptors we can open... 4096

假如其他的limit,ulimit,或者./configure報告這個值少於1024,你不得不在編譯squid之前,花費時間來增加這個限制值的大小。否則,squid在高負載時執行性能將很低。

增加文件描述符限制的方法因系統不同而不同。下面的章節提供一些方法幫助你開始。

3.3.1.1 Freebsd,NetBSD,OpenBSD

編輯你的內核配置文件,增加如下一行:

options       MAXFILES=8192

在OpenBSD上,使用option代替options。然後,configure,編譯,和安裝新內核。最後重啓系統以使內核生效。

3.3.1.2 Linux

在Linux上配置文件描述符有點複雜。在編譯squid之前,你必須編輯系統include文件中的一個,然後執行一些shell命令。請首先編輯/usr/include/bits/types.h文件,改變_ _FD_SETSIZE 的值:

#define _ _FD_SETSIZE    8192

下一步,使用這個命令增加內核文件描述符的限制:

# echo 8192 > /proc/sys/fs/file-max 

最後,增加進程文件描述符的限制,在你即將編譯squid的同一個shell裏執行:

sh# ulimit -Hn 8192

該命令必須以root運行,僅僅運行在bash shell。不必重啓機器。使用這個技術,你必須在每一次系統啓動後執行上述echo和ulimit命令,或者至少在squid啓動之前。假如你使用某個rc.d腳本來啓動squid,那是一個放置這些命令的好地方。

3.3.1.3 Solaris

增加該行到你的/etc/system文件:

set rlim_fd_max = 4096

然後,重啓機器以使改動生效。


3.3.2 Mbuf Clusters

BSD基礎的網絡代碼使用一個叫做mbuf(參閱W.R.Stevens的TCP/IP描述卷2)的數據結構。Mbuf典型的是小塊內存(例如128字節)。較大的網絡包的數據存儲在mbuf clusters裏。內核可能給系統可用的mbuf clusters的總數量強加一個最高限制。你能使用netstat命令來發現這個限制:

% 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

在這個例子裏,有8192個mbuf clusters可用,但是永遠不會同時用到6182個。當系統用盡mbuf clusters時,I/O機制例如read()和write()返回“無緩存空間可用”的錯誤信息。

NetBSD和OpenBSD使用netstat -m不會顯示mbuf的輸出。代替的,它們在syslog裏報告:"WARNING: mclpool limit reached" 。

爲了增加mbuf clusters的數量,你必須在內核配置文件裏增加一個選項:

options         NMBCLUSTERS=16384

3.3.3 臨時端口範圍

臨時端口是TCP/IP棧分配給出去連接的本地端口。換句話說,當squid發起一條連接到另一臺服務器,內核給本地socket分配一個端口號。這些本地端口號有特定的範圍限制。例如,在FreeBSD上,默認的臨時端口範圍是1024-5000。

臨時端口號的短缺對非常忙的代理服務器(例如每秒數百個連接)來說,會較大的影響性能。這是因爲一些TCP連接在它們被關閉時進入TIME_WAIT狀態。當連接進入TIME_WATI狀態時,臨時端口號不能被重用。

你能使用netstat命令來顯示有多少個連接進入這個狀態:

% 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

注意這個例子中既有客戶端連接又有服務器端的連接。客戶端連接有3128作爲臨時端口號,服務器端連接有80作爲遠程主機的端口號。臨時端口號出現在本地地址欄裏。在該例子裏,它們是19000秒。

如果你沒有看到數千個臨時端口在TIME_WAIT狀態,那也許不必增加這個端口範圍。在Freebsd上,用如下命令增加臨時端口範圍:

 # sysctl -w net.inet.ip.portrange.last=30000

在OpenBSD上,命令類似,但sysctl變量有不同的名字:

# sysctl -w net.inet.ip.portlast=49151

在NetBSD上,事情稍有不同。默認的值是49152-65535.爲了增加這個範圍,需改變最低限制:

# sysctl -w net.inet.ip.anonportmin=10000

在Linux上,簡單的寫一對數字到下列指定文件:

# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

不要忘記將這些命令加到你的系統啓動腳本中,以使機器每一次重啓後都生效。



3.4 Configure腳本

象許多其他Unix軟件一樣,squid在開始編譯之前使用./configure腳本來了解操作系統信息。./configure腳本由流行的GNU autoconf程序產生。當script運行時,它用不同的方法來偵察系統,以發現關於庫,函數,類型,參數,和有沒有功能被提供等。./configure所做的第一件事情是去找一個C編譯器。假如C編譯器沒有找到,或者編譯一個簡單的測試程序失敗,./configure腳本不能繼續。.

/configure腳本有大量的選項。最重要的是安裝prefix。在運行./configure之前,你需要決定squid被安裝在哪裏。prefix選項指定squid日誌,二進制文件,和配置文件的默認位置。你可以在安裝之後改變這些文件的位置,但假如你現在決定,事情更容易。

默認的安裝位置是/usr/local/squid.squid將文件放在prefix指定目錄下面的7個子目錄:

% 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目錄存放一些相對較小的文件(或其他目錄),這些文件不經常改變。但var目錄的文件別有洞天。這裏你可以發現squid的日誌文件,它增長得非常大(數十或數百兆)。var也是實際磁盤cache的默認位置。你也許想將var目錄放在磁盤空間足夠的位置,這樣做較容易的方法是使用--localstatedir選項:

% ./configure --localstatedir=/bigdisk/var

當配置squid時,你不必對這些路徑名稱擔心太多。你以後可以在squid.conf文件裏改變這些路徑名。


3.4.1 configure選項

./configure腳本有大量的不同選項,它們以-開始。當你敲入./configure --help時,能看到選項的完整列表。一些選項對所有configure腳本是通用的,還有一些是squid專有的。下面是你可能用得到的標準選項:

--perfix =PREFIX

如前面描述的一樣,這裏設置安裝目錄。安裝目錄是所有可執行文件,日誌,和配置文件的默認目錄。在整本書中,$prefix指你選擇的安裝目錄。

--localstatedir =DIR

該選項允許你改變var目錄的安裝位置。默認是$prefix/var,但也許你想改變它,以使squid的磁盤緩存和日誌文件被存儲在別的地方。

--sysconfdir =DIR

該選項允許你改變etc目錄的位置。默認的是$prefix/etc.假如你想使用/usr作爲安裝位置,你也許該配置--sysconfdir爲/etc. 以下是squid的專有./configure選項:

--enable-dlmalloc[=LIB]

在一些系統上,內建的內存分配機制(malloc)在使用squid時表現不盡人意。使用--enable-dlmalloc選項將squid源代碼包中的dlmalloc包編譯和鏈接進來。假如你的系統中已安裝dlmalloc,你能使用=LIB參數指定庫的路徑。請見http://g.oswego.edu/dl/html/malloc.html更多關於dlmalloc的信息。

--enable-gnuregex

在訪問控制列表和其他配置指令裏,squid使用正則表達式作爲匹配機制。GNU的正則表達式庫包含在squid的源代碼包裏;它可以在沒有內建正則表達式的操作系統中使用。./configure腳本偵察你係統中的正則表達式庫,假如必要,它可以激活使用GNU正則表達式。如果因爲某些理由,你想強制使用GNU正則表達式,你可以將這個選項加到./configure命令後。

--enable-carp

Cache數組路由協議(CARP)用來轉發丟失的cache到父cache的數組或cluster。在10.9章有更多關於CARP的細節。

--enable-async-io[=N_THREADS]

異步I/O是squid技術之一,用以提升存儲性能。aufs模塊使用大量的線程來執行磁盤I/O操作。該代碼僅僅工作在linux和solaris系統中。=N_THREADS參數改變squid使用的線程數量。aufs和異步I/O在8.4章中被討論。

請注意--enable-async-io是打開其他三個./configure選項的快捷方式,它等同於:

 --with-aufs-threads=N_THREADS
     
--with-pthreads
    
--enable-storeio=ufs,aufs
    
--with-pthreads

該選項導致編譯過程鏈接到你係統中的P線程庫。aufs存儲模塊是squid中唯一需要使用線程的部分。通常來說,如果你使用--enable-saync-io選項,那麼不必再單獨指定該選項,因爲它被自動激活了。

--enable-storeio=LIST

Squid支持大量的不同存儲模塊。通過使用該選項,你告訴squid編譯時使用哪個模塊。在squid-2.5中,支持ufs,aufs,diskd,和null模塊。通過查詢src/fs中的目錄,你能得到一個模塊列表。

LIST是一個以逗號分隔的模塊列表,例如:

% ./configure --enable-storeio=afus,diskd,ufs

ufs模塊是默認的,看起來問題最少。不幸的是,它性能有限。其他模塊可能在某些操作系統中不必編譯。關於squid存儲模塊的完整描述,請見第8章。

--with-aufs-threads=N_THREADS

指定aufs存儲機制使用的線程數量(見8.4章)。squid默認根據緩存目錄的數量,自動計算需要使用多少線程。

--enable-heap-replacement

該選項不再使用,但被保留用於向後兼容性。你該使用--enable-removal-policies來代替。

--enable-removal-policies=LIST

排除策略是squid需要騰出空間給新的cache目標時,用以排除舊目標的機制。squid-2.5支持3個排除策略:最少近期使用(LRU),貪婪對偶大小(GDS),最少經常使用(LFU)。然而,因爲一些理由,./configure選項使指定的替代策略和需要執行它們的基本數據結構之間的差別模糊化。LRU是默認的,它以雙鏈表數據結構執行。GDS和LFU使用堆棧的數據結構。

爲了使用GDS或LFU策略,你指定:

% ./configure --enable-removal-policies=heap

然後你在squid的配置文件裏選擇使用GDS或LFU。假如你想重新使用LRU,那麼指定:

% ./configure --enable-removal-policies=heap,lru

更多的關於替換策略的細節請見7.5章。

--enable-icmp

如在10.5章中描述的一樣,squid能利用ICMP消息來確定迴環時間尺寸,非常象ping程序。你能使用該選項來激活這些功能。

--enable-delay-pools

延時池是squid用於傳輸形狀或帶寬限制的技術。該池由大量的客戶端IP地址組成。當來自這些客戶端的請求處於cache丟失狀態,他們的響應可能被人工延遲。關於延時池的更多細節請見附錄C。

--enable-useragent-log

該選項激活來自客戶請求的HTTP用戶代理頭的日誌。更多細節請見13.5章。

--enable-referer-log

該選項激活來自客戶請求的HTTP referer日誌。更多細節請見13.4章。

--disable-wccp

Web cache協調協議(WCCP)是CISCO的專有協議,用於阻止或分發HTTP請求到一個或多個caches。WCCP默認被激活,假如你願意,可以使用該選項來禁止該功能。

--enable-snmp

簡單網絡管理協議(SNMP)是監視網絡設備和服務器的流行方法。該選項導致編譯過程去編譯所有的SNMP相關的代碼,包括一個裁切版本的CMU SNMP庫。

--enable-cachemgr -hostname[=hostname]

cachemgr是一個CGI程序,你能使用它來管理查詢squid。默認cachemgr的hostname值是空的,但你能使用該選項來指定一個默認值。例如:

% ./configure --enable-cachemgr-hostname=mycache.myorg.net
    
--enable-arp-acl

squid在一些操作系統中支持ARP,或者以太地址訪問控制列表。該代碼使用非標準的函數接口,來執行ARP訪問控制列表,所以它默認被禁止。假如你在linux或solaris上使用squid,你可能用的上這個功能。

--enable-htcp

HTCP是超文本緩存協議--類似於ICP的內部緩存協議。更多細節請見10.8章。

--enable-ssl

使用該選項賦予squid終止SSL/TLS連接的能力。注意這僅僅工作在web加速器中用以加速請求。更多細節請見15.2.2章節。

--with-openssl[=DIR]

假如必要,你使用該選項來告訴squid到哪裏找到OpenSSL庫或頭文件。假如它們不在默認位置,在該選項後指定它們的父路徑。例如:

% ./configure --enable-ssl --with-ssl=/opt/foo/openssl

在這個例子中,你的編譯器將在/opt/foo/openssl/include目錄中找頭文件,在/opt/foo/openssl/lib中找庫文件。

--enable-cache-digests

Cache消化是ICP的另一個替代,但有着截然不同的特性。請見10.7章。

--enable-err-languages="lang1 lang2 ..."

squid支持定製錯誤消息,錯誤消息可以用多種語言報告。該選項指定複製到安裝目錄($prefix/share/errors)的語言。假如你不使用該選項,所有可用語言被安裝。想知道何種語言可用,請見源代碼包裏errors目錄下的目錄列表。如下顯示如何激活多種語言:

% ./configure --enable-err-languages="Dutch German French" ...
    
--enable-default-err-language=lang

該選項設置error_directory指令的默認值。例如,假如你想使用荷蘭語,你能這樣指定:

% ./configure --enable-default-err-language=Dutch

你也能在squid.conf裏指定error_directory指令,在附錄A中有描述。假如你忽略該選項,英語是默認錯誤語言。

--with-coss-membuf-size=N

循環目錄存儲系統(coss)是squid的試驗性存儲機制。該選項設置coss緩存目錄的內存緩衝大小。注意爲了使用coss,你必須在--enable-storeio選項裏指定存儲類型。

該參數以字節形式賦值,默認是1048576字節或1M。你能指定2M緩衝如下:

% ./configure --with-coss-membuf-size=2097152
    
--enable-poll

unix提供兩個相似的函數用以在I/O事件裏掃描開放文件描述符:select()和poll()./configure腳本通常能非常好的計算出何時使用poll()來代替select().假如你想強制使用poll(),那麼指定該選項。

--desable-poll

類似的,如果不使用poll(),那麼指定該選項。

--disable-http-violations

squid默認可以被配置成違背HTTP協議規範。你能使用該選項來刪除違背HTTP協議的代碼。

--enable-ipf-transparent

在第9章中,我將描述如何配置squid來攔截緩存。一些操作系統使用IP Filter包來協助攔截緩存。在這些環境下你應該使用該./configure選項。如果你使用了該選項,但是編譯器提示src/client_side.c文件出錯,那是因爲IP Filter包沒有或沒有正確的安裝在你的系統中。

--enable-pf-transparent

你可能需要指定該選項,使用PF包過濾器在操作系統中攔截HTTP。PF是OpenBSD的標準包過濾器,也可能被髮布到其他系統中。假如你使用該選項,但是編譯器提示src/client_side.c文件出錯,那是因爲PF沒有實際安裝到你的系統中。

--enable-linux-netfilter

Netfilter是linux 2.4系列內核的包過濾器名字。假如你想在linux2.4或以後的版本中使用HTTP攔截功能,那麼激活該選項。

--disable-ident-lookups

ident是一個簡單的協議,允許服務器利用客戶端的特殊TCP連接來發現用戶名。假如你使用該選項,編譯器將把執行這些查詢的代碼排除出去。即使你在編譯時保留了這些代碼,除非你在squid.conf文件裏指定,squid不會執行ident查詢。

--disable-internal-dns

squid源代碼包含兩個不同的DNS解決方案,叫做“內部的”和“外部的”。內部查詢是默認的,但某些人可能要使用外部技術。該選項禁止內部功能,轉向使用舊的方式。

內部查詢使用 squid自己的DNS協議執行工具。也就是說,squid產生未完成的DNS查詢並且將它們發送到一個解析器。假如超時,它重新發送請求,你能指定任意數量的解析器。該工具的有利處之一是,squid獲得準確無誤的DNS響應的TTLs。

外部查詢利用C庫的gethostbyname()和gethostbyaddr()函數。squid使用一個外部進程池來製造並行查詢。使用外部DNS解析的主要弊端是你需要更多的輔助進程,增加squid的負載。另一個麻煩是C庫函數不在響應裏傳輸TTLs,這樣squid使用postive_dns_ttl指令提供的一個常量值。

--enable-truncate

truncate()系統調用是unlink()的替代品。unlink()完全刪除cache文件,truncate()將文件大小設爲零。這樣做釋放了分配給該文件的磁盤空間,但留下適當的目錄接口。該選項存在的理由是,某些人相信(或希望)truncate()比unlink()性能表現更好。然而,壓力測試顯示兩者有很少的或根本沒有區別。

--disable-hostname-checks

默認的,squid要求URL主機名在一定程度上遵守古老的RFC 1034規範:

標籤必須遵循下列ARPANET主機名規則。它們必須以字母開始,以字母或數字結尾,僅僅包含字母,數字和下劃線。

這裏字母意味着ASCII字符,從A到Z。既然國際域名日益流行,你可能希望使用該選項來移除限制。

--enable-underscores

該選項控制squid針對主機名裏下劃線的行爲。通用的標準是主機名裏不包含下劃線字符,儘管有些人不贊成這點。squid默認會對URL主機名裏帶下劃線的請求產生一條錯誤消息。你能使用該選項,讓squid信任它們,把它們當作合法的。然而,你的DNS解析器也許強迫使用非下劃線請求,並且對帶下劃線的主機名解析失敗。

--enable-auth[=LIST]

該選項控制在squid的二進制文件裏支持哪種驗證機制。你能選擇下列機制的任意組合:basic,digest,ntlm.假如你忽略該選項,squid僅僅支持basic驗證。假如你使用不帶參數的--enable-auth選項,編譯進程將增加對所有驗證機制的支持。你可以使用以逗號分隔的驗證機制列表:

% ./configure --enable-auth=digest,ntlm

我在第六章和第十二章裏會談得更多。

--enable-auth-helpers=LIST

這個舊選項現在已捨棄了,但爲了保持向後兼容性仍保留着。你可以使用--enable-basic-auth-helperes=LIST來代替。

--enable-basic-auth-helpers=LIST

使用該選項,你能將helpers/basic_auth目錄的一個或多個HTTP Basic驗證輔助程序編譯進來。請見12.2章找到它們的名字和描述。

--enable-ntlm-auth-helpers=LIST

使用該選項,你能將helpers/ntlm_auth目錄的一個或多個HTTP NTLM驗證輔助程序編譯進來。請見12.4章找到它們的名字和描述。

--enable-digest-auth-modules=LIST

使用該選項,你能將helpers/digest_auth目錄的一個或多個HTTP Digest驗證輔助程序編譯進來。請見12.3章找到它們的名字和描述。

--enable-external-acl-helpers=LIST

使用該選項,你能編譯一個或多個擴展ACL輔助程序,這些在12.5章中討論。例如:

% ./configure --enable-external-acl-helpers=ip_user,ldap_group
    
--disable-unlinkd

unlinkd是另一個squid的外部輔助進程。它的基本工作是對cache文件執行unlink()或truncate()系統調用。通過在外部進程裏執行文件刪除工作,能給squid帶來明顯的性能提升。使用該選項來禁止外部unlink進程功能。

--enable-stacktrace

某些系統支持在程序崩潰時,自動產生數據追蹤。當你激活該功能後,如果squid崩潰,數據追蹤信息被寫到cache.log文件。這些信息對開發和程序bug調試有用。

--enable-x-accelerator-vary

該高級功能可能在squid被配置成加速器時使用。它建議squid在響應請求時,從後臺原始服務器中尋找X-Accelerator-Vary頭。請見15.5章。


3.4.2 運行configure

現在我們準備運行./configure腳本。進入源代碼的頂級目錄敲入./configure,後面跟上前面提到過的任意選項,例如:

% cd squid-2.5.STABLE4
    
% ./configure --enable-icmp --enable-htcp

./configure的工作就是偵察你的操作系統,以發現什麼東西可用,什麼不可用。它首先做的事情之一就是確認你的C編譯器可用。假如./configure檢測到你的C編譯器有問題,腳本會退出,返回如下錯誤:

configure: error: installation or configuration problem: C compiler
    
cannot create executables.

很可能你從不會看到這個消息。假如看到了,那意味着你的系統中沒有C編譯器存在,或者編譯器沒有正確安裝。請見config.log文件找到解決問題的建議。假如你的系統中有多個C編譯器,你可以在運行./configure之前設置CC環境變量,來告訴./configure使用哪個:

% setenv CC /usr/local/bin/gcc
    
% ./configure ...

在./configure檢查完該編譯器後,它查找頭文件,庫文件和函數的長列表。通常你不必擔心該部分。在某些實際情況中,./configure會終止以引起你的注意,某些事情可能有問題,例如沒有足夠的文件描述符。假如你指定不完整的或不合理的命令行選項,它也會終止。假如有錯誤發生,請檢查config.log輸出。./configure的最終任務是創造Makefiles和其他文件,這些文件基於squid從你係統中瞭解到的知識。到此爲止,你準備做編譯工作。



3.5 編譯

一旦./configure完成了它的工作,你簡單的敲入make開始編譯源代碼:

%make

正常來說,該過程很順利,你可以見到大量的滾動行。

你也許見到一些編譯器警告。大多數情況下,可以安全的忽略這些。假如這些警告非常多,並且一些看起來非常嚴重,請將它們報告給開發者,在第16.5章中有描述。

假如編譯過程沒有錯誤,你可以轉移到下一節,描述如何安裝你剛纔編譯的程序。

爲了驗證編譯是否成功,你可以再次運行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...

因爲許多理由,編譯步驟也許會失敗,包括:

源代碼bugs

通常squid源代碼是完整的調試過的。然而,你也許會遇到某些bugs或問題從而阻止你編譯。這種問題在新的開發版本中更容易出現,請將它們報告給開發者。

編譯器安裝問題

不正確安裝的C編譯器不能夠編譯squid或其他軟件包。通常編譯器隨着操作系統預安裝,所以你不必擔心它。然而,假如你在操作系統安裝完後,試圖升級編譯器,那麼可能會犯錯誤。絕對不要把已經安裝好的編譯器從一臺機器拷貝到另一臺,除非你絕對清楚你在做什麼。我覺得在每臺機上獨立的安裝編譯器總是最好的。

請確認你的編譯器的頭文件總是與庫文件同步。頭文件通常在/usr/include目錄,而庫文件在/usr/lib目錄。Linux的流行RPM系統允許它去升級其中之一,但並非另一個。假如庫文件基於不同的頭文件,squid不能編譯。

假如你想在開源BSD變種之一中升級編譯器,請確認在/usr/src目錄中運行make world,這好過從/usr/src/lib或/usr/src/include中運行。

如下是一些通用的編譯器問題和錯誤消息:

Solaris: make[1]: *** [libmiscutil.a] Error 255

這意味着./configure不能發現ar程序。請確認/usr/ccs/bin位於你的PATH環境變量裏。假如你沒有安裝Sun的編譯器,那麼需要GNU的工具。(http://www.gnu.org/directory/binutils.html).

Linux: storage size of 'rl' isn't known

這是因爲頭文件和庫文件不匹配所致,象前面描述的一樣。請確認同時升級兩者。

Digital Unix: Don't know how to make EXTRA_libmiscutil_a_SOURCES. Stop.

Digital Unix的make程序不能兼容automake包產生的Makefile文件。例如,lib/Makefile.in包含如下行:

noinst_LIBRARIES = /
        
        @LIBDLMALLOC@ /
        
        libmiscutil.a /
        
        libntlmauth.a /
        
        @LIBREGEX@

在替換後,當lib/Makefile被創建時,它看起來如下:

noinst_LIBRARIES = /
      
        /
             
        libmiscutil.a /
            
        libntlmauth.a /
            
        <TAB>

象上面顯示的一樣,最後一行包括一個不可見的TAB字符,它阻止了make。通過安裝和使用GNU make,或者手工編輯lib/Makefile如下,來解決這個問題:

noinst_LIBRARIES = /
      
        /
             
        libmiscutil.a /
            
        libntlmauth.a

假如你在編譯squid時遇到問題,請先檢查FAQ。你也許該在Squid的web站點上搜索(使用主頁裏的搜索欄)。最後,假如你仍有問題,請發郵件到[email protected]列表。



3.6 安裝

在編譯完後,你需要把程序安裝到指定的目錄。可能需要超級用戶權限來把它們放置到安裝目錄。所以,請先切換到root:

%su
password:
#make install

假如你通過使用--enable-icmp選項,激活了squid的ICMP衡量功能,那麼必須安裝pinger程序。pinger程序必須以超級用戶權限安裝,因爲僅僅允許root來發送和接受ICMP消息。下列命令以相應的許可來安裝pinger程序:

#make install-pinger

在安裝完後,你將在squid的安裝目錄裏(默認是/usr/local/squid)見到下列目錄和文件:

sbin

sbin目錄的程序正常只能被root啓動

sbin/squid

Squid的主程序

bin

bin目錄包含對所有用戶可用的程序

bin/RunCache

RunCache是一個shell腳本,你能用它來啓動squid。假如squid死掉,該腳本自動重啓它,除非它檢測到經常的重啓。RunCache是一個時間遺留的產物,那時Squid還不是後臺服務進程。在最近的版本里,RunCache很少用到,因爲Squid自動重啓它自身,當你不使用-N選項時。

bin/RunAccel

RunAccel與RunCache幾乎一致,唯一的不同是它增加了一個命令行參數,告訴squid在哪裏偵聽HTTP請求。

bin/squidclient

squidclient是個簡單的HTTP客戶端程序,你能用它來測試squid。它也有一些特殊功能,用以對運行的squid進程發起管理請求。

libexec

libexec目錄傳統的包含了輔助程序。有一些命令你不能正常的啓動。然而,這些程序通常被其他程序啓動。

libexec/unlinkd

unlinkd是一個輔助程序,它從cache目錄裏刪除文件。如你後面看到的一樣,文件刪除是個性能瓶頸。通過在外部進程裏執行刪除操作,Squid提升了一些執行性能。

libexec/cachemgr.cgi

cachemgr.cgi是Squid管理功能的CGI接口。爲了使用它,你需要拷貝該程序到你的WEB服務器的cgi-bin目錄。在14.2章中有更多描述。

libexec/diskd(optional)

假如你指定了--enable-storeio=diskd,你才能看到它。

libexec/pinger(optional)

假如你指定了--enable-icmp,你才能看到它。

etc

etc目錄包含squid的配置文件。

etc/squid.conf

這是squid的主要配置文件。初始的該文件包含了大量的註釋,用以解釋每一個選項做什麼。在你理解了這些配置指令後,建議你刪除這些註釋,讓配置文件更小和更容易閱讀。注意假如該文件存在,安裝過程不會覆蓋該文件。

etc/squid.conf.default

這是從源代碼目錄中拷貝過來的默認配置文件。在升級了squid安裝後,你也許發現有一份當前默認配置文件的拷貝是有用的。可能會增加新的配置指令,一些存在的舊指令可能有所改變。

etc/mime.conf

mime.conf文件告訴squid對從FTP和Gopher服務器獲取的數據使用何種MIME類型。該文件是一個關聯文件名擴展到MIME類型的表。正常而言,你不必編輯該文件。然而,你可能需要增加特殊文件類型的接口,它們在你的組織內使用。

etc/mime.conf.default

這是從源代碼目錄裏拷貝過來的默認mime.conf文件。

share

share目錄通常包括squid的只讀數據文件。

share/mib.txt

這是squid的SNMP管理信息基礎(MIB)文件。squid自身不使用該文件,然而,你的SNMP客戶端軟件(例如snmpget和多路由走向圖(MRTG))需要該文件,用以理解來自squid的SNMP對象可用。

share/icons

share/icons目錄包含大量的小圖標文件,squid用在FTP和Gopher目錄列舉裏。正常而言,你不必擔心這些文件,但如果需要,你可以改變它們。

share/errors

share/errors目錄包含了squid顯示給用戶看的錯誤消息模板。這些文件在你安裝squid時,從源代碼目錄拷貝而來。如果需要你可以編輯它們。然而,在每次運行make install時,安裝過程總會覆蓋它們。所以假如你想定製錯誤消息,建議你把它們放在不同的目錄。

var

var目錄包含了不是很重要的和經常變化的文件。這些文件你不必正常的備份它們。

var/logs

var/logs目錄是squid不同日誌文件的默認位置。當你第一次安裝squid時,它是空的。一旦squid開始運行,你能在這裏看到名字爲access.log,cache.log和store.log這樣的文件。

var/cache

假如你不在squid.conf文件裏指定,這是默認的緩存目錄(cache_dir)。第七章有關於緩存目錄的所有細節。



3.7 打補丁

在你運行squid一段時間後,你可能發現需要打源代碼補丁,用以修正bug或者增加試驗性的功能。在squid-cache.org站點上,對重要的bug修正會發布補丁。假如你不想等到下一個官方發佈版本,你能下載補丁,並且打到你的源代碼中。然後你需要重新編譯squid。

爲了打補丁-或者有時候叫差別文件-你需要一個叫做"patch"的程序。你的操作系統必須有該程序。如果沒有,你可以從GNU工具集裏下載(http://www.gnu.org/directory/patch.html). 注意假如你在使用匿名CVS(見2.4節),你不必擔心補丁文件。當你升級源代碼樹時,CVS系統自動升級了補丁。

爲了打補丁,你必須把補丁文件存放在系統中某處。然後進入到squid的源代碼目錄,運行如下命令:

% cd squid-2.5.STABLE4
% patch < /tmp/patch_file 

默認的,在patch程序運行時,它告訴你它正在做什麼。通常輸出滾動非常快,除非有問題。你能安全的忽略它輸出的offset NNN lines警告。假如你不想見到所有這些輸出,使用-s選項選擇安靜模式。

當補丁更新了源代碼後,它創造了原始文件的拷貝。例如,假如你對src/http.c打一個補丁,備份文件名就是src/http.c.orig.這樣,假如你在打了補丁後想撤銷這個操作,簡單的重命名所有的.orig文件到它們以前的格式。爲了成功的使用該技術,建議你在打補丁之前刪除所有的.orig文件。

假如patch程序遇到問題,它停止運行並且給出建議。通常問題如下:

  • 在錯誤的目錄運行patch程序。解決的方法是,進入到正確的目錄,或者使用patch的-p選項。

  • 補丁已打過。patch會告訴你是否已打過補丁文件。在這樣的情況下,它會問你是否撤銷這個文件的補丁。

  • patch程序不能理解你賦給它的文件。補丁文件通常有三個風格:正常的,context的和unified的。舊版本的patch程序可能不理解後兩者的差異輸出。從GNU的FTP站點獲取最近的版本能解決該問題。

  • 損壞的補丁文件。假如你在下載和存儲補丁文件時不小心,它有可能被損壞。有時候人們以email消息發送補丁文件,在新的窗口裏,它們被簡單的剪切和粘貼。

  • 在這樣的系統中,剪切和粘貼能將Tab字符改變爲空格,或者不正確的捆綁長行。這些改變混亂了patch。-l選項也許有用,但最好是正確的拷貝和存儲補丁文件。

某些時候patch不能應用部分或所有的差別文件。在這樣的情況下,你能見到類似於Hunk 3 of 4 failed的消息。失敗的部分被存儲在命名爲.rej的文件裏。例如,假如在處理src/http.c時失敗,patch程序將該差別文件片斷存爲src/http.c.rej.在這樣的情況下,你也許能手工修正這些問題,但它通常不值得這麼做。假如你有大量的"failed hunks"或者.rej文件,建議你去下載最近源代碼版本的完整新拷貝。

在你打完補丁後,你必須重新編譯squid。make的先進功能之一就是它僅僅編譯改變了的文件。但有時候make不能理解錯綜複雜的依賴關係,它沒有完整的重編譯所需文件。爲了安全起見,通常建議你去重編譯所有文件。最好的方法是在開始編譯之前清除源代碼樹:

%make clean

%make


3.8 重運行configure

有時候你可能發現有必要重新運行./configure。例如,假如你調整了內核參數,你必須再次運行./configure以使它能發現新設置。當你閱讀本書時,你也發現你必須使用./configure選項來激活所需的功能。

以相同的選項重運行./configure,使用如下命令:

%config.status --recheck

另一個技術是`touch config.status`文件,它更新了該文件的時間戳。這導致make在編譯源代碼之前,重新運行./configure腳本:

% touch config.status
      
% make

如果增加或刪除./configure選項,你必須重新敲入完整的命令行。假如你記不住以前的選項,請查看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.

在運行./configure之後,你必須再次編譯和安裝squid。安全起見,建議先運行make clean:

%make clean
      
%make

請回想一下,./configure會緩存它在你係統中發現的東西。在這樣的形式下,你可能想清除這些緩存,從頭開始編譯過程。假如喜歡,你可以簡單的刪除config.cache文件。然後,下一次./configure運行時,它不會使用以前的數值。你也能恢復squid源代碼樹到它的configure之前的狀態,使用如下命令:

%make distclean

這將刪除所有的目標文件和其他被./configure和make程序產生的文件。

 
發佈了12 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章