• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • [好文共享]《Squid 中文權威指南》第5章 譯者:彭勇華

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    [b:1cdde4e1d5][color=blue:1cdde4e1d5]譯者序: 本人在工作中維護著數臺Squid 服務器 ,多次參閱DuaneWessels(他也是Squid的創始人)的這本書,原書名是"Squid:TheDefinitiveGuide",由O'Reilly出版。我在業余時間把它翻譯成中文,希望對中文Squid用戶有所

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

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

    第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_aclearcase/" target="_blank" >ccel_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

    為了使用該腳本,先找到腳本存放的目錄。給它一個有意義的名字,類似于其他的系統啟動腳本??梢允荢98squid 或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 章關于滾動日志的其他信息。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>