目录


正向代理和反向代理

正向代理的工作流程如下:
forward-proxy.png
在客户端看来,正向代理(也就是常说的代理)是它的“代言人”。在使用代理的时候,需要客户端进行配置。
反向代理的工作流程如下:
reverse-proxy.png
在客户端看来,反向代理就是它要访问的目标服务,但是本质上,反向代理会将请求转发给内部的服务来处理。


HTTP代理

HTTP协议中,常用的请求方法有GET、POST、PUT、DELETE、HEAD等。还有一些不常用的请求方法,比如:CONNECT。
CONNECT的作用就是把服务器作为代理,帮助客户端去访问目标服务。其工作流程如下:
proxy-connect.png


squid

最常用的反向代理软件是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可以是:


36,http_access
根据访问控制列表决定允许或禁止某类用户的访问。
当某次访问不匹配任何条目时,则应用最后一个条目的“非”
37,half_closed_clients
该值为on的时候,squid会维护处于半关闭状态的连接,直到连接上出现读写错误;否则,一旦连接上返回“no more data to read”,squid就会关闭连接
38,max_filedescriptors
设置进程最多能打开多少个文件描述符。默认值继承自当前的ulimit设置
39,max_open_disk_fds
为了避免IO出现瓶颈,当当前打开的磁盘文件总数超过该阈值时,squid不会读取文件缓存

用户认证

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

注意事项


参考文档