歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> linux下利用Squid構建高速的Proxy Server

linux下利用Squid構建高速的Proxy Server

日期:2017/3/6 15:32:55   编辑:關於Unix
一、什麼是ProxyServer(代理 服務器 ),Proxy的作用。 在真實世界中我們常常會去幫人家辦一些事情,例如幫人家交電費什麼的,在這種情況下你不是電表的主人,而是代辦者(代理者)的身份。在 網絡 世界中Proxy就是相當於那個幫人家交電費的人了,當我們發出連 一、什麼是Proxy Server(代理服務器),Proxy的作用。

在真實世界中我們常常會去幫人家辦一些事情,例如幫人家交電費什麼的,在這種情況下你不是電表的主人,而是代辦者(代理者)的身份。在網絡世界中Proxy就是相當於那個幫人家交電費的人了,當我們發出連接請求的時候,就會通過Proxy去幫我們直接與目標服務器溝通,幫我們取得資料。

通常我們所說的高速緩存代理,就是以空間換時間,就如下圖那樣。





client通過Proxy Server上網的步驟如下:

①client端向Server發出請求。
②Server收到請求後比較判斷Cache中時候存在client想要的資料,如果沒有則向遠程Server發送數據請求。
③將請求回來的資料先存放到Cache中,再將資料傳送給client端。
④當client發出的請求中所需要的資料在Cache中有,則將Cache中的資料直接傳送給client端。

雖然當第一訪問這向Proxy請求的數據Cache中沒有時,Proxy抓取數據後會先保存在Cache中,這樣訪問速度變慢了,可是第二個訪問者以及後來的訪問者需要該資料的時候,proxy都不要想遠程服務器請求,直接將cache中的資料發送給後來的請求者就行了,這樣就減少了連接遠程服務器的流量,另外由於proxy是在本地的,所以傳輸速度也更快。


二、使用Squid在構建Proxy Server

本文中筆者所使用的環境是:
操作系統: Redhat 9.0,內核:2.4.20-31.9,其他系統套件已經通過apt更新到最新了


1.編譯安裝Squid

由於Squid對系統硬件要求比較高,所以我們安裝的時候應盡量優化。


CODE:#groupadd squid
#useradd squid
添加suqid用戶和用戶組


CODE:#export CFLAGES=’-O2 -mcpu=pentium4 -march=pentium4 -mmmx -msse -msse2’
可以根據你的CPU選擇相應的參數
GCC-3.1以上可針對CPU最佳化:


CODE:Pentium2: -O2 -mcpu=i686 -march=i686 -mmmx
Pentium3: -O2 -mcpu=pentium3 -march=pentium3 -mmmx -msse
Pentium4: -O2 -mcpu=pentium4 -march=pentium4 -mmmx -msse -msse2

#./configure --prefix=/usr/local/squid --enable-gnuregex --enable-async-io=80 --enable-icmp --enable-kill-parent-hack --enable-snmp --disable-ident-lookups --enable-cahce-digests --enable-arp-acl --enable-err-language="Simplify_Chinese" --enable-default-err-languages="Simplify_Chinese" --enable-poll --enable-linux-netfilter --enable-underscore

#make
#make install
我個人安裝軟件都比較喜歡用源碼包自己編譯,覺得這樣知道你自己在做什麼,用rpm包好像不知道做什麼的就安裝好了。下面我們對各個編譯參數進行解釋,當然你可以通過./configure --help來查看其他的參數,以及各個參數的英文解釋。

--prefix=/usr/local/squid :指定軟件的安裝路徑
--enable-gnuregex :由於Squid大量使用字符串處理做各種判斷,加入此項能更好的處理。
--enable-async-io=80 :這個主要是設置async模式來運行squid,我的理解是設置用線程來運行squid,如果服務器配置很不錯,有1G以上內存,cpu使用SMP的方式的話可以考慮設成160或者更高。如果服務器比較糟糕就根據實際情況設了。另外此項還另cache文件支持aufs
--enable-icmp :加入icmp支持
--enable-kill-parent-hack :關掉suqid的時候,要不要連同父進程一起關掉,這個當然要啦
--enable-snmp :此選項可以讓MRTG使用SNMP協議對服務器的流量狀態進行監測,因此必須選擇此項,使Squid支持SNMP接口。
--disable-ident-lookups :防止系統使用RFC931規定的身份識別方法。
--enable-cahce-digests :加快請求時,檢索緩存內容的速度。
--enable-arp-acl :可以在規則設置中直接通過客戶端的MAC地址進行管理,防止客戶使用IP欺騙。
--enable-err-language="Simplify_Chinese" 和
--enable-default-err-languages="Simplify_Chinese" :指定出錯是顯示的錯誤頁面為簡體中文
--enable-poll :應啟用Poll()函數而不是select()函數,通常而言poll(輪詢)比select要好,但configure(腳本程序)已知Poll在某些平台下失效, 若你認為你比configure編譯配置腳本程序要聰明的話,可以用這個選項啟用Poll。總之就是用這個可以提升性能就是啦。
--enable-linux-netfilter :可以支持透明代理
--enable-underscore :允許解析的URL中出現下劃先,因為默認squid會認為帶下劃線的URL地址是非法的,並拒絕訪問該地址。

這裡我們就安裝好了,接下來就是修改配置文件了。




2.修改定義配置參數
下面是我的squid.conf文件


CODE:# NETWORK OPTIONS(有關的網絡選項)
# -----------------------------------------------------------------------------

http_port 3128 #代理端口

icp_port 3130 #icp端口


# OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM(作用於鄰居選擇算法的有關選項)
#-----------------------------------------------------------------------------

#禁止緩存
hierarchy_stoplist cgi-bin ?
hierarchy_stoplist -i ^https:\\ ?
acl QUERY urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi
acl denyssl urlpath_regex -i ^https:\\
no_cache deny QUERY
no_cache deny denyssl
#上面幾個就是說遇到URL中有包含cgi-bin和以https:\\開頭的都不要緩存,
#還有asp、cgi、php等動態腳本也不要緩存,
#因為這些腳本通常都是動態更新的,這樣數據不同步。
#還有https://開通的不緩存是因為一般我們進行電子商務交易,
#例如銀行付款等都是采用這個的,如果把信用卡號什麼緩存那不是很危險。

本新聞共4頁,當前在第1頁 1 2 3 4


# OPTIONS WHICH AFFECT THE CACHE SIZE(定義cache大小的選項)
# -----------------------------------------------------------------------------

cache_mem 8 MB #額外使用內存量,可根據你的系統內存在設定,一般為實際內存的1/3

cache_swap_low 90 #最低緩存百分比
cache_swap_high 95 ##最高緩存百分比,就是上面那個額外內存的使用百分比

maximum_object_size 4096 KB #單個文件最大緩存大小,超過這個大小將不緩存

maximum_object_size_in_memory 8 KB #在內存中單個文件最大緩存大小,超過這個大小將不緩存到內存中

#有DNS正反解所得到的IP存在緩存區的大小,這樣可以加快解析速度
ipcache_size 1024
ipcache_low 90
ipcache_high 95
fqdncache_size 1024


# LOGFILE PATHNAMES AND CACHE DIRECTORIES(定義日志文件的路徑及cache的目錄)
# -----------------------------------------------------------------------------

#  <cache_dir>; <aufs|ufs>; <目錄所在>; <MBytes大小>; <dir1>; <dir2>;
#  那個 aufs 只有在編譯的時候加入 --enable-async-io 那個選項才有支持,
#  至於目錄所在地與所占用的磁盤大小則請視您的主機情況而定,
#  而後面 dir1, dir2 則是兩個次目錄的大小,通常 16 256 或 64 64 皆可,
#  一般來說,數字最好是 16 的倍數,據說性能會比較好啦!

cache_dir aufs /Cache1 100 16 256
cache_dir aufs /Cache2 100 16 256

#日志存放位置
cache_access_log /usr/local/squid/var/logs/access.log
cache_log /usr/local/squid/var/logs/cache.log

# TAG: cache_store_log
cache_store_log /usr/local/squid/var/logs/store.log

# TAG: pid_filename
pid_filename /usr/local/squid/var/logs/squid.pid




# OPTIONS FOR EXTERNAL SUPPORT PROGRAMS(外部支持程序選項)
# -----------------------------------------------------------------------------

#用代理登陸匿名ftp服務選項
# TAG: ftp_user
ftp_user Squid@ #用戶名
ftp_passive on #被動模式


#認證
#auth_param basic children 5
#auth_param basic realm Squid proxy-caching web server
#auth_param basic credentialsttl 2 hours
#auth_param basic casesensitive off



# OPTIONS FOR TUNING THE CACHE(調整cache的選項)
# -----------------------------------------------------------------------------


# TAG: refresh_pattern Cache更新時間設置
#<refresh_pattern>; <regex>; <最小時間>; <百分比>; <最大時間>;

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

#上面第一行如果網址開頭是 ftp 的話,那麼在一天(1440分鐘)後,
#如果proxy 再次取用這個檔案時,則 cache 內的數據會被更新!



# TIMEOUTS (超時)
# -----------------------------------------------------------------------------
#連接到其他機器的最大嘗試時間
connect_timeout 1 minute

#連接到上層代理的超時時間
peer_connect_timeout 30 seconds

#返回超時
request_timeout 2 minutes

#持續連接時間
persistent_request_timeout 1 minute


# ACCESS CONTROLS(訪問控制)
# -----------------------------------------------------------------------------

# TAG: acl

#Examples:
#acl myexample dst_as 1241
#acl password proxy_auth REQUIRED
#acl fileupload req_mime_type -i ^multipart/form-data$
#acl javascript rep_mime_type -i ^application/x-javascript$
#
#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

acl inside src 192.168.1.0/24 #內部網IP段
acl localmac arp "/usr/local/squid/localmac" #mac地址文件

# TAG: http_access
http_access allow inside #允許inside規則通過
http_access allow localmac #允許localmac裡面有登記的mac地址通過

#
#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
#

#http_access deny to_localhost
#

# And finally deny all other access to this proxy
http_access deny all

# TAG: http_reply_access

http_reply_access allow all

# TAG: icp_access

#icp_access allow all


# TAG: cache_peer_access


# ADMINISTRATIVE PARAMETERS(管理參數)
# -----------------------------------------------------------------------------

本新聞共4頁,當前在第2頁 1 2 3 4


# TAG: cache_mgr
cache_mgr webmaster@localhost #管理員信箱

# TAG: cache_effective_user
cache_effective_user squid #運行squid時的用戶
cache_effective_group squid #運行squid時的組

# TAG: visible_hostname
visible_hostname ProxyServer #代理服務器名稱



# OPTIONS FOR THE CACHE REGISTRATION SERVICE(cache注冊服務選項)
# -----------------------------------------------------------------------------



# HTTPD-ACCELERATOR OPTIONS(HTTPD加速選項)
# -----------------------------------------------------------------------------
#設定透明代理
httpd_accel_host ProxyServer #主機名
httpd_accel_port 80 #透明代理端口
httpd_accel_with_proxy on
httpd_accel_uses_host_header on


# MISCELLANEOUS(雜項)
# -----------------------------------------------------------------------------

# TAG: logfile_rotate
#squid會定期的將日志文件更名並打包。
#比如正在使用的日志文件為access.log,squid會將其更名並打包為 access.log.1.gz;
#過了一定時間後,squid又會將access.log.1.gz更名為access.log.2.gz
#並將當前的日志文件更名並打包為access.log.1.gz,以此循環。
#logfile_rotate指定的數字即為打包並備份的文件的數量,當達到這一數目時,
#squid將刪除最老的備份文件。默認值為1 0。如果想手動來進行這些操作,
#可以用logfile_rotate 0來取消自動操作。
logfile_rotate 4


# TAG: forwarded_for on|off
#關閉此項將在訪問某些論壇時顯示的IP是unknown,
#如果打開則顯示的是你client的內網IP

forwarded_for off


#圖標文件目錄
# icon_directory /usr/local/squid/share/icons


#錯誤提示文件目錄
# error_directory /usr/local/squid/share/errors/Simplify_Chinese



# TAG: snmp_port
# Squid can now serve statistics and status information via SNMP.
# By default it listens to port 3401 on the machine. If you don’t
# wish to use SNMP, set this to "0".
#
#Default:
# snmp_port 3401

# TAG: snmp_access
# Allowing or denying access to the SNMP port.
#
# All access to the agent is denied by default.
# usage:
#
# snmp_access allow|deny [!]aclname ...
#
#Example:
# snmp_access allow snmppublic localhost
# snmp_access deny all
#
#Default:
# snmp_access deny all




# DELAY POOL PARAMETERS (all require DELAY_POOLS compilation option)(延時池參數)
# -----------------------------------------------------------------------------


# TAG: coredump_dir
#當squid突然掛掉的時候,或者突然出現什麼故障的時候,將squid在內存中的資料寫到硬盤中
coredump_dir /usr/local/squid/var/cache3.設置iptables支持透明代理
設置squid+iptables支持透明代理前請先設置好NAT,可以使用下面的簡單語句


CODE:echo "1" >; /proc/sys/net/ipv4/ip_forward #設置轉發
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE #設置nat功能
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128
#將所有80端口的請求都轉發到suqid的3128端口上
其中192.168.1.0/24表示192.168.1.1-254這個網段通過squid和nat做透明代理。
這樣,當用戶訪問www服務的時候可以使用cache作為高速代理,減少流量,而其他服務則通過nat轉發。


4.使用上層代理
當你訪問國外網站比較慢的時候,可以通過設置代理訪問,那麼我們自己的代理服務器能否也設置別人的代理來訪問國外的網站呢?答案是肯定的。

例如有代理proxy1.cnlinux.net能以較快的速度訪問國外,且我們訪問它也比較快,所以我們用它來作為我們訪問國外網站的上層代理。
我們需要在squid.conf中添加如下參數:


CODE:<cache_peer>; <主機名稱/地址>; <類別>; <http端口>; <icp端口>; <其他參數>;
類別主要有上層的parent和同一層的sibling兩種,我們這裡主要介紹的是上層代理,就是parent,如果你需要架設代理服務器集群的話可以采用sibling,這裡我們就不做討論了。

其他參數有:


CODE:proxy-only :只向上層代理要資料,自己不緩存到本地proxy中。
weight=n :比重,當我們設置多台上層代理的時候,這幾台代理的功能都相同的,可以通過設置此項來決定那台上層代理比較重要,n越大表示越重要。
no-query :當使用sibling類別的時候,向同一層的proxy索要資料的時候就會向其送出icp請求,可以使用no-query來取消icp請求,一般我們向上層proxy請求資料的時候可以不需要發送icp包,以降低流量。
default :表示將這台proxy設置為默認proxy
no-netdb-exchange :表示不向proxy送出imcp包的請求。
no-digest :表示不紀錄向上層proxy提交的請求。

#上層proxy設置
cache_peer proxy1.cnlinux.net parent 3128 3130 no-digest no-netdb-exchange

#設置訪問規則,可以用域名,也可以用IP
acl usa dstdomain .com.us #美國.com.us的網站
acl usaip dst 18.0.0.0/8 #美國的部分IP段

#放行禁止規則
cache_peer_access proxy1.cnlinux.net allow usa #允許usa規則使用此上層proxy
cache_peer_access proxy1.cnlinux.net deny !usa #禁止所有非usa規則使用此上層proxy
cache_peer_access proxy1.cnlinux.net allow usaip
cache_peer_access proxy1.cnlinux.net deny !usaip

本新聞共4頁,當前在第3頁 1 2 3 4


5.啟動,關閉squid
a.將cache目錄的所有者更改為squid


CODE:#chown -R squid:squid /Cache1
#chown -R squid:squid /Cache2
b.對cache目錄進行初始化


CODE:#/usr/local/squid/sbin/squid -z
2004/11/01 23:06:29| Creating Swap Directories
FATAL: Failed to make swap directory /Cache1/00: (13) Permission denied
Squid Cache (Version 2.5.STABLE7): Terminated abnormally.
CPU Usage: 0.000 seconds = 0.000 user + 0.000 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 10
如果出現上面這樣的錯誤信息,表示你/Cache1目錄權限錯誤,請檢查/Cache1目錄所有者是否為squid用戶所有。

c.啟動squid


CODE:#su squid -c "/usr/local/squid/bin/RunCache &"
d.關閉squid


CODE:#/usr/local/squid/sbin/squid -k shutdown
要執行兩次才能正常關閉suqid
e.重新讀取squid.conf文件


CODE:#/usr/local/squid/sbin/squid -k reconfigure
需要執行兩次才能重新讀取squid.conf文件
6.日志分析
Proxy服務器安裝好後,我們當然要對服務器進行監控,通過日志分析,我們可以知道那些用戶上了那些網站,用了多少流量等,下面為大家介紹sarg這個日志分析工具,在squid的官方網站還推介了其他幾種日志分析工具,大家有興趣的話可以上去看看。

a.安裝


CODE:#./configure --prefix=/usr/local/sarg --enable-bindir=/usr/local/sarg/bin
#make && make install
b.設置sarg.conf文件


CODE:#vi /usr/local/sarg/sarg.conf

language language English #由於官方網站還沒有發布中文版,所以我們就使用英文好了,那位有興趣可以自己翻譯一下
access_log /usr/local/squid/var/logs/access.log.0 #squid日志文件存放位置
title "Squid 使用報告" #標題
temporary_dir /tmp #臨時目錄
output_dir /var/www/html/sarg #生成後的html存放到那裡,設置到你的網站目錄下,以便浏覽
overwrite_report no #是否覆蓋報告,當那個日期的報告已經存在時是否覆蓋掉
mail_utility mail
topsites_num 100
exclude_codes /usr/local/sarg/exclude_codes
max_elapsed 28800000
charset GB2312 #字符集
c.生成報告
設置好sarg.conf文件後,執行


CODE:#/usr/local/sarg/bin/sarg
將提示:SARG: Successful report generated on /usr/local/apache/htdocs/sarg/2004Oct31-2004Nov01
表示報告生成成功,還有報告存放位置,可以馬上打開您的浏覽器查看報告了。



三、關於Cache目錄的建議

由於cache目錄是經常的讀寫,所以最好硬盤能用SCSI的,速度比較快而且穩定。如果我們的cache大概需要40G的大小,那麼我們盡量使用多硬盤,不要當純用一個40G的硬盤,可以使用4個10G的硬盤,這樣,對於cache的速度更快。比如,當你有10M的東西要寫到cache中,如果是只是用一個硬盤的話,雖然可能你已經將4個cache目錄分別放在4個分區,可是你只有一個硬盤,同時只有一個在寫入,可是當你有4個硬盤的時候,你每個硬盤就只要寫入2.5M的東西,那樣是不是更快呢?

本新聞共4頁,當前在第4頁 1 2 3 4


Copyright © Linux教程網 All Rights Reserved