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

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

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

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

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

第4章 快速配置嚮導

4.1 squid.conf 語法

Squid 的配置文件相對規範。它與其他許多unix 程序相似。每行以配置指令開始,後面跟著數字值或關鍵字。在讀取配置文件時,squid 忽略空行和註釋掉的行(以#開始)。如下是一些配置行示例:
cache_log /squid/var/cache.log
# define the localhost ACL
acl Localhost src 127.0.0.1/32
connect_timeout 2 minutes
log_fqdn on

某些指令取唯一值。在這些情形下,重複賦予該指令不同的值,將覆蓋前面的值。例如,
下面是一個連接超時值。第一行無效,因為第二行覆蓋了它:
connect_timeout 2 minutes
connect_timeout 1 hour

另外,某些指令取列表值。在這些情形下,每一個新增的值都有效。"擴展方式"指令以這種方法工作:
extension_methods UNGET
extension_methods UNPUT
extension_methods UNPOST

對這些基於列表的指令,你通常能在同一行中賦予多個值:
extension_methods UNGET UNPUT UNPOST

許多指令有通用類型。例如,連接超時值是一個時間規範,在數字後面跟著時間單元。例如:
connect_timeout 3 hours
client_lifetime 4 days
negative_ttl 27 minutes

類似的,大量的指令指向文件大小或者內存額度。例如,你可以這樣編寫大小規範:十進位數字後面跟bytes,KB,MB 或GB.例如:
minimum_object_size 12 bytes
request_header_max_size 10 KB
maximum_object_size 187 MB

另一種值得提起的類型是觸發器,它的值是on 或者off。許多指令使用該類型。例如:
server_persistent_connections on
strip_query_terms off
prefer_direct on

通常,配置文件指令能以任何順序出現。然而,如果某個指令指向的值被其他指令所定義,那麼順序就很重要。訪問控制列表是個好的例子。acl 被用在http_access 規則之前必須被定義:
acl Foo src 1.2.3.4
http_access deny Foo

squid.conf 文件里的許多東西是大小寫敏感的,例如指令名。你不能將http_port 寫成HTTP_port。

默認的squid.conf 文件包含了對每個指令的大量註釋,以及指令的默認值。例如:
# TAG: persistent_request_timeout
# How long to wait for the next HTTP request on a persistent
# connection after the previous request completes.
#
#Default:
# persistent_request_timeout 1 minute

每次安裝squid 后,當前默認配置文件存放在$prefix/etc 目錄下的squid.conf.default。既然指令每次都有所改變,你能參考該文檔,以獲取最近的更新。

該章剩下的部分是關於在開始運行squid 之前,你必須知道的少數指令。


4.2 User IDs

你可能知道,unix 進程和文件擁有文件和組屬主的屬性。你必須選擇某個用戶和組給squid。該用戶和組的組合,必須對大部分squid 相關的文件和目錄有讀和寫的許可權。

我高度推薦創建名為"squid"的用戶和組。這避免了某人利用squid 來讀取系統中的其他文件。假如不止一個人擁有對squid 的管理許可權,你可以將他們加到squid 組裡。

unix 進程繼承了它們父進程的屬主屬性。那就是說,假如你以joe 用戶來啟動squid,squid 也以joe 來運行。假如你不想以joe 來運行squid,你需要預先改變你的用戶ID。這是su 命令的典型功能。例如:
joe% su - squid
squid% /usr/local/squid/sbin/squid

不幸的是,運行squid 並非總是如此簡單。在某些情況下,你必須以root 來啟動squid,這依賴於你的配置。例如,僅僅root 能綁定TCP 套接字到特權埠上,如80。假如你必須以root 來啟動squid,你必須設置cache_effective_user 指令。它告訴squid,在執行完需要特別許可權的任務后,變成哪個用戶。例如:
cache_effective_user squid

你提供的該名字必須是有效用戶(在/etc/passwd 文件里)。請注意僅僅當你以root 來啟動squid 時,你才需要用到該指令。僅僅root 有能力來隨意改變用戶身份。假如你以joe 來啟動squid,它不能改變到squid 用戶。

你可能嘗試不設置cache_effective_user,直接以root 來運行squid。假如你試過,你會發現squid 拒絕運行。這違背了安全規則。假如外部攻擊者有能力危及或利用squid,他能獲取對系統的全部訪問權。儘管我們努力使squid 安全和少bug,但還是穩重點好。

假如你沒有設置cache_effective_user,以root 來啟動squid,squid 使用nobody 作為默認值。不管你選擇什麼用戶ID , 請確認它有對下面目錄的讀訪問權:$prefix/etc,$prefix/libexec,$prefix/share。該用戶ID 也必須有對日誌文件和緩存目錄的寫訪問
權。

squid 也有一個cache_effective_group 指令,但你也許不必設置它。默認的,squid 使用cache_effective_user 的默認組(從/etc/passwd 文件讀取)。


4.3 埠號

http_port 指令告訴squid 在哪個埠偵聽HTTP 請求。默認埠是3128:
http_port 3128

假如你將squid 作為加速器運行(見15 章),你也許該將它設為80。

你能使用附加的http_port 行,來指示squid 偵聽在多個埠上。假如你必須支持客戶組(它們被配置得不一致),這點就經常有用。例如,來自某個部門的瀏覽器發送請求到3128,
然而另一個部門使用80 埠。簡單的將兩個埠號列舉出來:
http_port 3128
http_port 8080

你也能使用http_port 指令來使squid 偵聽在指定的介面地址上。當squid 作為防火牆運行時,它有兩個網路介面:一個內部的和一個外部的。你可能不想接受來自外部的http 請求。為了使squid 僅僅偵聽在內部介面上,簡單的將IP 地址放在埠號前面:
http_port 192.168.1.1:3128


4.4 日誌文件路徑

我將在第13 章討論所有squid 的日誌細節。你現在你關注的唯一事情是,squid 將它的日誌放在何處。默認的日誌目錄是squid 安裝位置下的logs 目錄。例如,假如你在./configure
時沒有使用--prefix=選項,那麼默認的日誌文件路徑是/usr/local/squid/var/logs。

你必須確認日誌文件所存放的磁碟位置空間足夠。在squid 寫日誌時如果接受到錯誤,它會退出和重啟。該行為的主要理由應引起你的注意。squid 想確認你不會丟失任何重要的日誌信息,特別是你的系統被濫用或者被攻擊時。

squid 有三個主要的日誌文件:cache.log,access.log,store.log.第一個文件即cache.log,包含狀態性的和調試性的消息。當你剛開始運行squid 時,你應密切的關注該文件。假如squid拒絕運行,理由也許會出現在cache.log 文件的結尾處。在正常條件下,該文件不會變得很大。也請注意,假如你以-s 選項來運行squid,重要的cache.log 消息也可被送到你的syslog進程。通過使用cache_log 指令,你可以改變該日誌文件的路徑:
cache_log /squid/logs/cache.log

access.log 文件包含了對squid 發起的每個客戶請求的單一行。每行平均約150 個位元組。也就是說,在接受一百萬條客戶請求后,它的體積約是150M。請使用cache_access_log 指令來改變該日誌文件的路徑:
cache_access_log /squid/logs/access.log

假如因為某些理由,你不想squid 記錄客戶端請求日誌,你能指定日誌文件的路徑為/dev/null.

store.log 文件對大多數cache 管理員來說並非很有用。它包含了進入和離開緩存的每個目標的記錄。平均記錄大小典型的是175-200 位元組。然而,squid 不在store.log 里對cache點擊創建介面,所以它比access.log 包含少得多的記錄。請使用cache_store_log 指令來改變它的位置:
cache_store_log /squid/logs/store.log

通過指定路徑為none,你能輕易的完全禁止store.log 日誌:
cache_store_log none

假如你不小心,squid 的日誌文件增加沒有限制。某些操作系統對單個文件強制執行2G的大小限制,即使你有充足的磁碟空間。超過該限制會導致寫錯誤,這樣squid 就會退出。為了保證日誌文件大小合理,你應創建任務來有規律的重命名和打包日誌。squid 有內建功能來使這個容易做到。請見13.7 章關於日誌輪循的解釋。


4.5 訪問控制

在第6 章里有更多的關於訪問控制的描述。現在,我只講述少量的訪問控制方法,以使熱心的讀者能快速開始使用squid。

squid 默認的配置文件拒絕每一個客戶請求。在任何人能使用代理之前,你必須在squid.conf 文件里加入附加的訪問控制規則。最簡單的方法就是定義一個針對客戶IP 地址的ACL 和一個訪問規則,告訴squid 允許來自這些地址的HTTP 請求。squid 有許多不同的ACL類型。src 類型匹配客戶IP 地址,squid 會針對客戶HTTP 請求檢查http_access 規則。這樣,你需要增加兩行:
acl MyNetwork src 192.168.0.0/16
http_access allow MyNetwork

請將這些行放在正確的位置。http_access 的順序非常重要,但是acl 行的順序你不必介意。你也該注意默認的配置文件包含了一些重要的訪問控制,你不應該改變或刪除它們,除非你完全理解它們的意義。在你第一次編輯squid.conf 文件時,請看如下註釋:
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

在該註釋之後,以及"http_access deny all"之前插入你自己的新規則。

為了徹底說明,如下是一個合理的初始訪問控制配置,包括推薦的默認控制和早先的例子:
acl All src 0/0
acl Manager proto cache_object
acl Localhost src 127.0.0.1/32
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
acl SSL_ports 443 563
acl CONNECT method CONNECT
acl MyNetwork src 192.168.0.0/16
http_access allow Manager Localhost
http_access deny Manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow MyNetwork
http_access deny All


4.6 可見主機名

希望你不必擔心visible_hostname 指令。然而,假如squid 不能發現它所運行的機器的主機名,你就必須設置它。如果發生這樣的事,squid 抱怨和拒絕運行:
% squid -Nd1
FATAL: Could not determine fully qualified hostname. Please set 'visible_hostname'

有大量的理由使squid 需要知道主機名:
+ 主機名出現在squid 的錯誤消息里,這幫助用戶驗證潛在問題的源頭。
+ 主機名出現在squid 轉發的cache 單元的HTTP Via 頭裡。當請求到達原始主機時,Via頭包含了在傳輸過程中涉及的代理列表。squid 也使用Via 頭來檢測轉發環路。我將在第10章里討論轉發環路。

squid 對特定事務使用內部URL,例如FTP 目錄列表的圖標。當squid 對FTP 目錄產生HTML 頁面時,它插入小圖標用以指明該目錄中的文件類型。圖標URL 包含了cache 的主機名,以便web 瀏覽器能直接從squid 請求它們。

每個從squid 響應的HTTP 回復包含了X-Cache 頭。這並非官方HTTP 頭。它是一個擴展頭,用以指明該響應是cache 點擊還是cache 丟失。既然請求和響應可能經過多個cache,每個X-Cache 頭包含了cache 報告點擊或丟失的名字。如下是一個通過2 個cache 的響應示例:
HTTP/1.0 200 OK
Date: Mon, 29 Sep 2003 22:57:23 GMT
Content-type: text/html
Content-length: 733
X-Cache: HIT from bo2.us.ircache.net
X-Cache: MISS from bo1.us.ircache.net

squid 在啟動時試圖自動獲取主機名。首先它調用gethostname()函數,這通常能返回正確的主機名。接著,squid 調用gethostbyname()函數嘗試對主機名進行DNS 查詢。該函數典型的返回IP 地址和系統的規範名。假如gethostbyname()成功,squid 在錯誤消息里,Via 頭裡等地方使用這個規範名。

因為大量的理由,squid 可能不能檢測到它的規範主機名,包括:
+ 主機名可能未設置。
+ 主機名可能從DNS 區域或/etc/hosts 文件里丟失。

squid 系統的DNS 客戶端配置可能不正確或丟失。在unix 系統上,你該檢查/etc/resolv.conf 和/etc/host.conf 文件。

假如你看到上述的致命錯誤,你必須修正主機名和DNS 信息,或者顯式的給squid 指明主機名。在大多數情況下,請確認"hostname"命令返回一個完全規範的主機名,並且在/etc/hosts 文件里增加這個介面。假如這樣不成功,請在squid.conf 里設置可見主機名:
visible_hostname squid.packet-pushers.net


4.7 管理聯繫信息

你應該設置cache_mgr 指令作為對用戶的幫助。它是一個email 地址,假如問題發生,用戶能寫信給它。cache_mgr 地址默認出現在squid 的錯誤消息里。例如:
cache_mgr squid@web-cache.net


4.8 下一步

在創建了初步的配置文件后,你多少準備首次運行squid 了。請遵循下面章節的建議。

當你掌握了啟動和停止squid 后,你該花費一些時間來改善配置文件。你可能想增加更高級的訪問控制,這在第6 章里有描述。既然我在這裡沒有討論磁碟cache,你該花些時間閱讀第7 和第8 章。
《解決方案》

Can you help me? what ist this problem?Thank you !

啟動squid失敗 :

2005/12/09 12:53:41| unrecognised basic auth scheme parameter 'casesensitive'
2005/12/09 12:53:41| squid.conf line 1892: http_access allow
2005/12/09 12:53:41| aclParseAccessLine: Access line contains no ACL's, skipping
2005/12/09 12:53:41| parseConfigFile: line 2145 unrecognized: 'xiaoyong'
FATAL: Could not determine fully qualified hostname.  Please set 'visible_hostname'

Squid Cache (Version 2.5.STABLE3): Terminated abnormally.
CPU Usage: 0.020 seconds = 0.010 user + 0.010 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 414
《解決方案》

好文章,多多學習了!
《解決方案》

我把他整理成電子書倆
《解決方案》

確實是好東西
《解決方案》

set visible_hostname myhost

FATAL: Could not determine fully qualified hostname.  Please set 'visible_hostname'

# vi /etc/squid/squid.conf

/visible_hostname

visible_hostname myhost



#/etc/init.d/squid start
啟動 squid:   

OK THANKS !!!!

[ 本帖最後由 lcs100 於 2007-8-18 16:07 編輯 ]
《解決方案》

squid問題!弄我好幾天了,所以上來請教兄弟門

朋友們,我在配置SQUID的時候遇到一些問題,請指點一二。我的配置文件如下:
#vi /etc/squid/squid.conf
http_port 172.16.126.4:3128
cache_mem 256 MB
cache_dir ufs /var/spool/squid 4096 16 256
cache_effective_user squid
cache_effective_group squid
dns_nameservers 172.16.2.1
cache_access_log /var/log/squid/access.log
cache_store_log /var/log/squid/store.log
visible_hostname 172.16.126.4
cache_mgr wluck@sohu.com
acl all src 0.0.0.0/0.0.0.0
http_access allow all

#NCSA Authentication
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic credentialsttl 2 hours
auth_param basic realm input ncsa auth infor
acl auth_user proxy_auth REQUIRED
http_access allow auth_user proxy_auth

#vi /etc/squid/passwd
pcboy:/qCJl22VPARX2


#service squid reload
2009/03/05 10:15:27| WARNING: '0.0.0.0/0.0.0.0' is a subnetwork of '0.0.0.0/0.0.0.0'
2009/03/05 10:15:27| WARNING: because of this '0.0.0.0/0.0.0.0' is ignored to keep splay tree searching predictable
2009/03/05 10:15:27| WARNING: You should probably remove '0.0.0.0/0.0.0.0' from the ACL named 'all'
2009/03/05 10:15:27| aclParseAccessLine: ACL name 'proxy_auth' not found.
FATAL: Bungled squid.conf line 20: http_access allow auth_user proxy_auth
Squid Cache (Version 3.0.STABLE2): Terminated abnormally.
CPU Usage: 0.007 seconds = 0.005 user + 0.002 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 0

在windows機器里嘗試使用**伺服器,但連接不了,找不到伺服器。 請問如何解決?
《解決方案》

已經安裝上了,但有許多問題不明白,想進一步學習,我想,這篇宏著應當就是我最需要的。




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

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