suid 下载及安装
1. squid 安装硬件要求
Squid运行在所有流行的Unix系统上,也可以在Microsoft Windows上运行。尽管squid的Windows支持在不断改进,但也许在Unix上容易一些。假如你有一个喜欢的操作系统,我建议你使用那个。否则,假如你找人推荐,我很喜欢FreeBSD。
squid对硬件要求不算高。内存是最重要的资源。内存短缺会严重影响性能。磁盘空间也是另一个重要因素。更多的磁盘空间意味着更多的缓存目标和更高的命中率。快速的磁盘和驱动器也是有利的。如果你舍得花钱,SCSI磁盘比ATA的执行性能好。当然快速的CPU也是好的,但它并不是提高性能的关键因素。
因为squid对每个缓存响应使用少数内存,因此在磁盘空间和内存要求之间有一定联系。基本规则是,每G磁盘空间需要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。你的情况当然会不同。内存需求依赖于如下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,和你使用的特殊功能。
人们经常问如此问题:“我的网络有X个用户,需要配备什么样的硬件给squid?”因为许多理由,这样的问题好难回答。特别的,很难说X个用户将产生多少流量。我告诉人们去建立一个有足够磁盘空间,可存储3-7天web流量数据的系统。例如,假如你的用户每天8小时耗费1M流量(仅仅HTTP和FTP传输),那就是每天大约3.5G。所以,我可以说,每兆web传输你需要10到25G的磁盘空间。
2.2.squid 下载及安装
2.2.1.squid 下载地址
http://www.squid-cache.org/
2.2.3.安装前准备
1) 文件描述符修改
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。
因为squid的工作方式,文件描述符的限制可能会极大的影响性能。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2倍。
通常在你的Unix shell中能找到系统的文件描述符限制。所有的C shell及其类似的shell有内建的limit命令。更新的Bourne shell及其类似的shell有一条叫做ulimit的命令。为了发现你的系统的文件描述符限制。
方法一:
ulimit -SHn 20480
方法二:
vi /etc/security/limits.conf
* - nofile 20480
2)调整临时端口范围
临时端口是TCP/IP栈分配给出去连接的本地端口。换句话说,当squid发起一条连接到另一台服务器,内核给本地socket分配一个端口号。这些本地端口号有特定的范围限制。例如,在FreeBSD上,默认的临时端口范围是1024-5000。
临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP连接在它们被关闭时进入TIME_WAIT状态。当连接进入TIME_WATI状态时,临时端口号不能被重用。
查看本地端口范围:
#cat /proc/sys/net/ipv4/ip_local_port_range
#32768 61000
修改临时端口范围:
#echo "net.ipv4.ip_local_port_range = 4000 65000" >> /etc/sysctl.conf
#sysctl -p
2.3.4 安装
# tar -zxf squid-3.0.STABLE26.tar.gz
#./configure --prefix=/usr/local/squid --enable-storeio=ufs,aufs --enable-icmp
# make
# make install
2.3.5.目录结果说明:
# tree -L 2 /usr/local/squid/
/usr/local/squid/
├── bin
│ ├── RunAccel
│ ├── RunCache
│ └── squidclient
├── etc
│ ├── cachemgr.conf
│ ├── cachemgr.conf.default
│ ├── mime.conf
│ ├── mime.conf.default
│ ├── squid.conf
│ └── squid.conf.default
├── libexec
│ ├── cachemgr.cgi
│ ├── pinger
│ └── unlinkd
├── sbin
│ └── squid
├── share
│ ├── errors
│ ├── icons
│ ├── man
│ └── mib.txt
└── var
└── logs
sbin
sbin目录的程序正常只能被root启动
sbin/squid
Squid的主程序
bin
bin目录包含对所有用户可用的程序
bin/RunCache
RunCache是一个shell脚本,你能用它来启动squid。假如squid死掉,该脚本自动重启它,除非它检测到经常的重启。RunCache是一个时间遗留的产物,那时Squid还不是后台服务进程。在最近的版本里,RunCache很少用到,因为Squid自动重启它自身,当你不使用-N选项时。
bin/RunAccel
RunAccel与RunCache几乎一致,唯一的不同是它增加了一个命令行参数,告诉squid在哪里侦听HTTP请求。
bin/squidclient
squidclient是个简单的HTTP客户端程序,你能用它来测试squid。它也有一些特殊功能,用以对运行的squid进程发起管理请求。
libexec
libexec目录传统的包含了辅助程序。有一些命令你不能正常的启动。然而,这些程序通常被其他程序启动。
libexec/unlinkd
unlinkd是一个辅助程序,它从cache目录里删除文件。如你后面看到的一样,文件删除是个性能瓶颈。通过在外部进程里执行删除操作,Squid提升了一些执行性能。
libexec/cachemgr.cgi
cachemgr.cgi是Squid管理功能的CGI接口。为了使用它,你需要拷贝该程序到你的WEB服务器的cgi-bin目录。在14.2章中有更多描述。
libexec/diskd(optional)
假如你指定了--enable-storeio=diskd,你才能看到它。
libexec/pinger(optional)
假如你指定了--enable-icmp,你才能看到它。
etc
etc目录包含squid的配置文件。
etc/squid.conf
这是squid的主要配置文件。初始的该文件包含了大量的注释,用以解释每一个选项做什么。在你理解了这些配置指令后,建议你删除这些注释,让配置文件更小和更容易阅读。注意假如该文件存在,安装过程不会覆盖该文件。
etc/squid.conf.default
这是从源代码目录中拷贝过来的默认配置文件。在升级了squid安装后,你也许发现有一份当前默认配置文件的拷贝是有用的。可能会增加新的配置指令,一些存在的旧指令可能有所改变。
etc/mime.conf
mime.conf文件告诉squid对从FTP和Gopher服务器获取的数据使用何种MIME类型。该文件是一个关联文件名扩展到MIME类型的表。正常而言,你不必编辑该文件。然而,你可能需要增加特殊文件类型的接口,它们在你的组织内使用。
etc/mime.conf.default
这是从源代码目录里拷贝过来的默认mime.conf文件。
share
share目录通常包括squid的只读数据文件。
share/mib.txt
这是squid的SNMP管理信息基础(MIB)文件。squid自身不使用该文件,然而,你的SNMP客户端软件(例如snmpget和多路由走向图(MRTG))需要该文件,用以理解来自squid的SNMP对象可用。
share/icons
share/icons目录包含大量的小图标文件,squid用在FTP和Gopher目录列举里。正常而言,你不必担心这些文件,但如果需要,你可以改变它们。
share/errors
share/errors目录包含了squid显示给用户看的错误消息模板。这些文件在你安装squid时,从源代码目录拷贝而来。如果需要你可以编辑它们。然而,在每次运行make install时,安装过程总会覆盖它们。所以假如你想定制错误消息,建议你把它们放在不同的目录。
var
var目录包含了不是很重要的和经常变化的文件。这些文件你不必正常的备份它们。
var/logs
var/logs目录是squid不同日志文件的默认位置。当你第一次安装squid时,它是空的。一旦squid开始运行,你能在这里看到名字为access.log,cache.log和store.log这样的文件。
2.3.6 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。既然指令每次都有所改变,你能参考该文档,以获取最近的更新。
2.3.7 squid 用户
你可能知道,unix进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组的组合,必须对大部分squid相关的文件和目录有读和写的权限。
我高度推荐创建名为"squid"的用户和组。这避免了某人利用squid来读取系统中的其他文件。假如不止一个人拥有对squid的管理权限,你可以将他们加到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文件读取)。
# /usr/sbin/useradd -s /sbin/nologin squid -M
默认用户为nobody
# grep cache_effective_user /usr/local/squid/etc/squid.conf
# TAG: cache_effective_user
# cache_effective_user nobody
修改用户及组
cache_effective_user squid
cache_effective_group squid
2.3.8 squid 日志路径
你必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被***时。
squid有三个主要的日志文件:cache.log,access.log,store.log.
cache.log:
包含状态性的和调试性的消息。当你刚开始运行squid时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s选项来运行squid,重要的cache.log消息也可被送到你的syslog进程。通过使用cache_log指令,你可以改变该日志文件的路径:
access.log:
access.log文件包含了对squid发起的每个客户请求的单一行。一般为HTTP访问日志,每行平均约150个字节。也就是说,在接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log指令来改变该日志文件的路径:
cache_access_log /squid/logs/access.log
store.log:
store.log文件对大多数cache管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平均记录大小典型的是175-200字节。然而,squid不在store.log里对cache点击创建接口,所以它比access.log包含少得多的记录。请使用cache_store_log指令来改变它的位置
cache_store_log /squid/logs/store.log
access_log /usr/local/squid/var/logs/access.log squid
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
2.3.9 squid缓存路径
cache_dir: 指定磁盘的缓存路径
cache_dir ufs /usr/local/squid/var/cache 100 16 256
100 指定目录大小MB
16 一级目录的数量
256 二级子目录的数量
2.3.10 squid 端口
http_port指令告诉squid在哪个端口侦听HTTP请求。默认端口是3128:
http_port 3128
如果squid 作为反向代理,应该将此值设置为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
例如:如果本机运行http和squid 则指定ip地址即可:192.168.1.1:80
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。