正向代理的工作流程如下:
在客户端看来,正向代理(也就是常说的代理)是它的“代言人”。在使用代理的时候,需要客户端进行配置。
反向代理的工作流程如下:
在客户端看来,反向代理就是它要访问的目标服务,但是本质上,反向代理会将请求转发给内部的服务来处理。
HTTP协议中,常用的请求方法有GET、POST、PUT、DELETE、HEAD等。还有一些不常用的请求方法,比如:CONNECT。
CONNECT的作用就是把服务器作为代理,帮助客户端去访问目标服务。其工作流程如下:
最常用的反向代理软件是Nginx,并且Nginx也能正向代理HTTP请求,然而,原生Nginx不支持正向代理HTTPS请求。GitHub上有一个Nginx模块:ngx_http_proxy_connect_module,使得Nginx支持CONNECT代理,但是博主在使用的时候,在错误日志中,发现大量与建立TCP通道相关的超时,并且Nginx的DNS解析貌似不支持CNAME。下面将介绍如何使用squid做正向代理(当然squid也支持反向代理、透明代理)。
多个squid服务可以通过icp协议相互沟通,形成树形层次关系(父代理、兄弟代理、子代理),构建代理服务集群。但是,下面只会介绍普通的配置方式。
squid的配置选项很多,分为13类:
下面介绍比较常用的选项:
1,http_port
squid监听http请求的地址,默认是3128
2,cache_mem
这部分内存用来存储以下对象:
3,cache_dir <scheme> <directory-name> <size> <level-1> <level-2>
用于指定用来缓存对象的交换空间的目录结构及大小。其中:
将对象保存到多个目录是为了避免单个目录下文件过多,导致系统性能下降。
可以通过多个cacache_dir指令,定义多个交换空间。
4,cache_swap_low [percent 0-100]、cache_swap_hight [percent 0-100]
当交换空间的使用率达到cache_swap_hight设置的阈值时,squid会按照设置的算法(默认是LRU)清理对象,直到使用率降到cache_swap_low所设定的阈值。
5,maximum_object_size
大小超过该阈值的对象不会被缓存
6,minimum_object_size
大小小于该阈值的对象不会被缓存
7,maximum_object_size_in_memory
当对象的大小超过该阈值时,不会被放到内存缓存(cache_mem)中
8,reply_body_max_size
当对象的大小达到该阈值,将不允许继续下载,会被立即删除,防止耗光交换空间
9,cache_access_log
用来记录来自客户端或邻居的请求日志
10,cache_store_log
用来记录哪些对象被写到了交换空间,以及哪些对象被从交换空间中清除了
11,cache_log
用来记录一般的日志信息
12,cache_swap_log
该日志中包含存储在交换空间中的对象的元数据(MetaData)。每个交换空间都会对应一个日志文件
13,pid_filename
用来指定保存squid的进程号的文件
14,debug_options
用来指定记录哪几个方面的日志,以及日志的详细程度。默认是:debug_options ALL,1,也就是对每个方面都做记录,详细程度为1(最低)
关于squid的日志格式,可以移步参考文档
15,request_body_max_size
用来指定HTTP请求体的最大大小
16,quick_abort_min(KB)、quick_abort_max(KB)、quick_abort_pct(percent)
当客户端中断请求时,squid会检查quick_abort的值,如果剩余的部分小于quick_abort_min所设定的阈值,那么squid会继续传输;如果剩余部分大于quick_abort_max所设定的阈值,那么squid会终止传输;如果已传输的比例大于quick_abort_pct所设定的阈值,那么squid会继续传输
16,negative_ttl
设置消极存储对象的生存时间。默认是0 seconds
17,positive_dns_ttl
设置成功的DNS查询结果的生存时间。默认是6 hours
18,negative_dns_ttl
设置失败的DNS查询结果的生存时间。默认是1 minutes
19,connect_timeout
squid等待到被代理服务器的连接完成的超时时间
20,read_timeout
如果在read_timeout所指定的时间内,squid没有从被代理服务收到任何数据,那么则终止客户端的请求
21,write_timeout
squid向被代理服务写数据的超时时间
22,request_timeout
用来设置squid在与客户端建立完连接之后,花多长时间等待HTTP请求头完成传输
23,server_idle_pconn_timeout
用来设置squid与被代理服务器之间的持久连接的最大空闲时间
24,client_idle_pconn_timeout
用来设置客户端与squid之间的持久连接的最大空闲时间
25, client_persistent_connections
用于开启客户端与squid之间的长连接支持
26,server_persistent_connections
用于开启squid与被代理服务之间的长连接支持
27,shutdown_lifetime
squid在收到SIGTERM或SIGHUP信号后,会进入到shutdow pending模式,等待所有的活跃连接关闭。在过了shutdown_lifetime所指定的时间之后,仍然活跃的连接会收到“超时”。默认是:30 seconds
28,dns_timeout
DNS查询的超时时间
29,dns_nameservers
用来指定一个DNS服务器的列表,强制squid使用列表中的DNS服务器,而不使用/etc/resolv.conf中配置的DNS服务器
30,cache_mgr
用来设置管理员邮箱地址
31,cache_effective_user、cache_effective_group
设置以哪个用户和组的身份运行squid
32,visible_hostname
设置返回给用户的出错信息中的主机名
33,unique_hostname
如果代理服务器是一个阵列,并且每台代理服务都指定了相同的visible_hostname,那么必须为它们指定不同的unique_hostname,以防“forwarding loops”(传输循环)
34,logfile_rotate
在使用squid -k rotate
截断squid的日志的时候,squid会对老日志进行备份,logfile_rotate用于指定保留的备份日志文件的个数,默认是0
35,acl
用来定义访问控制列表。
语法是:acl <ACL-NAME> <ACL-TYPE> <VALUE> ...
其中ACL-TYPE可以是:
squid本身不带任何认证程序。但是,它支持通过外部程序实现用户认证。下面将介绍ncsa用户认证的实现。ncsa是squid源码包自带的认证程序之一。
1,下载和安装
从官网下载squid的源码包,并解压
cd src/auth/basic/NCSA make && sudo make install
basic_ncsa_auth
默认被安装到了/usr/local/squid/libexec/
目录
2,用htpasswd生成密码文件
htpasswd -c -d -b /data1/squid/squid_passwd user password
(注意:squid要有密码文件的读权限)
3,配置只允许认证通过的用户访问
auth_param basic program /usr/local/squid/libexec/basic_ncsa_auth /data1/squid/squid_passwd acl authed_user proxy_auth REQUIRED http_access allow authed_user
4,其他需要注意的配置
# 网络相关的配置 http_port 3333 # 缓存相关的配置 cache_mem 4 GB cache_dir aufs /data1/squid/cache 20480 256 256 cache_swap_high 95 cache_swap_low 85 maximum_object_size 128 MB minimum_object_size 256 bytes maximum_object_size_in_memory 16 MB reply_body_max_size 256 MB # 日志相关的配置 cache_access_log /data1/squid/logs/cache.access.log cache_store_log /data1/squid/logs/cache.store.log cache_log /data1/squid/logs/cache.log cache_swap_log /data1/squid/logs/cache.swap.log pid_filename /data1/squid/logs/squid.pid debug_options ALL,1 logfile_rotate 5 # + log_fqdn已经被废弃了 # 用户访问控制相关的配置 request_body_max_size 100 MB quick_abort_min 8 KB quick_abort_max 16 KB quick_abort_pct 95 max_filedescriptors 512000 max_open_disk_fds 65535 # !!!各种超时相关的配置!!! negative_ttl 1 seconds positive_dns_ttl 30 seconds negative_dns_ttl 1 seconds dns_timeout 5 seconds connect_timeout 15 seconds read_timeout 30 seconds write_timeout 30 seconds request_timeout 10 seconds server_persistent_connections off # server_idle_pconn_timeout 60 seconds client_persistent_connections on client_idle_pconn_timeout 15 seconds shutdown_lifetime 30 seconds half_closed_clients off # !!!与外部支持程序相关的配置!!! # + dns_children已经废弃了 # + dns_nameservers none auth_param basic program /usr/local/squid/libexec/basic_ncsa_auth /data1/squid/squid_passwd auth_param basic children 15 startup=15 idle=5 auth_param basic credentialsttl 1 hours auth_param basic realm Used For FileService To Download Documents # 与管理相关的配置 # cache_mgr squid@domain # + cache_effective_user squid # + cache_effective_group squid visible_hostname squid-proxy unique_hostname squid-105 acl authed_user proxy_auth REQUIRED http_access allow all
squid -z
初始化交换空间squid -k rotate
截断squid的日志