- 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器。这种服务器不只可使用户能够最快的获得他们想要的信息,并且能够大大减小服务端网络传输的数据量。缓存服务器每每也是代理服务器。对于网站的用户来讲,缓存服务器和代理是不可见的,即在用户看来全部的网站信息都来自其正在访问的网站,而实际上多是缓存服务器在提供访问数据。
- 目前国内互联网公司经常使用的缓存服务器有:squid,varnish(几乎绝迹),nginx,ats。
- squid做为缓存和代理服务器的历史十分的悠久,若是有时间,能够测试下varnish,nginx,squid三者之间的性能对比.
- 国内基本上90%以上的商业CDN公司,像国内的CDN基本都在用squid,像蓝汛,网宿,帝联,sina在用ats。
- Squid官方:http://www.squid-cache.org/
cache命中是在cache server 每次从它的缓存里知足客户端HTTP请求时发生。cache命中率,是全部客户端HTTP请求中命中的比例。Web缓存典型的cache命中率在30%到60%之间。另外一个类似的度量单位叫作字节命中率,描绘了cache提供服务的数据容量(字节数),如何提高cache命中率?css
- apache nginx 能够expries,cache-control缓存头
- 动静分离,静态化,对静态走CDN
- mysql cache让缓存靠前
- 4XX,5XX之类错误页面,死链不缓存。
cache丢失在cache server不能从它的缓存里知足客户端HTTP请求时发生。cache丢失的缘由有不少种html
(1)当cache server第一次接收到对第一个新资源的请求时,就会产生一个cache丢失。如何解决第一次命中?前端
预热或者预取。mysql
- 内部先请求访问。能够经过脚本实现(这是个思路但不靠谱)。
- 后端生成数据以后,统一推到前端cache server。即预取,预热。
(2)存储空间满或者对象自身过时,cache server会清除这些缓存对象以释放空间给新对象。linux
- 加大内存或者磁盘。
- 过时时间设置的长一些。
- 参数设置,缓存的参数设置大一些。最大缓存对象2M(热点缓存)。
- 分资源缓存,1M,10M,100M(分拆服务器,acl 正则匹配抛给不一样的pools)
(3)还有多是客户访问的资源不可到达。原始服务器会指示cache server 怎样处理用户响应。例如,它会提示数据不能被缓存,或在有限的时间内才被重复使用等等nginx
- 对于缓存来说,数据的一致性是一个特别头疼的问题,特别是memcached。
- cache确认保证cache server不对访问的用户返回过时的数据。在重复使用缓存对象时,cache server须要常常从原始服务器确认它。假如服务器指示squid的拷贝仍然有效,数据就发送出去。不然,squid更新它的缓存拷贝,而且转发给客户。
- 当用户更新了数据到数据库或者存储服务器的时候,能够从业务角度主动调用接口清除该对象缓存的指令。CDN 5-15分钟。
- 图片放到CDN了须要更新吗?不须要更新。图片修改算更新,这样的业务就要推送。
- 网站改版:再CDN上推送JS,css(更名)
- Squid是一个高性能的代理缓存服务器,Squid支持FTP,gopher和HTTP协议。和通常的代理缓存软件不一样,Squid用一个单独的,非模块化的,I/O驱动的进程来处理全部的客户端请求。
- Squid将数据元缓存在内存和硬盘中,同时也缓存DNS查询的结果。Squid支持SSL,支持访问控制。因为使用了ICP(轻量Internet缓存协议),Squid可以实现层叠的代理阵列,从而最大限度的节约带宽。
Squid Cache(简称Squid)是一个流行的代理服务武器和Web缓存服务器软件。Squid服务有至关多的用途:web
- 用于放置在Web服务器的前面,缓存网站Web服务器的相关数据,这样用户请求缓存服务器就能够直接返回数据给用户了,从而提高了用户的访问网站体验,从另外一方面也减轻了Web服务器,数据库服务器,图片文件存储服务器等业务服务器的压力。这种应用被称之为反向代理服务。
- 用于放置在企业内部关键出网位置或者某些共享网络的前端,缓存内部上网用户的数据,域名系统和其余网络搜索数据等,这样用户上网请求的数据,就能够由缓存服务器返回给内部用户,而不须要上网了,从而使得内部用户上网更快,更安全,也会大大节约公司的带宽。这种应用被称之为正向代理服务(普通代理或者透明代理)。
- 经过放在网络的关键位置过滤网络流量和访问数据,提高整个网络安全。例如:能够监控及限制内部企业员工的上网行为,能够和iptables配合做为办公网的网关。
- 用做局域网经过代理上网,只要是一台能够上网的机器就能够,位置随便,让全部的用户的浏览器设置这个服务器代理上网便可。
Squid代理服务器主要用于类Unix系统中运行,其发展历史至关悠久,功能也至关完善。除了对HTTP支持的很好外,对于FTP与HTTPS的支持也至关好,在3.0测试版中也支持了IPv6,Squid的主页在http://www.squid-cache.org。目前业界主流CDN都是基于Squid进行二次开发做为cache缓存服务器的。正则表达式
传统的代理服务器就是前面咱们所说的经过浏览器设置代理的方法:sql
windows如何设置代理?shell
- 所谓透明代理,是相对于代理服务器而言,客户端不须要作任何和代理服务器相关的设置和操做,对用户而言,感受不到代理服务器的存在,因此称之为透明代理。即把代理服务器部署在核心的上网出口,当用户上网浏览页面时,会交给代理服务器向外请求,若是结合iptables能够实现代理+网关+内容过滤+流量安全控制等完整的上网解决方案。
- 透明代理流程说明:用户A发送一个访问请求到防火墙,由防火墙将该用户的访问请求转发到SQUID,SQUID在先检查自身缓存中有无该用户请求的访问内容,若是没有,则请求远端目的服务器,获取该用户的访问内容,在返回给用户的同时,在自身缓存保留一份记录以备下次调用;当用户B发送一个和用户A相同的访问请求时,由防火墙将转发该用户请求到SQUID,SQUID检查自身缓存发现有一样内容后,直接将该内容返回给用户。
- 普通代理方式是代理内部网络用户访问internet上服务器的链接请求,客户端必须指定代理服务器,并将原本要直接发送到internet上服务器的链接请求发送给代理服务器处理。反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的链接请求,而后将请求转发给内部网络上的服务器,并将从内部服务器上获得的结果返回给internet上请求链接的客户端,此时代理服务器对外就表现为一个服务器。
- 反向代理流程说明:SQUID做为反向代理服务器,一般工做在一个服务器集群的前端,在用户端看来,SQUID服务器就是他说要访问的服务器,而实际意义上SQUID只是接受用户的请求,同时将用过户请求转发给内网真正的WEB服务器,若是SQUID自己有用户要访问的内容,则SQUID直接将数据返回给用户,起到了缓存数据的做用,减小了后端服务的压力。
问:网站何时就须要用squid(CDN)了?
静态抗不住了,想节省带宽,节省成本,想提升访问速度
- 节省带宽及服务器成本。
- 提高用户体验。
- 源站抗不住了。
目前主流使用的Squid缓存服务,大公司,2.7是最多的,基本上90%以上的商业CDN公司,例如国内的CDN,蓝汛,网宿,帝联都在用squid2.7,squid3.0使用C++重写后,性能上和Squid 2.6和2.7仍是有些距离的。使用的人并非不少,性能稳定性等还有必要在等等看。
Squid能够运行在几乎全部的常见Unix及Linux系统上,也能够在Microsoft Windows上运行。尽管squid的Windows支持在不断改进,但在Unix及Linux系统上运行Squid依然是更简单,安全,更有效率,本章咱们就使用Centos6.4 x86_64来运行Squid。
squid对硬件的要求最主要的是内存资源。内存短缺会严重影响性能。由于全部的对象都会尽量的被缓存到内存中,这样才能更快的提高用户的响应及返回数据。
磁盘空间也是另外一个squid可以高效运行的重要因素。更多的磁盘空间意味着更多的缓存目标和更高的命中率。快速的磁盘介质也是必要的。例如:用ssd,sas替代sata磁盘,除了使用过raid外,能够指定多个磁盘路径缓存。
由于squid对每一个缓存响应使用少数内存,所以在磁盘空间和内存要求之间有必定联系。基本规则是,每G磁盘空间须要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。你的状况固然会不一样。内存需求依赖于以下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,和你使用的特殊功能。
名称 | 环境 |
---|---|
内存 | 1G |
硬盘 | 20G |
VM | 1-2个,其中一个部署缓存服务器,一个部署web服务器作测试用 |
系统 | Centos7.6 x86_64 |
名称 | IP |
---|---|
Squid-Server | 192.168.200.13 |
[root@Squid-Server ~]# which wget /usr/bin/wget [root@Squid-Server ~]# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz [root@Squid-Server ~]# ll -d squid-3.5.26.tar.gz -rw-r--r-- 1 root root 4838368 6月 20 15:47 squid-3.5.26.tar.gz
[root@Squid-Server ~]# tar xf squid-3.5.26.tar.gz -C /usr/src/ [root@Squid-Server ~]# ll -d /usr/src/squid-3.5.26 drwxr-xr-x 17 1000 1000 4096 6月 2 2017 /usr/src/squid-3.5.26
Squid在高负载下,须要大量的内核资源。特别的,你须要给你的系统配置比正常状况更高的文件描述符和缓存,最好在开始编译squid以前来增长文件描述符的大小(在系统安装时咱们已经讲解过)。squid和内核经过数据结构来交换信息,数据结构的大小不能超过设置的文件描述符的限制。squid在运行时检查这些设置,而且使用最安全的(最小的)值。
1)文件描述符:
- 文件描述符是一个简单的整数,用以标明每个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操做系统一般给每一个进程能打开的文件数量强加一个限制。更甚的是,unix一般有一个系统级的限制(1024).由于squid的工做方式,文件描述符的限制可能会极大的影响性能。当squid用完全部的文件描述符后,它不能接收用户新的链接。也就是说,用完文件描述符致使拒绝服务。直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
- 在运行./configure以前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数状况下,1024个文件描述符足够了。很是忙的cache可能须要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每一个进程限制的2倍。
[root@Squid-Server ~]# ulimit -n 1024 #1024这是linux系统默认状况的值
2)设置打开的最大文件描述符的数目
[root@Squid-Server ~]# ulimit -n 1024 [root@Squid-Server ~]# ulimit -n 20480 [root@Squid-Server ~]# ulimit -n 20480 [root@Squid-Server ~]# echo "ulimit -n 20480" >> /etc/rc.local [root@Squid-Server ~]# tail -1 /etc/rc.local ulimit -n 20480
- 临时端口是TCP/IP栈分配给出去链接的本地端口。换句话说,当squid发起一条链接到另外一台服务器,内核给本地socket分配一个端口号。这些本地端口号有特定的范围限制。
- 例如,Centos默认是32768-61000.
- 临时端口号的短缺对很是慢的代理服务器(例如每秒数百个链接)来讲,会较大的影响性能。这是由于一些TCP链接在他们被关闭时进入TIME_WAIT状态。当链接进入TIME_WAIT状态时,临时端口号不能被重用。
调整临时端口范围方法:
[root@Squid-Server ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 [root@Squid-Server ~]# echo "net.ipv4.ip_local_port_range = 4000 65000" >> /etc/sysctl.conf [root@Squid-Server squid-3.0.STABLE20]# sysctl -p net.ipv4.ip_local_port_range = 4000 65000 [root@Squid-Server ~]# cat /proc/sys/net/ipv4/ip_local_port_range 4000 65000
官方:http://www.squid-cache.org/Versions/v3/3.5/cfgman/
进入解压后的squid目录
[root@Squid-Server ~]# cd /usr/src/squid-3.5.26/ [root@Squid-Server squid-3.5.26]# more INSTALL /* * Copyright (C) 1996-2017 The Squid Software Foundation and contributors * * Squid software is distributed under GPLv2+ license and includes * contributions from numerous individuals and organizations. * Please see the COPYING and CONTRIBUTORS files for details. */ To build and install the Squid Cache, type: % ./configure --prefix=/usr/local/squid #安装过程总共3步 % make all % make install To run a Cache, you will need to: 1. customize the squid.conf configuration file: % vi /usr/local/squid/etc/squid.conf #配置文件 2. Initalise the cache: % /usr/local/squid/sbin/squid -z #初始化缓存 3. start the cache: % /usr/local/squid/sbin/squid #启动squid If you want to use the WWW interface to the Cache Manager, copy the tools/cachemgr.cgi program into your httpd server's cgi-bin directory.
#先进行安装依赖 [root@Squid-Server squid-3.5.26]# yum -y install openssl-devel libXpm-devel fontconfig-devel [root@Squid-Server squid-3.5.26]# rpm -qa openssl-devel libXpm-devel fontconfig-devel libXpm-devel-3.5.12-1.el7.x86_64 fontconfig-devel-2.13.0-4.3.el7.x86_64 openssl-devel-1.0.2k-16.el7_6.1.x86_64
#配置编译环境 [root@Squid-Server squid-3.5.26]# ./configure --prefix=/usr/local/squid3 --enable-async-io=100 --with-pthreads --enable-storeio="aufs,diskd,ufs" --enable-removal-policies="heap,lru" --enable-icmp --enable-delay-pools --enable-useragent-log --enable-referer-log --enable-kill-parent-hack --enable-cachemgr-hostname=localhost --enable-arp-acl --enable-default-err-language=English --enable-err-languages="Simplify_Chinese English" --disable-poll --disable-wccp --disable-wccpv2 --disable-ident-lookups --disable-internal-dns --enable-basic-auth-helpers="NCSA" --enable-stacktrace --with-large-files --disable-mempools --with-filedescriptors=64000 --enable-ssl --enable-x-acceletator-vary --disable-snmp --with-aio --enable-linux-netfilter --enable-linux-tproxy #编译 [root@Squid-Server squid-3.5.26]# make #安装 [root@Squid-Server squid-3.5.26]# make install
#指定安装路径 ./configure --prefix=/usr/local/squid3 \ # --enable-debug-cbdata \ #使用100个线程进行同步IO --enable-async-io=100 \ #使用POSIX(可移植性操做系统接口)线程 --with-pthreads \ #Squid支持大量的不一样存储模块。该选项指定squid编译时使用哪一个模块 --enable-storeio="aufs,diskd,ufs" \ #指定排除元素,排除元素是squid须要腾出空间给新的cache目标时,用以排除旧目标的机制。squid在2.5支持3个排除元素:最少近期使用(LRU),贪婪对偶大小(GDS),最少常用(LFU)。 --enable-removal-policies="heap,lru" \ #启用ICMP,为了激活netdb,必须使用--enable-icmp选项来配置squid。也必须以超级用户权限来安装pinger程序。 --enable-icmp \ #启用延迟池。延时池是squid用于传输形状或带宽限制的技术。该池由大量的客户端IP地址组成。当来自这些客户端的请求处于cache丢失状态,他们的响应可能被人工延迟。 --enable-delay-pools \ #该选项激活来自客户请求的HTTP用户代理日志 --enable-useragent-log \ #该选项激活来自客户请求的HTTP referfer日志 --enable-referer-log \ #遇到骇客时才有用,自动反hackers --enable-kill-parent-hack \ #squid在一些操做系统中支持ARP,或者以太地址访问控制列表。该代码使用非标准的函数接口,来执行ARP访问控制列表,因此它默认被禁止。假如,你在linux或solaris上使用squid,你可能用的上这个功能。 --enable-arp-acl \ #该选项设置error_directory指令的默认值 --enable-default-err-language=Simplify_Chinese \ #该选项指定复制到安装目录($prefix/share/errors)的语言。假如你不使用该选项,全部可用语言被安装。 --enable-err-languages="Simplify_Chinese English" \ #强制使用“poll()”函数扫描文件描述符 --disable-poll \ #禁用WCCP协议 --disable-wccp \ #禁用WCCP协议V2 --disable-wccpv2 \ #禁用ident协议 --disable-ident-lookups \ #禁用内部DNS --disable-internal-dns \ #设置基础帮助名单 --enable-basic-auth-helpers="NCSA" \ #启用崩溃追踪,squid崩溃后会自动记录cache.log --enable-stacktrace \ #启用大文件服务 --with-large-files \ #禁用mempools --disable-mempools \ #默认的文件描述符是65535 --with-filedescriptors=65535 \ #支持SSL --enable-ssl \ #该高级功能可能在squid被配置成加速器时使用。它建议squid在响应请求时,从后台原始服务器中寻找X-Accelerator-Vary头。 --enable-x-acceletator-vary #Enable Transparent Proxy support for Linux (Netfilter) --enable-linux-netfilter #Enable real Transparent Proxy support for Netfilter --enable-linux-tproxy
#把安装目录作成软链接 [root@Squid-Server squid-3.5.26]# ln -s /usr/local/squid3/ /usr/local/squid [root@Squid-Server squid-3.5.26]# ll -d /usr/local/squid lrwxrwxrwx 1 root root 18 6月 20 16:13 /usr/local/squid -> /usr/local/squid3/
在安装完后,将在squid的安装目录里(/usr/local/squid/)会看到下列目录和文件:
[root@Squid-Server squid-3.5.26]# tree -L 2 /usr/local/squid /usr/local/squid ├── bin │ ├── purge │ └── squidclient ├── etc │ ├── cachemgr.conf │ ├── cachemgr.conf.default │ ├── errorpage.css │ ├── errorpage.css.default │ ├── mime.conf │ ├── mime.conf.default │ ├── squid.conf │ ├── squid.conf.default │ └── squid.conf.documented ├── libexec │ ├── basic_db_auth │ ├── basic_fake_auth │ ├── basic_getpwnam_auth │ ├── basic_msnt_multi_domain_auth │ ├── basic_ncsa_auth │ ├── basic_nis_auth │ ├── basic_pop3_auth │ ├── basic_radius_auth │ ├── basic_smb_auth │ ├── basic_smb_auth.sh │ ├── basic_smb_lm_auth │ ├── cachemgr.cgi │ ├── cert_tool │ ├── digest_file_auth │ ├── diskd │ ├── ext_delayer_acl │ ├── ext_file_userip_acl │ ├── ext_kerberos_ldap_group_acl │ ├── ext_sql_session_acl │ ├── ext_unix_group_acl │ ├── ext_wbinfo_group_acl │ ├── helper-mux.pl │ ├── log_db_daemon │ ├── log_file_daemon │ ├── negotiate_kerberos_auth │ ├── negotiate_kerberos_auth_test │ ├── negotiate_wrapper_auth │ ├── ntlm_fake_auth │ ├── ntlm_smb_lm_auth │ ├── pinger │ ├── storeid_file_rewrite │ ├── unlinkd │ ├── url_fake_rewrite │ └── url_fake_rewrite.sh ├── sbin │ └── squid ├── share │ ├── errors │ ├── icons │ ├── man │ └── mib.txt └── var ├── cache ├── logs └── run 12 directories, 47 files
文件名/目录名 | 功能描述 |
---|---|
sbin | squid主从程序的目录,正常只能被root启动 |
sbin/squid | Squid的主程序 |
bin | bin目录包含对全部用户可用的程序 |
bin/RunCache | RunCache是一个shell脚本,你能用它来启动squid。假如squid死掉,该脚本自动重启它,除非它检测到常常的重启 |
bin/RunAccel | RunAccel与RunCache几乎一致,惟一不一样是它增长了一个命令行参数,告诉squid在哪里侦听HTTP请求 |
bin/squidclient | squidclient是个简单的HTTP客户端程序,你能用它来测试squid。它也有一些特殊功能,用以对运行的squid进程发起管理请求。 |
libexec | libexec目录包含了辅助程序。有一些命令你不能正常的启动。然而,这些程序一般被其余程序启动 |
libexec/unlinkd | unlinkd是一个辅助程序,它从cache目录里删除文件 |
libexec/cachemgr.cgi | cachemgr.cgi是Squid管理功能的CGI接口。为了使用它,你须要拷贝该程序到你的WEB服务器的cgi-bin目录 |
libexec/diskd(optional) | 假如你指定了--enable-storeio=diskd,你才能看到它 |
libexec/pinger(optional) | 假如你指定了--enable-icmp,你才能看到它 |
etc | etc目录包含squid的配置文件 |
etc/squid.conf | 这是squid的主配置文件 |
var | var目录包含了不是很重要的和常常变化的文件。这些文件没必要正常的备份他们 |
var/logs | var/logs目录是squid不一样日志文件的默认位置。当你第一次安装squid时,它是空的。一旦squid开始运行,你能在这里看到名字为access.log,cache.log和store.log这样的文件 |
var/cache | 假如你不在squid.conf文件里指定,这是默认的缓存目录(cache_dir) |
参考:http://home.arcor.de/mailerstar/jeff/squid/chap03.html
- Squid的配置文件相对规范。它与其余许多unix程序类似。每行以配置指令开始,后面跟着数字值或关键字。在读取配置文件时,squid忽略空行和注释掉的行(以#开始)。
- 默认的squid.conf内容有至关多的内容,以下:
[root@Squid-Server squid-3.5.26]# cd /usr/local/squid/etc/ [root@Squid-Server etc]# wc -l squid.conf 73 squid.conf #去掉以#开头的注释和空行(以#开头!) [root@Squid-Server etc]# egrep -v "^#|^$" squid.conf.default > squid.conf [root@Squid-Server etc]# cat squid.conf | wc -l 30 [root@Squid-Server etc]# cat squid.conf acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https 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 http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localnet http_access allow localhost http_access deny all http_port 3128 coredump_dir /usr/local/squid3/var/cache/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320
- 几乎全部的unix进程和文件拥有文件的组和属主的属性,你必须建立一个用户和组给squid服务,该用户和组的组合,必须对大部分squid相关的文件和目录有读和写的权限,因此须要建立“squid”的用户和组,这避免了某人利用squid来读取系统中的其余文件。
- 运行squid必须以root身份运行,设置配置文件squid.conf中。cache_effective_user为squid来运行,这个用户和组的名称理论上能够任意起。
[root@Squid-Server etc]# useradd -s /sbin/nologin -M squid [root@Squid-Server etc]# id squid uid=1000(squid) gid=1000(squid) 组=1000(squid)
#设置启动帐户为squid [root@Squid-Server etc]# echo "cache_effective_user squid" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_effective_user squid #设置启动帐户组为squid [root@Squid-Server etc]# echo "cache_effective_group squid" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_effective_group squid #开启store日志 [root@Squid-Server etc]# echo "cache_store_log /usr/local/squid/var/logs/store.log" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_store_log /usr/local/squid/var/logs/store.log #缓存对象日志 #开启cache日志 [root@Squid-Server etc]# echo "cache_log /usr/local/squid/var/logs/cache.log" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_log /usr/local/squid/var/logs/cache.log #开启磁盘缓存cache_dir [root@Squid-Server etc]# echo "cache_dir ufs /usr/local/squid/var/cache 100 16 256" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_dir ufs /usr/local/squid/var/cache 100 16 256
- http_port指令告诉squid在哪一个端口侦听HTTP请求。默认端口是3128:
- 假如你计划将squid做为web服务加速器运行,能够将该端口设置为80.
可使用附加的http_port行,来指示squid侦听在多个端口上,例如,来自某个部门的浏览器发送请求到3128,然而另外一个部门使用80端口。简单的将两个端口号列举出来:
http_port | 3128 |
---|---|
http_port | 8080 |
也可使用http_port指令来使squid侦听在指定的接口地址上,当squid做为防火墙运行时,它有两个网络接口:一个内部的和一个外部的,为了不来自外部的http请求,使squid仅仅侦听在内部接口上,简单的将IP地址放在端口号的前面:
#squid 仅监听内网地址,拒绝外部Http请求访问 http_port 192.168.1.1:3128
- squid默认的日志目录是squid安装位置下的logs目录。例如,假如你在./configure中没有使用--prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs,必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时若是接受到错误,它会退出和重启。该行为的主要理由应引发你的注意,squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。
- squid有三个主要的日志文件:
cache.log
access.log
store.log
cache.log包含多种消息,例如Squid的配置信息,性能警告,以及严重错误。以下是cache.log的输出样本:
主要的错误和异常条件最可能报告在cache.log里
。
刚开始运行squid时,须要密切关注该文件。假如squid拒绝运行,缘由也许会出如今cache.log文件的结尾处。在正常条件下,该文件不会变得很大。假如你以-s选项来运行squid,重要的cache.log信息也可被送到你的rsyslog进程。经过使用cache_log指令,你以修改配置文件squid.conf来改变该日志文件的路径。
为了让squid发送cache.log消息的拷贝到系统日志,请使用-s命令行选项。仅仅在debug级别0和1的消息会被转发。
- Squid把关于HTTP事务的关键信息存放在access.log里。该文件是基于行的,也就是说每行对应一个客户端请求。squid记录客户端IP(或主机名),请求URL,响应size等其余信息。
- Squid在access.log里记录全部HTTP访问,除了那些在尚未发送数据前就断开的链接。Squid也记录全部的ICP(非HTCP)事务,除非你使用log_icp_queries指令关闭了这个功能。
- 默认的access.log格式包含了10个域。以下是日志样本,长行分割而且缩进排版。
- access.log文件记录了对squid发起的每一个客户请求。每行平均约150个字节,也就是说,在接受一百万条客户请求后,它的体积约是150M。可使用cache_access_log指令改变该日志文件的路径:
- 若是不想squid记录客户端请求日志,修改日志文件的路径为/dev/null便可。
- store.log记录Squid关于存储或删除cache目标的决定。对每一个存在cache里的目标每一个不可cache的目标,以及每一个被轮换策略删除的目标,Squid都会建立相应的日志条目。该日志文件内容既包含了内存cache,又包含了磁盘cache。
- store.log文件对大多数cache管理员来讲并不是颇有用,可是咱们能够经过这个日志来解析客户端访问的数据是否被缓存,它包含了进入和离开缓存的每一个目标的记录。使用cache_store_log指令来改变它的位置:
- 经过指定路径为none,你能轻易的彻底禁止store.log日志:
- Squid的日志文件增长没有限制...为了保证日志文件大小合理,应建立计划任务来规律的重命名和打包日志。squid有内建的日志回滚功能,也能够避免单个日志过于庞大。
ACL元素是Squid的访问控制基础。这里会告诉你如何指定包括IP地址,端口号,主机名,和URL匹配等变量。每一个ACL元素有个名字,在编写访问控制规则时须要引用他们。
基本的ACL元素语法以下:
acl name type value1 value2 ... #例如: acl Workstations src 10.0.0.0/16 #表示源地址匹配10.0.0.0/16网段
在多数状况下,你能对一个ACL元素列举多个值。你也能够有多个ACL行。例如,下列两行配置是等价的:
acl Http_ports port 80 8000 8080 #提示:三个端口是或的关系,or
上面一行与下面三行等价
acl Http_ports port 80 acl Http_ports port 8000 acl Http_ports port 8080
使用对象:src,dst,myip
- squid在ACL里指定IP地址时,拥有强有力的语法。你能以子网,地址范围形式编写地址。
- squid支持标准IP地址写法(由“.”链接的4个小于256的数字)。
- 另外,假如你忽略掩码,squid会自动计算相应的掩码。例如,下组是相等的:
acl Bar src 172.16.66.0/255.255.255.0 acl Bar src 172.16.66.0/24 acl Squid dst www.squid-cache.org
将ACl主机名转换到IP地址的过程会延缓squid的启动。除非绝对必要,请避免使用主机名。
使用对象:srcdomain,dstdomain和cache_host_domain指令
域名简单的就是DNS名字或区域。例如,下面是有效的域名:
www.squid-cache.org squid-cache.org org
- 域名ACL有点深奥,由于相对于匹配域名和子域有点微妙的差异。当ACL域名以“.”开头,squid将它做为通配符,它匹配在该域的任何主机名,甚至域名自身。相反的,若是ACL域名不以“.”开头,squid使用精确的字符串比较,主机名一样必须被严格检查。
- 域名匹配可能让人迷惑,因此继续往下看,以便你能够真正理解它。以下是两个稍微不一样的ACL。
acl A dstdomain foo.com acl B dstdomain .foo.com
- 用户对http://www.foo.com/的请求匹配ACL B,但不匹配A。ACL A要求严格的字符串匹配,然而ACL B 里领头的点就像通配符。
- 另外,用户对http://foo.com/的请求同时匹配A和B。尽管在URL主机名里的foo.com前面没有字符,但ACL B里领头的点仍然致使一个匹配。
使用对象:srcdom_regex,dstdom_regex,url_regex,urlpath_regex,browser,referer_regex,ident_regex,proxy_auth_regex,req_mime_type,rep_mime_type
大量的ACL使用正则表达式来匹配字符串。对squid来讲,最常使用的正则表达式功能用以匹配字符串的开头或结尾。例如,^字符是特殊元字符,它匹配行或字符串的开头:
- ^http://
该正则表达式匹配任意以http://开头的URL。$也是特殊的元字符,由于它匹配行或字符串的结尾
- :.jpg$
实际上,该示例也有些错误,由于.字符也是特殊元字符。它是匹配任意单个字符的通配符。咱们实际想要的应该是,见下行:
- .jpg-反斜杠对这个“.”进行转义。该正则表达式匹配以.jpg结尾的任意字符串。假如你使用或字符,正则表达式的行为就象标准子串搜索。他们匹配在字符串里任何位置出现的单词或词组.
对全部的squid正则表达式类,你可使用大小写敏感的选项。匹配是默认大小写敏感的。为了大小写不敏感,在ACL类型后面使用-i选项。例如:acl Foo url_regex -i ^http://www
使用对象:port,myport
该类型是相对的。值是个别的端口号或端口范围。回想一下TCP端口号是16位值,这样它的值必须大于0或小于65536。以下是一些示例:
acl Foo port 123 acl Bar port 1-1024 acl Foo port 123 80 443
参考:http://home.arcor.de/jeffpang/squid/chap06.html
method ACL 指HTTP请求方法。GET是典型的最经常使用方法,接下来是POST,PUT,和其余。下例说明如何使用method ACL:
acl Uploads method PUT POST
注意:CONNECT方法很是特殊。它是用于经过HTTP代理来封装某种请求的方法。在处理CONNECT方法和远程服务器的端口号时应特别谨慎。就像前面章节讲过的同样,你不但愿squid链接到某些远程服务。你该限制CONNECT方法仅仅能链接到HTTPS/SSL或NNTPS端口(443或563).默认的squid.conf这样作:
acl CONNECT method CONNECT acl SSL_ports 443 563 http_access allow CONNECT SSL_ports #限制CONNECT方法仅仅能链接到HTTPS/SSL http_access deny CONNECT
PURGE 是另外一个特殊的请求方法。它是Squid的专有方法,没有在任何RFC里定义。它让管理员能强制删除缓存对象。既然该方法有些危险,squid默认拒绝PURGE请求,除非你定义了ACL引用该方法。不然,任何能访问cache者也许可以删除任意缓存对象。在这里,我建议仅仅容许来自localhost的PURGE。
acl Purge method PURGE acl localhost src 127.0.0.1/32 http_access allow Purge Localhost http_access deny Purge
该类型指URI访问(或传输)协议。以下是有效值:http,https(same as HTTP/TLS),ftp,gopher,urn,whois和cache_object。也就是说,这些是被squid支持的URL机制名字。例如,假如你想拒绝全部的FTP请求,你可以使用下列指令:
acl FTP proto FTP http_access deny FTP
cache_object机制是squid的特性。它用于访问squid的缓存管理接口,不幸的是,它并不是好名字,可能会被改变。默认的squid.conf文件有许多行限制缓存管理访问:
acl Manager proto cache_object acl Localhost src 127.0.0.1 http_access allow Manager Localhost http_access deny Manager
url_regex ACL用于匹配请求URL的任何部分,包括传输协议和原始服务器主机名。例如,以下ACL匹配从FTP服务器的MP3文件请求:
acl FTPMP3 url_regex -i ^ftp://.*\.mp3$ acl sex url_regex -i ^http://.*sex.*
urlpath_regex与url_regex很是类似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测很是容易。例如,假设你必须拒绝URL里的"sex",但仍容许在主机名里含有"sex"的请求,那么这样作:
acl Sex urlpath_regex sex http_access deny Sex
另外一个例子,假如你想特殊处理cgi-bin请求,你能这样捕获它们:
acl CGI1 urlpath_regex ^/cgi-bin
固然,CGI程序并不是总在/cgi-bin/目录下,这样你应该编写其余的ACL来捕获它们。
(1)限制同一IP客户端的最大链接数
acl OverConnLimit maxconn 16 #定义链接数16 http_access deny OverConnLimit #拒绝达到16个的
(2)防止天涯盗链,转嫁给百度
acl tianya referer_regex -i tianya #referer含有tianya http_access deny tianya #拒绝 deny_info http://www.baidu.com/logs.gif tianya #拒绝信息回百度
(3)防止被人利用为HTTP代理,设置容许访问的IP地址
acl myip dst 192.168.1.1 http_access deny !myip
(4)防止百度机器人爬死服务器
acl AntiBaidu req_header User-Agent Baiduspider http_access deny AntiBaidu
(5)容许本地管理
acl Manager proto cache_object acl Localhost src 127.0.0.1 192.168.1.1 http_access allow Manger Localhost
提示:
更多acl定义及用法请见acl配置文件401行到603行
sed -n '401,603p' /usr/local/squid/etc/squid.conf.default
理解squid如何搜索ACL元素去匹配是很重要的。当ACL元素有多个值时,任何单个值能致使匹配。也就是说,squid在检查ACL元素值时使用OR逻辑。当squid找到第一个值匹配时,它中止搜索。这意味着把最可能匹配的值放在列表开头处,能减小延时。
-重点强调:
- squid在搜索ACL元素时使用的"或"逻辑。在acl里的任何单值均可以致使匹配。
- 而应用访问规则刚好相反。对http_access和其余规则设置,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默认的配置文件包含了一些重要的访问控制,最好不要改变或删除它们,除非你彻底理解他们的意义。在你第一次编辑squid.conf文件时,请看以下注释:
#INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
在该注释以后,以及"http_access deny all"以前插入你本身的规则,即MyNetwork的定义,以下是:
###一个典型的ACL设置,请你们用心理解。 #定义squid acl访问控制规则 acl Safe_ports port 80 acl SSL_ports port 443 acl lannet src 10.0.0.0/24 acl localhost src 127.0.0.1/255.255.255.255 acl webip dst 10.0.0.8 acl webdomain dstdomain .yunjisuan.com acl manager proto cache_object acl CONNECT method CONNECT #应用squid acl访问控制规则 http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports acl MyNetwork src all http_access allow MyNetwork http_access allow lannet http_access deny all #关于acl all src 0.0.0.0/0.0.0.0,在squid 3里,已经默认定义了all范围,因此不须要像squid 2.x那样手动定义all了
-若是不设置可见主机名,squid可能会报错没法运行。
- 设置主机名有以下好处:
(1)主机名出如今squid的错误消息里,这帮助用户验证潜在问题的源头。
(2)主机名出如今squid转发的cache单元的HTTP Via头里。当请求到达原始主机时,Via头包含了在传输过程当中涉及的代理列表。squid也使用Via头来检测转发环路。- 经过修改squid配置文件squid.conf中visible_hostname字段,可修改可见主机名:
#编辑squid.conf配置文件,添加可见主机名 [root@Squid-Server etc]# echo "visible_hostname www.yangwenbo.com" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf visible_hostname www.yangwenbo.com
设置cache_mgr指令做为对用户的帮助,它是一个email地址,假如故障发生,用户能写信给管理员来通知管理员,cache_mgr地址默认出如今squid的错误消息里,修改配置文件squid.conf中cache_mgr字段。
cache_mgr 17310658206@163.com
编辑squid.conf配置文件,添加邮件联系人信息 [root@Squid-Server etc]# echo "cache_mgr 17310658206@163.com" >> /usr/local/squid/etc/squid.conf [root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf cache_mgr 17310658206@163.com
根据以上的设置以后,squid.conf的内容以下:
[root@Squid-Server etc]# cat /usr/local/squid/etc/squid.conf acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl localnet src fc00::/7 # RFC 4193 local private network range acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https 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 http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localnet http_access allow localhost http_access deny all http_port 3128 coredump_dir /usr/local/squid3/var/cache/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 #如下是添加的修改内容 cache_effective_user squid #程序运行帐户 cache_effective_group squid #程序运行帐户组 cache_store_log /usr/local/squid/var/logs/store.log #store日志 cache_log /usr/local/squid/var/logs/cache.log #cache日志 cache_dir ufs /usr/local/squid/var/cache 100 16 256 #cache缓存 visible_hostname www.yangwenbo.com #可见主机名 cache_mgr 17310658206@163.com #邮件联系人
在运行squid前,须要了解squid主程序命令行选项。执行以下命令能够得到系统帮助:
[root@Squid-Server etc]# /usr/local/squid/sbin/squid -h Usage: squid [-cdhvzCDFNRVYX] [-s | -l facility] [-f config-file] [-[au] port] [-k signal] -a port Specify HTTP port number (default: 3128). -d level Write debugging to stderr also. -f file Use given config-file instead of #指定配置文件启动;重要 /usr/local/squid3/etc/squid.conf -h Print help message. -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse #控制服务运行状态;重要 Parse configuration file, then send signal to running copy (except -k parse) and exit. -s | -l facility Enable logging to syslog. -u port Specify ICP port number (default: 3130), disable with 0. -v Print version. -z Create swap directories #初始化缓存;重要 -C Do not catch fatal signals. -D Disable initial DNS tests. #禁止DNS解析;重要 -F Dont serve any requests until store is rebuilt. -N No daemon mode. #不启用后台模式 -R Do not set REUSEADDR on port. -S Double-check swap during rebuild. -X Force full debugging. #强制debug模式 -Y Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.
/usr/local/squid/sbin/squid -k parse 检查语法的命令
[root@Squid-Server etc]# /usr/local/squid/sbin/squid -k parse #检查语法 #以上省略。。。 2019/06/20 17:58:10| Processing: cache_effective_user squid 2019/06/20 17:58:10| Processing: cache_effective_group squid 2019/06/20 17:58:10| Processing: cache_store_log /usr/local/squid/var/logs/store.log 2019/06/20 17:58:10| Processing: cache_log /usr/local/squid/var/logs/cache.log 2019/06/20 17:58:10| Processing: cache_dir ufs /usr/local/squid/var/cache 100 16 256 2019/06/20 17:58:10| Processing: visible_hostname www.yangwenbo.com 2019/06/20 17:58:10| Processing: cache_mgr 17310658206@163.com WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log /usr/local/squid/var/logs/cache.log: Permission denied messages will be sent to 'stderr'. #出现错误,权限拒绝
[root@Squid-Server etc]# ll -d /usr/local/squid/var/logs #查看目录权限 drwxr-xr-x 2 root root 6 6月 20 16:10 /usr/local/squid/var/logs #没有受权程序用户访问 [root@Squid-Server etc]# chown -R squid /usr/local/squid/var/logs #递归受权属主为squid [root@Squid-Server etc]# ll -d /usr/local/squid/var/logs drwxr-xr-x 2 squid root 6 6月 20 16:10 /usr/local/squid/var/logs
[root@Squid-Server etc]# /usr/local/squid/sbin/squid -k parse #再次检查语法 #以上省略。。。 2019/06/20 17:58:10| Processing: cache_effective_user squid 2019/06/20 17:58:10| Processing: cache_effective_group squid 2019/06/20 17:58:10| Processing: cache_store_log /usr/local/squid/var/logs/store.log 2019/06/20 17:58:10| Processing: cache_log /usr/local/squid/var/logs/cache.log 2019/06/20 17:58:10| Processing: cache_dir ufs /usr/local/squid/var/cache 100 16 256 2019/06/20 17:58:10| Processing: visible_hostname www.yangwenbo.com 2019/06/20 17:58:10| Processing: cache_mgr 17310658206@163.com
在运行squid以前,或者增长了新的cache_dir,你必须初始化cache,命令为:squid -z
[root@Squid-Server etc]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ [root@Squid-Server etc]# ln -s /usr/local/squid/bin/* /usr/local/bin/ [root@Squid-Server etc]# which squid /usr/local/sbin/squid
[root@Squid-Server etc]# squid -z #初始化缓存命令 [root@Squid-Server etc]# 2019/06/20 18:57:18 kid1| Set Current Directory to /usr/local/squid3/var/cache/squid 2019/06/20 18:57:18 kid1| Creating missing swap directories 2019/06/20 18:57:18 kid1| /usr/local/squid/var/cache exists FATAL: Failed to make swap directory /usr/local/squid/var/cache/00: (13) Permission denied #报错,权限拒绝
[root@Squid-Server etc]# ll -d /usr/local/squid/var/ drwxr-xr-x 5 root root 42 6月 20 16:10 /usr/local/squid/var/ #原来是目录对于程序用户没有权限 [root@Squid-Server etc]# chown -R squid /usr/local/squid/var/ #受权程序用户squid [root@Squid-Server etc]# ll -d /usr/local/squid/var/ drwxr-xr-x 5 squid root 42 6月 20 16:10 /usr/local/squid/var/
[root@Squid-Server etc]# squid -z #再次初始化cache [root@Squid-Server etc]# 2019/06/20 18:59:43 kid1| Set Current Directory to /usr/local/squid3/var/cache/squid 2019/06/20 18:59:43 kid1| Creating missing swap directories 2019/06/20 18:59:43 kid1| /usr/local/squid/var/cache exists 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/00 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/01 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/02 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/03 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/04 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/05 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/06 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/07 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/08 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/09 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0A 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0B 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0C 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0D 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0E 2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0F
[root@Squid-Server etc]# yum -y install tree telnet dos2unix [root@Squid-Server etc]# rpm -qa tree telnet dos2unix telnet-0.17-64.el7.x86_64 tree-1.6.0-10.el7.x86_64 dos2unix-6.0.3-7.el7.x86_64
#查看缓存目录 [root@Squid-Server etc]# tree /usr/local/squid/var/cache/
初始化cache目录后,就能够在终端窗口里运行squid,将日志记录到标准日子里,就能够轻易的定位任何错误或问题,而且确认squid是否成功启动.
[root@Squid-Server etc]# squid -N -d1 #以debug调试模式在前台启动squid 2019/06/20 19:10:42| Set Current Directory to /usr/local/squid3/var/cache/squid 2019/06/20 19:10:42| Starting Squid Cache version 3.5.26 for x86_64-pc-linux-gnu... 2019/06/20 19:10:42| Service Name: squid 2019/06/20 19:10:42| Process ID 7021 2019/06/20 19:10:42| Process Roles: master worker 2019/06/20 19:10:42| With 1024 file descriptors available 2019/06/20 19:10:42| Initializing IP Cache... 2019/06/20 19:10:42| DNS Socket created at [::], FD 8 2019/06/20 19:10:42| DNS Socket created at 0.0.0.0, FD 9 2019/06/20 19:10:42| Adding domain localdomain from /etc/resolv.conf 2019/06/20 19:10:42| Adding nameserver 192.168.200.254 from /etc/resolv.conf 2019/06/20 19:10:42| Logfile: opening log daemon:/usr/local/squid3/var/logs/access.log 2019/06/20 19:10:42| Logfile Daemon: opening log /usr/local/squid3/var/logs/access.log 2019/06/20 19:10:42| Unlinkd pipe opened on FD 15 2019/06/20 19:10:42| Logfile: opening log /usr/local/squid/var/logs/store.log 2019/06/20 19:10:42| WARNING: log name now starts with a module name. Use 'stdio:/usr/local/squid/var/logs/store.log' 2019/06/20 19:10:42| Swap maxSize 102400 + 262144 KB, estimated 28041 objects 2019/06/20 19:10:42| Target number of buckets: 1402 2019/06/20 19:10:42| Using 8192 Store buckets 2019/06/20 19:10:42| Max Mem size: 262144 KB 2019/06/20 19:10:42| Max Swap size: 102400 KB 2019/06/20 19:10:42| Rebuilding storage in /usr/local/squid/var/cache (no log) 2019/06/20 19:10:42| Using Least Load store dir selection 2019/06/20 19:10:42| Set Current Directory to /usr/local/squid3/var/cache/squid 2019/06/20 19:10:42| Finished loading MIME types and icons. 2019/06/20 19:10:42| HTCP Disabled. 2019/06/20 19:10:42| Pinger socket opened on FD 20 2019/06/20 19:10:42| Squid plugin modules loaded: 0 2019/06/20 19:10:42| Adaptation support is off. 2019/06/20 19:10:42| Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 18 flags=9 2019/06/20 19:10:42| Done scanning /usr/local/squid/var/cache dir (0 entries) 2019/06/20 19:10:42| Finished rebuilding storage from disk. 2019/06/20 19:10:42| 0 Entries scanned 2019/06/20 19:10:42| 0 Invalid entries. 2019/06/20 19:10:42| 0 With invalid flags. 2019/06/20 19:10:42| 0 Objects loaded. 2019/06/20 19:10:42| 0 Objects expired. 2019/06/20 19:10:42| 0 Objects cancelled. 2019/06/20 19:10:42| 0 Duplicate URLs purged. 2019/06/20 19:10:42| 0 Swapfile clashes avoided. 2019/06/20 19:10:42| Took 0.07 seconds ( 0.00 objects/sec). 2019/06/20 19:10:42| Beginning Validation Procedure 2019/06/20 19:10:42| Completed Validation Procedure 2019/06/20 19:10:42| Validated 0 Entries 2019/06/20 19:10:42| store_swap_size = 0.00 KB 2019/06/20 19:10:43| storeLateRelease: released 0 objects
#注意:此时命令行没法再继续输入命令了,若是要查看窗口能够单开一个窗口进行查看 [root@Squid-Server ~]# netstat -antup | grep squid tcp6 0 0 :::3128 :::* LISTEN 7009/squid udp 0 0 0.0.0.0:53138 0.0.0.0:* 7009/squid udp6 0 0 ::1:7714 ::1:16543 ESTABLISHED 7009/squid udp6 0 0 :::28577 :::* 7009/squid #备注:3128为服务端口
一旦启动成功,就可用一些HTTP请求来测试squid;你的浏览器使用squid做为代理,而后打开某个web页面。假如squid工做正常,正常载入就像没用过squid同样。
[root@Squid-Server ~]# tail -100f /usr/local/squid/var/logs/access.log 1561103380.651 23497 192.168.200.1 TAG_NONE/503 0 CONNECT accounts.google.com:443 - HIER_NONE/- - 1561103380.656 21139 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.656 23005 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.656 23435 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.656 23193 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.656 23004 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.730 21005 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103380.955 21009 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103382.145 21008 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- - 1561103396.560 34619 192.168.200.1 TCP_TUNNEL/200 186 CONNECT www.baidu.com:443 - HIER_DIRECT/180.97.33.107 - #记录在案
- 到这里位置,咱们就是想了squid的普通(传统)代理模式
- 默认状况下,squid是普通代理模式
#正常状况下你想将squid之后台进程运行(不出如今终端窗口里)。最容易的方法是简单执行以下命令: [root@Squid-Server ~]# /usr/local/sbin/squid -D 2019/06/21 16:17:45| WARNING: -D command-line option is obsolete. [root@Squid-Server ~]# netstat -antup | grep 3128 tcp6 0 0 :::3128 :::* LISTEN 67859/(squid-1) tcp6 0 0 192.168.200.13:3128 192.168.200.1:53311 ESTABLISHED 67859/(squid-1) tcp6 0 0 192.168.200.13:3128 192.168.200.1:53299 TIME_WAIT - tcp6 0 0 192.168.200.13:3128 192.168.200.1:53313 ESTABLISHED 67859/(squid-1) tcp6 0 0 192.168.200.13:3128 192.168.200.1:53308 ESTABLISHED 67859/(squid-1) tcp6 0 0 192.168.200.13:3128 192.168.200.1:53307 ESTABLISHED 67859/(squid-1) tcp6 0 0 192.168.200.13:3128 192.168.200.1:53302 ESTABLISHED 67859/(squid-1) #-D:跳过DNS初始化检测
特别说明:
-s 选项致使squid将重要的状态和警告信息写到syslogd,一样的消息被写进cache.log文件,忽略-s选项也是安全的。注意日志文件cache.log,不管squid以什么方式运行,cache.log总会记录squid的日志信息,有时候squid服务意外终止,经过这个文件也能查看到很重要的信息
一般squid在每次服务器重启后须要自动启动,有以下两种方法能够实现squid的自动启动:
最容易的方法是修改
/etc/rc.local
脚本,在每次系统启动时以root运行。使用该脚原本启动squid很是容易,增长以下行到/etc/rc.lcoal
里。
[root@Squid-Server ~]# echo "#startup squid by Mr.yang at 2019/6/21" >> /etc/rc.local [root@Squid-Server ~]# echo "/usr/local/sbin/squid -D" >> /etc/rc.local [root@Squid-Server ~]# tail -2 /etc/rc.local #startup squid by Mr.yang at 2019/6/21 /usr/local/sbin/squid -D
- 固然你的安装位置可能不一样,还有你可能要使用其余命令行选项。不要在这里使用-N选项(会打印不少调试日志,这在生产环境中检查日志是很是痛苦的)。
- 若是没有使用cache_effective_user指令设置squid用户,你能够尝试使用su来让squid以非root用户运行:
/usr/bin/su -nobody -c '/usr/local/squid/sbin/squid -s' 这样也是能够的。- 可是设置cache_effective_user为root用户运行是绝对不容许的。
(1) 编写squid启动脚本
[root@Squid-Server ~]# cd /etc/init.d/ [root@Squid-Server init.d]# vim squid [root@Squid-Server init.d]# cat squid #!/bin/sh # chkconfig:345 88 14 # description:squid Daemon case "$1" in start) /usr/local/squid/sbin/squid -D ;; stop) /usr/local/squid/sbin/squid -k shutdown ;; restart) /usr/local/squid/sbin/squid -k reconfigure ;; parse) /usr/local/squid/sbin/squid -k parse ;; check) /usr/local/squid/sbin/squid -k check ;; *) echo "Usage:$0 start|stop|restart|check|parse" ;; esac
(2) 添加squid开机自动启动服务
[root@Squid-Server init.d]# chmod +x /etc/init.d/squid [root@Squid-Server init.d]# ll -d squid -rwxr-xr-x 1 root root 420 6月 21 16:30 squid [root@Squid-Server init.d]# chkconfig --add squid
#查看squid服务是否已经成功加上 [root@Squid-Server init.d]# chkconfig --list squid 注:该输出结果只显示 SysV 服务,并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。 查看在具体 target 启用的服务请执行 'systemctl list-dependencies [target]'。 squid 0:关 1:关 2:关 3:开 4:开 5:开 6:关
启动squid服务方法有两种,一种是直接运行squid程序,另一种是经过服务启动squid
#直接运行squid程序 [root@Squid-Server ~]# /usr/local/sbin/squid -D #经过服务启动squid [root@Squid-Server ~]# /etc/init.d/squid start #启动完成后,记得检查squid进程启动状况 [root@Squid-Server ~]# ps -ef | grep squid | grep -v grep
#直接关闭squid程序 [root@Squid-Server ~]# /usr/local/sbin/squid -k shutdown #经过服务中止squid [root@Squid-Server ~]# /etc/init.d/squid stop
- 加入squid的访问日志天天有上G,那么咱们须要天天对squid的日志进行回滚,回滚的方法是以下:
/usr/lcoal/squid/sbin/squid -k rotate
- 一旦执行squid日志回滚,这个命令会把
access.log
store.log
cache.log
都回滚
[root@Squid-Server ~]# /usr/local/squid/sbin/squid -k rotate #每执行一次回滚,就会产生一个新的回滚日志,可是最多的回滚数为squid.conf中的logfile_rotate参数,默认是10个,即扩展名0-9,而且包含一个最新的日志文件(不带下标) [root@Squid-Server ~]# tree /usr/local/squid/var/logs/ /usr/local/squid/var/logs/ ├── access.log ├── cache.log └── store.log 0 directories, 3 files
- 日志回滚主要避免单个日志文件过大致使squid崩溃的问题,有些较老的系统版本文件大小有2GB限制,因此须要按期回滚一次,而且还能够节省磁盘空间。
- 除非你在squid.conf里禁止,squid会写大量的日志文件。你必须周期性的滚动日志文件,以阻止他们变得太大。squid将大量的重要信息写入日志,假如写不进去了,squid会发生错误并退出。为了合理控制磁盘空间消耗,在cron里使用以下命令:
squid -k rotate
#例如:以下任务接口在天天的早上0点滚动日志: [root@Squid-Server ~]# crontab -l 0 0 * * * /bin/sh /root/rotate_squid.sh > /dev/null 2>&1 [root@Squid-Server ~]# cat rotate_squid.sh #!/bin/bash #cat /root/rotate_squid.sh cd /usr/local/squid/var/logs/ [ -f access.log ] && mv access.log access_$(date +%F).log [ -f store.log ] && mv store.log store_$(date +%F).log [ -f cache.log ] && mv cache.log cache_$(date +%F).log /usr/local/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限制,或者编写脚本用于将日志文件移动到其余位置上。
squid有一个cachemgr.cgi的程序,能够Web来显示内容,这个对于调整squid的参数非常方便。能够平时咱们安装完squid后其实就有这个程序了。咱们只要在Apache中配置如下便可。
[root@Squid-Server ~]# yum -y install httpd [root@Squid-Server ~]# which httpd /usr/sbin/httpd
[root@Squid-Server ~]# find /usr/local/squid/ -name "cachemgr.cgi" /usr/local/squid/libexec/cachemgr.cgi
[root@Squid-Server ~]# cp -a /usr/local/squid/libexec/cachemgr.cgi /var/www/cgi-bin/
[root@Squid-Server ~]# sed -n '42p' /etc/httpd/conf/httpd.conf Listen 80 [root@Squid-Server ~]# sed -i '42 s#80#8080#g' /etc/httpd/conf/httpd.conf [root@Squid-Server ~]# sed -n '42p' /etc/httpd/conf/httpd.conf Listen 8080
[root@Squid-Server ~]# systemctl start httpd [root@Squid-Server ~]# netstat -antup | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 68176/httpd