[好文共享]《Squid 中文權威指南》第5章 譯者:彭勇華

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

[好文共享]《Squid 中文權威指南》第5章 譯者:彭勇華

譯者序:
本人在工作中維護著數台Squid 伺服器,多次參閱Duane Wessels(他也是Squid 的創始人)的這本書,原書名是"Squid: The Definitive Guide",由O'Reilly 出版。我在業餘時間把它翻譯成中文,希望對中文Squid 用戶有所幫助。對普通的單位上網用戶,Squid 可充當代理伺服器;而對Sina,NetEase 這樣的大型站點,Squid 又充當WEB 加速器。這兩個角色它都扮演得異常優秀。窗外繁星點點,開源的世界亦如這星空般美麗,而Squid 是其中耀眼的一顆星。
對本譯版有任何問題,請跟我聯繫,我的Email是:yonghua_peng@yahoo.com.cn  彭勇華

--------------------------------------------------------------------------------------

第5章 運行Squid

5.1 squid 命令行選項

在開始其他事情之前,讓我們先看一下squid 的命令行選項。這裡的許多選項你從不會使用,另外有些僅僅在調試問題時有用。

-a port
指定新的http_port 值。該選項覆蓋了來自squid.conf 的值。然而請注意,你能在squid.conf里指定多個值。-a 選項僅僅覆蓋配置文件里的第一個值。(該選項使用字母a 是因為在Harvest cache 里,HTTP 埠被叫做ASCII 埠)

-d level
讓squid 將它的調試信息寫到標準錯誤(假如配置了,就是cache.log 和syslog)。level參數指定了顯示在標準錯誤里的消息的最大等級。在多數情況下,d1 工作良好。請見16.2章關於調試等級的描述。

-f file
指定另一個配置文件。

-h
顯示用法。

-k function
指示squid 執行不同的管理功能。功能參數是下列之一:reconfigure,rotate,shutdown,interrupt,kill,debug,check,or parse。
+ reconfigure 導致運行中的squid 重新讀取配置文件。
+ rotate導致squid 滾動它的日誌,這包括了關閉日誌,重命名,和再次打開它們。
+ shutdown 發送關閉squid 進程的信號。
+ interrupt 立刻關閉squid,不必等待活動會話完成。
+ kill 發送KILL 信號給squid,這是關閉squid 的最後保證。
+ debug 將squid 設置成完全的調試模式,假如你的cache 很忙,它能迅速的用完你的磁碟空間。
+ check 簡單的檢查運行中的squid 進程,返回的值顯示squid 是否在運行。
+ 最後,parse 簡單的解析squid.conf 文件,如果配置文件包含錯誤,進程返回非零值。

-s
激活將日誌記錄到syslog 進程。squid 使用LOCAL4 syslog 設備。0 級別調試信息以優先順序LOG_WARNING 被記錄,1 級別消息以LOG_NOTICE 被記錄。更高級的調試信息不會被發送到syslogd.你可以在/etc/syslogd.conf 文件里使用如下介面:
local4.warning /var/log/squid.log

-u port
指定另一個ICP 埠號,覆蓋掉squid.conf 文件里的icp_port。

-v
列印版本信息。

-z
初始化cache,或者交換,目錄。在首次運行squid,或者增加新的cache 目錄時,你必須使用該選項。

-C
阻止安裝某些信號句柄,它們捕獲特定的致命信號例如SIGBUS 和SIGSEGV。正常的,這些信號被squid 捕獲,以便它能幹凈的關閉。然而,捕獲這些信號可能讓以後調試問題困難。使用該選項,致命的信號導致它們的默認動作,通常是coredump。

-D
禁止初始化DNS 測試。正常情況下,squid 直到驗證它的DNS 可用才能啟動。該選項阻止了這樣的檢測。你也能在squid.conf 文件里改變或刪除dns_testnames 選項。

-F
讓squid 拒絕所有的請求,直到它重新建立起存儲元數據。假如你的系統很忙,該選項可以減短重建存儲元數據的時間。然而,如果你的cache 很大,重建過程可能會花費很長的時間。

-N
阻止squid 變成後台服務進程。

-R
阻止squid 在綁定HTTP 埠之前使用SO_REUSEADDR 選項。

-V
激活虛擬主機加速模式。類似於squid.conf 文件里的httpd_accel_host virtual 指令。

-X
強迫完整調試模式,如你在squid.conf 文件里指定debug_options ALL,9 一樣。

-Y
在重建存儲元數據時,返回ICP_MISS_NOFETCH 代替ICP_MISS.忙碌的父cache 在重建時,該選項可以導致最少的負載。請見10.6.1.2 章。


5.2 對配置文件查錯

在開啟squid 之前,你應該謹慎的驗證配置文件。這點容易做到,運行如下命令即可:
%squid -k parse

假如你看不到輸出,配置文件有效,你能繼續後面的步驟。

然而,如果配置文件包含錯誤,squid 會告訴你:
squid.conf line 62: http_access allow okay2
aclParseAccessLine: ACL name 'okay2' not found.

這裡你可以看到,62 行的http_access 指令指向的ACL 不存在。有時候錯誤信息很少:
FATAL: Bungled squid.conf line 76: memory_pools

在這個情形里,我們忘記了在76 行的memory_pools 指令後放置on 或off。

建議你養成習慣:在每次修改配置文件后,使用squid -k parse。假如你不願麻煩,並且你的配置文件有錯誤,squid 會告訴你關於它們而且拒絕啟動。假如你管理著大量的cache,也許你會編輯腳本來自動啟動,停止和重配置squid。你能在腳本里使用該功能,來確認配置文件是有效的。


5.3 初始化cache 目錄

在初次運行squid 之前,或者無論何時你增加了新的cache_dir,你必須初始化cache 目錄。命令很簡單:
%squid –z

對UFS 相關的存儲機制(ufs,aufs,and diskd;見第8 章),該命令在每個cache_dir 下面創建了所需的子目錄。你不必擔心squid 會破壞你的當前cache 目錄(如果有的話)。

在該階段屬主和許可權是通常遇到的問題。squid 在特定的用戶ID 下運行,這在squid.conf 文件里的cache_effective_user 里指定。用戶ID 必須對每個cache_dir 目錄有讀和寫許可權。否則,你將看到如下信息:
Creating Swap Directories
FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:
(13) Permission denied

在這樣的情形下,你該確認/usr/local/squid/var/cache 目錄的所有組成都可被squid.conf給定的用戶ID 訪問。最終的組件--cache 目錄--必須對該用戶ID 可寫。

cache 目錄初始化可能花費一些時間,依賴於cache 目錄的大小和數量,以及磁碟驅動器的速度。假如你想觀察這個過程,請使用-X 選項:
%squid –zX


5.4 在終端窗口裡測試squid

一旦你已經初始化cache 目錄,就可以在終端窗口裡運行squid,將日誌記錄到標準錯誤。這樣,你能輕易的定位任何錯誤或問題,並且確認squid 是否成功啟動。使用-N 選項來保持squid 在前台運行,-d1 選項在標準錯誤里顯示1 級別的調試信息。
%squid -N -d1

你將看到類似於以下的輸出:
2003/09/29 12:57:52| Starting Squid Cache
version 2.5.STABLE4 for i386-unknown-freebsd4.8...
2003/09/29 12:57:52| Process ID 294
2003/09/29 12:57:52| With 1064 file descriptors available
2003/09/29 12:57:52| DNS Socket created on FD 4
2003/09/29 12:57:52| Adding nameserver 206.107.176.2 from /etc/resolv.conf
2003/09/29 12:57:52| Adding nameserver 205.162.184.2 from /etc/resolv.conf
2003/09/29 12:57:52| Unlinkd pipe opened on FD 9
2003/09/29 12:57:52| Swap maxSize 102400 KB, estimated 7876 objects
2003/09/29 12:57:52| Target number of buckets: 393
2003/09/29 12:57:52| Using 8192 Store buckets
2003/09/29 12:57:52| Max Mem size: 8192 KB
2003/09/29 12:57:52| Max Swap size: 102400 KB
2003/09/29 12:57:52| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
2003/09/29 12:57:52| Using Least Load store dir selection
2003/09/29 12:57:52| Set Current Directory to /usr/local/squid/var/cache
2003/09/29 12:57:52| Loaded Icons.
2003/09/29 12:57:52| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11.
2003/09/29 12:57:52| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.
2003/09/29 12:57:52| WCCP Disabled.
2003/09/29 12:57:52| Ready to serve reques

假如你看到錯誤消息,你該首先修正它。請檢查輸出信息的開始幾行以發現警告信息。最普通的錯誤是文件/目錄許可問題,和配置文件語法錯誤。假如你看到一條不引起注意的錯誤消息,請見16 章中關於squid 故障處理的建議和信息。如果還不行,請檢查squid FAQ,或查找郵件列表來獲得解釋。

一旦你見到"Ready to serve requests"消息,就可用一些HTTP 請求來測試squid。配置你的瀏覽器使用squid 作為代理,然後打開某個web 頁面。假如squid 工作正常,頁面被迅速載入,就象沒使用squid 一樣。另外,你可以使用squidclient 程序,它隨squid 發布:
% squidclient http://www.squid-cache.org/

假如它正常工作,squid 的主頁html 文件會在你的終端窗口裡滾動。一旦確認squid 工作正常,你能中斷squid 進程(例如使用ctrl-c)並且在後台運行squid。


5.5 將squid 作為服務進程運行

正常情況下你想將squid 以後台進程運行(不出現在終端窗口裡)。最容易的方法是簡單執行如下命令:
%squid –s

-s 選項導致squid 將重要的狀態和警告信息寫到syslogd。squid 使用LOCAL4 設備,和LOG_WARNING 和LOG_NOTICE 優先權。syslog 進程實際可能會或不會記錄squid 的消息,這依賴於它被如何配置。同樣的消息被寫進cache.log 文件,所以假如你願意,忽略-s 選項也是安全的。

當你不使用-N 選項來啟動squid,squid 自動在後台運行並且創建父/子進程對。子進程做所有的實際工作。父進程確認子進程總在運行。這樣,假如子進程意外終止,父進程啟動另外一個子進程以使squid 正常工作。通過觀察syslog 消息,你能看到父/子進程交互作用。
Jul 31 14:58:35 zapp squid: Squid Parent: child process 296 started

這裡顯示的父進程ID 是294,子進程是296。當你查看ps 的輸出,你可以看到子進程以(squid)形式出現:
%ps ax | grep squid
294 ?? Is 0:00.01 squid -sD
296 ?? S 0:00.27 (squid) -sD (squid)

假如squid 進程意外終止,父進程啟動另一個。例如:
Jul 31 15:02:53 zapp squid: Squid Parent: child process 296 exited due to signal 6
Jul 31 15:02:56 zapp squid: Squid Parent: child process 359 started

在某些情形下,squid 子進程可能立即終止。為了防止頻繁的啟動子進程,假如子進程連續5 次沒有運行至少10 秒鐘,父進程會放棄。
Jul 31 15:13:48 zapp squid: Squid Parent: child process 474 exited with status 1
Jul 31 15:13:48 zapp squid: Exiting due to repeated, frequent failures

如果發生這樣的事,請檢查syslog 和squid 的cache.log 以發現錯誤。


5.5.1 squid_start 腳本

當squid 以後台進程運行時,它查找squid 執行程序目錄下的名為squid_start 的文件。假如發現,該程序在父進程創建子進程之前被執行。你能使用該腳本完成特定的管理任務,例如通知某人squid 在運行,管理日誌文件等。除非squid_start 程序存在,squid 不會創建子進程。

squid_start 腳本在你使用絕對或相對路徑啟動squid 時才開始工作。換句話說,squid 不使用PATH 環境變數來定位squid_start.這樣,你應該養成習慣這樣啟動squid:
% /usr/local/squid/sbin/squid –sD

而不要這樣:
%squid –sD


5.6 啟動腳本

通常你希望squid 在每次計算機重啟后自動啟動。對不同的操作系統,它們的啟動腳本如何工作也很不同。我在這裡描述一些通用的環境,但對你自己的特殊操作系統,也許該有特殊的處理方法。


5.6.1 /etc/rc.local

最容易的機制之一是/etc/rc.local 腳本。這是個簡單的shell 腳本,在每次系統啟動時以root 運行。使用該腳本來啟動squid 非常容易,增加一行如下:
/usr/local/squid/sbin/squid –s

當然你的安裝位置可能不同,還有你可能要使用其他命令行選項。不要在這裡使用-N選項。

假如因為某些理由,你沒有使用cache_effective_user 指令,你可以嘗試使用su 來讓squid以非root 用戶運行:
/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'


5.6.2 init.d 和rc.d

init.d 和rc.d 機制使用獨立的shell 腳本來啟動不同的服務。這些腳本通常在下列目錄之中:/sbin/init.d, /etc/init.d, /usr/local/etc/rc.d.腳本通常獲取單一命令行參數,是start 或stop。某些系統僅僅使用start 參數。如下是啟動squid 的基本腳本:
#!/bin/sh
# this script starts and stops Squid
case "$1" in
start)
/usr/local/squid/sbin/squid -s
echo -n ' Squid'
;;
stop)
/usr/local/squid/sbin/squid -k shutdown
;;
esac

Linux 用戶可能在啟動squid 之前需要設置文件描述符限制。例如:
echo 8192 >; /proc/sys/fs/file-max
limit -HSn 8192

為了使用該腳本,先找到腳本存放的目錄。給它一個有意義的名字,類似於其他的系統啟動腳本。可以是S98squid 或squid.sh。通過重啟計算機來測試該腳本,而不要假想它會正常工作。


5.6.3 /etc/inittab

某些操作系統支持另一種機制,是/etc/inittab 文件。在這些系統中,init 進程啟動和停止基於運行等級的服務。典型的inittab 介面類似如此:
sq:2345:once:/usr/local/squid/sbin/squid –s

使用該介面,init 進程啟動squid 一次並且隨後忘記它。squid 確認它駐留在運行狀態,象前面描述的一樣。或者,你能這樣做:
sq:2345:respawn:/usr/local/squid/sbin/squid –Ns

這裡我們使用了respawn 選項,假如進程不存在init 會重啟squid。假如使用respawn,請確認使用-N 選項。

在編輯完inittab 文件后,使用下面的命令來使init 重新讀取它的配置文件和啟動squid:
# init q


5.7 chroot 環境

某些人喜歡在chroot 環境運行squid。這是unix 的功能,給予進程新的root 文件系統目錄。在squid 受安全威脅時,它提供額外等級的安全保護。假如攻擊者在某種程度上通過squid獲取了對操作系統的訪問權,她僅僅能訪問在chroot 文件系統中的文件。在chroot 樹之外的系統文件,她不可訪問。

最容易在chroot 環境里運行squid 的方法是,在squid.conf 文件里指定新的root 目錄,如下:
chroot /new/root/directory

chroot()系統調用需要超級用戶許可權,所以你必須以root 來啟動squid。

chroot 環境不是為unix 新手準備的。它有點麻煩,因為你必須在新的root 目錄里重複放置大量的文件。例如,假如默認的配置文件正常在/usr/local/squid/etc/squid.conf,並且你使用chroot 指令,那麼文件必須位於/new/root/directory/usr/local/squid/etc/squid.conf.你必須將位於$prefix/etc,$prefix/share,$prefix/libexec 下的所有文件拷貝到chroot 目錄。請確認$prefix/var 和cache 目錄在chroot 目錄中存在和可寫。

同樣的,你的操作系統需要將大量的文件放在chroot 目錄里,例如/etc/resolv.conf 和/dev/null.假如你使用外部輔助程序,例如重定向器(見11 章)或者驗證器(見12 章),你也需要來自/usr/lib 的某些共享庫。你可以使用ldd 工具來查找給定的程序需要哪些共享庫:
% ldd /usr/local/squid/libexec/ncsa_auth
/usr/local/squid/libexec/ncsa_auth:
libcrypt.so.2 =>; /usr/lib/libcrypt.so.2 (0x28067000)
libm.so.2 =>; /usr/lib/libm.so.2 (0x28080000)
libc.so.4 =>; /usr/lib/libc.so.4 (0x28098000)

你可以使用chroot 命令來測試輔助程序:
# chroot /new/root/directory /usr/local/squid/libexec/ncsa_auth
/usr/libexec/ld-elf.so.1: Shared object "libcrypt.so.2" not found

更多的關於chroot 的信息,請見你系統中chroot()的manpage。


5.8 停止squid

最安全的停止squid 的方法是使用squid -k shutdown 命令:
%squid -k shutdown

該命令發送TERM 信號到運行中的squid 進程。在接受到TERM 信號后,squid 關閉進來的套接字以拒收新請求。然後它等待一段時間,用以完成外出請求。默認時間是30 秒,你可以在shutdown_lifetime 指令里更改它。
假如因為某些理由,squid.pid 文件丟失或不可讀,squid -k 命令會失敗。在此情形下,你可以用ps 找到squid 的進程ID,然後手工殺死squid。例如:
%ps ax |grep squid

假如你看到不止一個squid 進程,請殺死以(squid)顯示的那個。例如:
% ps ax | grep squid
294 ?? Is 0:00.01 squid -sD
296 ?? S 0:00.27 (squid) -sD (squid)
% kill -TERM 296

在發送TERM 信號后,你也許想查看日誌,以確認squid 已關閉:
% tail -f logs/cache.log
2003/09/29 21:49:30| Preparing for shutdown after 9316 requests
2003/09/29 21:49:30| Waiting 10 seconds for active connections to finish
2003/09/29 21:49:30| FD 11 Closing HTTP connection
2003/09/29 21:49:31| Shutting down...
2003/09/29 21:49:31| FD 12 Closing ICP connection
2003/09/29 21:49:31| Closing unlinkd pipe on FD 9
2003/09/29 21:49:31| storeDirWriteCleanLogs: Starting...
2003/09/29 21:49:32| Finished. Wrote 253 entries.
2003/09/29 21:49:32| Took 0.1 seconds (1957.6 entries/sec).
2003/09/29 21:49:32| Squid Cache (Version 2.5.STABLE4): Exiting normally.

假如你使用squid -k interrupt 命令,squid 立即關閉,不用等待完成活動請求。這與在kill 里發送INT 信號相同。


5.9 重配置運行中的squid 進程

在你了解了更多關於squid 的知識后,你會發現對squid.conf 文件做了許多改動。為了讓新設置生效,你可以關閉和重啟squid,或者在squid 運行時,重配置它。

重配置運行中的squid 最好的方法是使用squid -k reconfigure 命令:
%squid -k reconfigure

當你運行該命令時,HUP 信號被發送到運行中的squid 進程。然後squid 讀取和解析squid.conf 文件。假如操作成功,你可以在cache.log 里看到這些:
2003/09/29 22:02:25| Restarting Squid Cache (version 2.5.STABLE4)...
2003/09/29 22:02:25| FD 12 Closing HTTP connection
2003/09/29 22:02:25| FD 13 Closing ICP connection
2003/09/29 22:02:25| Cache dir '/usr/local/squid/var/cache' size remains unchanged
at 102400 KB
2003/09/29 22:02:25| DNS Socket created on FD 5
2003/09/29 22:02:25| Adding nameserver 10.0.0.1 from /etc/resolv.conf
2003/09/29 22:02:25| Accepting HTTP connections at 0.0.0.0, port 3128, FD 9.
2003/09/29 22:02:25| Accepting ICP messages at 0.0.0.0, port 3130, FD 11.
2003/09/29 22:02:25| WCCP Disabled.
2003/09/29 22:02:25| Loaded Icons.
2003/09/29 22:02:25| Ready to serve requests.

在使用reconfigure 選項時你須謹慎,因為所做的改變可能會導致致命錯誤。例如,請注意squid 關閉和重新打開進來的HTTP 和ICP 套接字;假如你將http_port 改變為squid 不能打開的埠,它會發生致命錯誤並退出。

在squid 運行時,某些指令和和選項不能改變,包括:
+ 刪除cache 目錄(cache_dir 指令)
+ 改變store_log 指令
+ 改變coss cache_dir 的塊大小數值。事實上,無論何時你改變了該值,你必須重新初始化coss cache_dir。
+ coredump_dir 指令在重配置過程中不被檢查。所以,在squid 已經啟動了后,你不能讓squid 改變它的當前目錄。

solaris 用戶在重配置squid 過程中可能遇到其他問題。solaris 的stdio 執行組件里的fopen()調用要求使用小於256 的未用文件描述符。FILE 結構以8 位值存儲該文件描述符。正常情況下這不構成問題,因為squid 使用底層I/O(例如open())來打開cache 文件。然而,在重配置過程中的某些任務使用fopen(),這就有可能失敗,因為前面的256 個文件描述符已被分配出去。


5.10 滾動日誌文件

除非你在squid.conf 里禁止,squid 會寫大量的日誌文件。你必須周期性的滾動日誌文件,以阻止它們變得太大。squid 將大量的重要信息寫入日誌,假如寫不進去了,squid 會發生錯誤並退出。為了合理控制磁碟空間消耗,在cron 里使用如下命令:
%squid -k rotate

例如,如下任務介面在每天的早上4 點滾動日誌:
0 4 * * * /usr/local/squid/sbin/squid -k rotate

該命令做兩件事。首先,它關閉當前打開的日誌文件。然後,通過在文件名后加數字擴展名,它重命名cache.log,store.log,和access.log。例如,cache.log 變成cache.log.0,cache.log.0變成cache.log.1,如此繼續,滾動到logfile_rotate 選項指定的值。

squid 僅僅保存每個日誌文件的最後logfile_rotate 版本。更老的版本在重命名過程中被刪除。假如你想保存更多的拷貝,你需要增加logfile_rotate 限制,或者編寫腳本用於將日誌文件移動到其他位置。

請見13.7 章關於滾動日誌的其他信息。
《解決方案》

回復 1樓 段譽 的帖子

樓主辛苦,支持開源
《解決方案》

好東西,多謝了啊!:P:):(
《解決方案》

繼續支持
《解決方案》

在網上找了許久,沒想到,好文章就在眼前。
《解決方案》

:wink::D:D:em48::)文章中的這些表情一直讓人蛋疼。。。。。。。。。。
《解決方案》

不是我故意翻老帖啊,下來看看




[火星人 ] [好文共享]《Squid 中文權威指南》第5章 譯者:彭勇華已經有411次圍觀

http://coctec.com/docs/service/show-post-11845.html