什麼是Squid ?
Squid 扮演著一種中介的角色,可用來節省使用者在連結網頁時所使用的頻寬,加快內部網路訪問的速度,並且也能提供監控記錄方便查詢。
Squid代理伺服器是網路上常見的服務之一優點如下:
1. 可以儲存暫存,減少伺服器的負載,同時也可提升Client訪問網頁的速度。
2. 可以解決現階段IPv4不足的問題,減少外網IP使用量。
3. 可對Web訪問時對內容進行過濾,設定一些網頁訪問的規則。也正因為介於伺服器和Client之間,在某些程度上可提高伺服器的安全性。
在 Squid 代理上可分為 正向代理、反向代理、通透式代理(透明代理)。以下就來介紹反向代理(Reverse Proxy)
反向代理 (Reverse Proxy)
至於反向代理剛好和正向代理相反。客戶端是不需要做任何設定,當客戶端向Reverse Proxy 發出請求時。Reverse Proxy會主動判斷導向到那一個Web Server,以減少網站同一時間的流量過大,可以做到負載平衡。只要是高流量、客戶端數量大的網站,一般都會架設這種 Reverse Proxy 來減少 Web Server 的負載
系統環境
Centos 5.8 64位元
squid-2.6.STABLE21-6.el5
一台Squid Server
外網 : 220.133.192.160
兩台Web Server
內網 : Web1 192.168.1.7
Web2 192.168.1.37
反向代理 (Reverse Proxy)
Server端
1. 設定DNS record
不論DNS是自管或是代管的,都請先在DNS設定上將domain指向到Squid server的記錄
2. 安裝Squid
2.1 先檢查是否已經有安裝Squid
1 2 |
[root@localhost ~]# rpm -qa |grep squid squid-2.6.STABLE21-6.el5 |
2.2 如果沒安裝的話請自行安裝
1 |
[root@localhost ~]# yum -y install squid |
3. squid.conf配置
可參考FAQ設定範例squid.conf
重要設定
3.1設置squid主機名稱
會需要設定visible_hostname 主要是因為,若DNS解析有問題時,會找不到主機名而出錯,因此加上此設定可避免此問題,也可減少無法啟動squid的問題。
visible_hostname squid.faq-test.tk squid.faq-test.tk 可修改為該台主機名稱或是內網IP
1 2 3 |
[root@localhost ~]# vim /etc/squid/squid.conf #請添加在最後一行 visible_hostname squid.far-test.tk |
3.2 修改埠號並設定加速模式
設定squid為accel加速模式,vhost必須要加.否則將無法將指向轉發至後端服務器,訪問時就會出現無法找到的錯誤
icp_port 0 為設定監聽埠號
1 2 3 |
[root@localhost ~]# vim /etc/squid/squid.conf http_port 80 accel vhost vport icp_port 0 |
3.3 反向代理加速配置 虛擬服務器 (重要)
cache_peer 192.168.1.7 parent 80 0 no-query originserver round-robin weight=1 name=web1
cache_peer 192.168.1.37 parent 80 0 no-query originserver round-robin weight=1 name=web2
上述兩行的意思是分別把192.168.1.7指向到web1、192.168.1.37指向到web2。
中述兩行則是把www.faq-test.tk分別指向到web1和web2,也因上述兩行參數中有設定name=web1和name=web2。因此當指回到web1和web2時,就會對應到正確的IP
cache_peer_domain web1 www.faq-test.tk
cache_peer_domain web2 www.faq-test.tk
下述兩行則是允許web1和web2使用
cache_peer_access web1 allow all
cache_peer_access web2 allow all
1 2 3 4 5 6 7 8 9 |
[root@localhost ~]# vim /etc/squid/squid.conf cache_peer 192.168.1.7 parent 80 0 no-query originserver round-robin weight=1 name=web1 cache_peer 192.168.1.37 parent 80 0 no-query originserver round-robin weight=1 name=web2 cache_peer_domain web1 www.faq-test.tk cache_peer_domain web2 www.faq-test.tk cache_peer_access web1 allow all cache_peer_access web2 allow all |
常用參數說明如下 詳細說明請看這邊options參數說明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
cache_peer 格式說明 cache_peer hostname type proxy port icp port options cache_peer 192.168.1.7 parent 80 0 no-query originserver round-robin weight=1 name=web1 hostname : 指被請求的同級子代理伺服器或父代理伺服器。可以用主機名或 ip 地址表示 type : 指代理伺服器的類型,是同級子代理伺服器還是父代理伺服器 parent (父)、 sibling (子) proxy port : 代理伺服器的監聽端口 icp port : 代理伺服器上的 ICP 監聽端口,(關閉時用0) options : 可以包含一個或多個關鍵字 options 參數說明 no-query : 不跟 peer 發送 ICP 請求,若 peer 不可用時,可使用此選項(禁止 ICP 協定) originserver : 一個 Web 服務器,為原始服務器,意味著要使用加速器設置 round-robin : 通過輪詢方式將請求分發到其中一台父節點, squid 同時會對這些父節點的健康狀態進行檢查,如果父節點 down 了,那麼 squid 會從剩餘的 origin 服務器中抓取數據, round-robin 表示使用通過 RR 輪詢方式轉發到兩個父節點中的一個 weight=n : 當如果有多個 peer 同時請求時 squid 會計算每個 peer 的 ICP 響應時間來決定 weight 的值。然後 squid 會向擁有最大 weight 的 peer 發出 ICP 請求。也就是說 weight 越大優先權越高。也可直接設定其 weigth 數值 name=xxx : 設定 peer 的名稱。可用來區分不同的 peer proxy-only : 從 peer 得到的資料不在本機端進行暫存,預設是會暫存這些資料的。 Default : 當只有一個父代理伺服器並不支持 ICP 協議時,可使用 default 和 no-query 讓所有請求都發送到該父代理伺服器 login=PASS : 是為了告知 squid 此源網站需要用戶名/密碼驗證,用於解決 SP 等網站的登錄認證 ssl : 為指定協議,後跟的 sslflags=DONT_VERIFY_PEER 為不進行源端 SSL 證書驗證,可以解決上級網站採用自簽證書造成的中斷,以及減少響應時間 front-end-https=on : 是為微軟 OWA 使用 SSL 反代理而量身訂做的參數 max-conn=n : 反向代理伺服器到 WEB 服務器的最大連接數 connect-timeout=n : 超時設置 |
3.4 修改使用權限
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost ~]# vim /etc/squid/squid.conf #修改前 http_access allow localhost http_access deny all # http_reply_access allow all #修改後 http_access allow localhost #http_access deny all http_access allow all http_reply_access allow all |
一般設定
3.5 修改快取目錄的相關設定 (cache_dir)
雖然在反向代理用不太到,不過還是設定一下好了
此目錄主要是用來存放快取資料的位置和相關設定,磁碟快取是影響proxy效能的一個相當重要的參數。
cache_dir ufs /var/spool/squid 100 16 256
100 表示為磁碟使用量為100MB (可自行修改)
16 表示在第一層共有16個次目錄
256 表示在每層次目錄內再分為256個次目錄
比較常見的快取目錄且效能較佳的為16 256或64 64。因為在這兩層次目錄的部份是可不用去做修改。只需修改磁碟使用量。
1 2 3 4 5 6 |
[root@localhost ~]# vim /etc/squid/squid.conf # 修改前 # cache_dir ufs /var/spool/squid 100 16 256 # 修改後 cache_dir ufs /var/spool/squid 10240 16 256 |
3.6記憶體
3.6.1 squid 使用的記憶體計算方式
給proxy 額外使用的記憶體,主要用來處裡較為熱門的快取資料。預設1GB的磁碟快取會佔用約10M的記憶體,而Squid本身會佔用約15MB。在上述1.3 時,設定磁碟大小為10GB,整體Squid會使用到的記憶大小試算方式如下:
10 * 10 + 15 + “cache_mem 設定值 (8)”= 123MB
在Squid的官網上建議實體記憶體的大小最好是上面試算出來的兩倍以上,如此一來效能才會比較好一些。
3.6.2設置快取記憶體
如果實體記憶體比較大時,可透過修改快取記憶體來提升squid的效能
cache_mem預設是8MB,可依各人需求修改
1 2 3 4 5 6 |
[root@localhost ~]# vim /etc/squid/squid.conf #修改前 # cache_mem 8 MB #修改後 cache_mem 512 MB |
3.7 設定LOG存放位置
基本上LOG預設都是存放在/var/log/squid裡。如果有需要修改的也可以自行修改存放路徑。
cache_access_log曾經使用過 squid 的用戶記錄
cache_log 暫存LOG
cache_store_log 儲存使用狀態的LOG
1 2 3 4 |
[root@localhost ~]# vim /etc/squid/squid.conf cache_access_log /var/log/squid/access.log cache_log /var/log/squid/cache.log cache_store_log /var/log/squid/store.log |
3.8 設定控制磁碟容量上限
cache_swap_high 95 當磁碟使用超過95%時,開始刪除舊有的快取
cache_swap_low 90 當刪除到90%時,停止刪除。
也就是說,假設我的磁碟空間有10GB,然後當使用到10G*0.95=9.5G時,就會開始從磁碟空間中最舊的資料開始刪除。然後當刪除到剩下10G*0.9=9G時,就會停止刪除了。基本上這樣的設定就足夠使用了,所以也不用特意的去修改數值。
1 2 3 4 5 6 7 8 |
[root@localhost ~]# vim /etc/squid/squid.conf #修改前 # cache_swap_low 90 # cache_swap_high 95 #修改後 cache_swap_low 90 cache_swap_high 95 |
3.9設定使用者與使用者群組
1 2 3 4 5 6 7 8 |
[root@localhost ~]# vim /etc/squid/squid.conf #修改前 #cache_effective_user squid #cache_effective_group squid #修改後 cache_effective_user squid cache_effective_group squid |
若是有設定此項的話,請記得新增使用者和組群。
1 2 |
[root@localhost ~]# useradd -g squid -s /sbin/nologin squid [root@localhost ~]# groupadd squid |
也要查看一下LOG是否也為該使用者,若有問題的話請記得修改權限
1 2 3 4 5 |
[root@localhost ~]# ls -ahl /var/log/squid/ -rw-r----- 1 squid squid 7.9K Nov 23 08:03 access.log -rw-r----- 1 squid squid 32K Nov 25 22:57 cache.log -rw-r--r-- 1 squid squid 47 Nov 23 07:57 squid.out -rw-r----- 1 squid squid 4.7K Nov 25 22:05 store.log |
4. 防火牆設定
4.1 添加防火牆規則
由於反向代理已經把port改為80port,所以需要在防火牆的部份添加開通80port的規則。不論是squid server或是web1和web2都需要添加此規則
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[root@localhost ~]# vim /etc/sysconfig/iptables # Firewall configuration written by system-config-securitylevel # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT |
5.啟動設定
5.1 Squid 運行參數說明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
啟動 [root@localhost ~]# /etc/init.d/squid start #啟動 [root@localhost ~]# squid -D #背景執行 [root@localhost ~]# squid -NCd1 #前台正式運行,用于debug很好用 停止 [root@localhost ~]# /etc/init.d/squid stop #停止 [root@localhost ~]# squid -k shutdown #停止squid 開機啟動 [root@localhost ~]# chkconfig squid on #開機啟動 不停 squid 更新squid.conf [root@localhost ~]# /etc/init.d/squid reload [root@localhost ~]# squid -k reconfig List 設定好的squid.conf [root@localhost ~]# egrep -v '^#|^$' /etc/squid/squid.conf 其他使用 [root@localhost ~]# squid -z #初始化Squid 建立暫存目錄 [root@localhost ~]# squid -k parse #檢查squid.conf語法配置是否正確,若無顯示表示正常 |
5.2檢查是否正常啟動
Squid 的預設port為80,可查看此port是否正常LISTEN
或是使用ps來查看是否有正常在運作中
1 2 3 4 5 6 7 8 |
[root@localhost ~]# netstat -na | grep -w 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN [root@localhost ~]# ps ax | grep squid 4022 ? Ss 0:00 avahi-daemon: running [squid.local] 7740 ? Ss 0:00 squid -D 7742 ? S 0:00 (squid) -D 7755 pts/0 S+ 0:00 grep squid |
[Note] 由於反向代理是不需要設定Client端的,因此在server端設定完成後就可使用了。
以上是Squid 反向代理的基本設定
接下來介紹一些進階的設定
首先來介紹一下
多個Squid server和web server
以下用 2台Squid server 2台web server 為範例
增加多個Squid server和web server的好處有
1. 當網站流量比較大時,可以做到負載平衡,以避免掛掉
2. 透過DNS server來讓兩台squid server輪詢,當用戶端發出請求時若squid1內有暫存相關資料的話,則會直接提供給使用者。但若是查無相關資料時,則會發送給squid2處理。如此一來可減少squid和web server的負載。也可提高網站整體的安全性和效能。
系統環境:
Centos 5.8 64位元
squid-2.6.STABLE21-6.el5
兩台Squid Server
外網 : 220.133.192.160
220.133.192.161
兩台Web Server
內網 : Web1 192.168.1.7
Web2 192.168.1.37
設定內容大都與反向代理的基本設定差不多
主要有幾點差別
1. DNS 需設定兩台Squid server的DNS record,才可做輪詢
2. 在squid.conf配置上需加上指向到Squid1和Squid2
3. 在 hosts 添加設定
1. 設定DNS record
不論DNS是自管或是代管的,都請先在DNS設定上將domain指向到Squid1和Squid2的記錄,如此一來才可以輪詢。
2. squid.conf配置
在squid.conf配置中,設定大至上都一樣。不太一樣的就如下面要修改和添加的部份了。
2.1 設定相互的Squid
當自身的suqid的暫存中查無資料時,會通過ICP去查詢另一台的squid。
cache_peer 220.133.192.161 sibling 80 0
在220.133.192.161的部份可設定為domain或是ip,但請設定另一台的domain或ip。也就是說如果現在設定的為squid1,則在這個部份就要設定為squid2的domain或ip。
如果有三台、四台或更多台squid server的話請一併設定上。只需不要設定自己的。
1 2 3 |
[root@localhost ~]# vim /etc/squid/squid.conf #請添加此行 cache_peer 220.133.192.161 sibling 80 0 |
2.2 多web server設定方式
如果有兩個或兩個以上的web server要設定的話。請依以下設定新增
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@localhost ~]# vim /etc/squid/squid.conf cache_peer 192.168.1.7 parent 80 0 no-query originserver round-robin weight=1 name=web1 cache_peer 192.168.1.37 parent 80 0 no-query originserver round-robin weight=1 name=web2 cache_peer 192.168.1.x parent 80 0 no-query originserver round-robin weight=1 name=web3 cache_peer 192.168.1.x parent 80 0 no-query originserver round-robin weight=1 name=web4 cache_peer_domain web1 www.faq-test.tk cache_peer_domain web2 www.faq-test.tk cache_peer_domain web3 www.faq-test.tk cache_peer_domain web4 www.faq-test.tk cache_peer_access web1 allow all cache_peer_access web2 allow all cache_peer_access web3 allow all cache_peer_access web4 allow all |
2.3設置squid主機名稱
在這邊要注意的是主機名稱請設定為該squid的名稱或IP,要不然會啟動不了。
Squid1 : squid1.far-test.tk
Squid2 : squid2.far-test.tk
1 2 3 |
[root@localhost ~]# vim /etc/squid/squid.conf #請添加在最後一行 visible_hostname squid1.far-test.tk |
3. hosts 設定
添加以下設定,主要是讓squid比較好找詢到對方。
squid1.faq-test.tk為domain,220.133.192.160為對應的IP
不管有幾台Squid server 請都設定上
1 2 3 4 |
[root@localhost ~]# vim /etc/hosts #請添加以下設定 220.133.192.160 squid1.faq-test.tk 220.133.192.161 squid2.faq-test.tk |
[Note] 以上三點設定完成,大至就沒什麼問題,可以開網頁測試看看摟
謝謝版主精湛的解釋!原來之前都只會把squid當作forward proxy使用而已…
請問版主,squid跟apache/Nginx等都可以做reverse proxy的功能,該如何去評估使用這幾套軟體作為reverse proxy呢?
謝謝您!
這個部份還是透過實測會比較準確一些