Squid中文權威指南 第五章(運行Squid)

第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[294]: 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[294]: Squid Parent: child process 296 exited due to signal 6
Jul 31 15:02:56 zapp squid[294]: Squid Parent: child process 359 started

在某些情形下,squid子進程可能立即終止。爲了防止頻繁的啓動子進程,假如子進程連續5次沒有運行至少10秒鐘,父進程會放棄。

Jul 31 15:13:48 zapp squid[455]: Squid Parent: child process 474 exited with status 1
Jul 31 15:13:48 zapp squid[455]: 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章關於滾動日誌的其他信息。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章