内容简介:最常用的反向代理软件是Nginx,并且Nginx也能正向代理HTTP请求,然而,原生Nginx不支持正向代理HTTPS请求。GitHub上有一个Nginx模块:多个squid服务可以通过icp协议相互沟通,形成树形层次关系(父代理、兄弟代理、子代理),构建代理服务集群。但是,下面只会介绍普通的配置方式。squid的配置选项很多,分为13类:
目录
正向代理的工作流程如下:
在客户端看来,正向代理(也就是常说的代理)是它的“代言人”。在使用代理的时候,需要客户端进行配置。
反向代理的工作流程如下:
在客户端看来,反向代理就是它要访问的目标服务,但是本质上,反向代理会将请求转发给内部的服务来处理。
HTTP协议中,常用的请求方法有GET、POST、PUT、DELETE、HEAD等。还有一些不常用的请求方法,比如:CONNECT。
CONNECT的作用就是把服务器作为代理,帮助客户端去访问目标服务。其工作流程如下:
- 客户端与代理服务之间建立一条TCP连接
- 客户端向代理服务发送一个CONNECT请求,这一步可能涉及到用户认证,如果认证不通过,代理服务会返回407 Unauthorized;如果认证通过,代理服务会与目标服务之间建立一条TCP连接,并返回200 Connection Established
- 此时,TCP通道就已经建立好了
- 代理服务把从客户端收到的任意数据包原封不动的转发到上一步建立好的TCP通道,包括TLS握手相关的数据包(TLS协议是TCP协议的上层协议);同时,也会将从TCP通道收到的任意数据包原封不动的转发给客户端
最常用的反向代理软件是Nginx,并且Nginx也能正向代理HTTP请求,然而,原生Nginx不支持正向代理HTTPS请求。GitHub上有一个Nginx模块: ngx_http_proxy_connect_module ,使得Nginx支持CONNECT代理,但是博主在使用的时候,在错误日志中,发现大量与建立TCP通道相关的超时,并且Nginx的DNS解析貌似不支持CNAME。下面将介绍如何使用squid做正向代理(当然squid也支持反向代理、透明代理)。
多个squid服务可以通过icp协议相互沟通,形成树形层次关系(父代理、兄弟代理、子代理),构建代理服务集群。但是,下面只会介绍普通的配置方式。
squid的配置选项很多,分为13类:
- NETWORK OPTIONS(有关的网络选项)
- OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM(作用于邻居选择算法的有关选项)
- OPTIONS WHICH AFFECT THE CACHE SIZE(定义cache大小的有关选项)
- LOGFILE PATHNAMES AND CACHE DIRECTORIES(定义日志文件的路径及cache的目录)
- OPTIONS FOR EXTERNAL SUPPORT PROGRAMS(外部支持程序选项)
- OPTIONS FOR TUNING THE CACHE(调整cache的选项)
- TIMEOUTS(超时)
- ACCESS CONTROLS(访问控制)
- ADMINISTRATIVE PARAMETERS(管理参数)
- OPTIONS FOR THE CACHE REGISTRATION SERVICE(cache注册服务选项)
- HTTPD-ACCELERATOR OPTIONS(HTTPD加速选项)
- MISCELLANEOUS(杂项)
- DELAY POOL PARAMETERS(延时池参数)
下面介绍比较常用的选项:
1,http_port
squid监听http请求的地址,默认是3128
2,cache_mem
这部分内存用来存储以下对象:
- In-Transit Objects(正在传输的对象)
- Hot Objects(热对象,即用户经常访问的对象)
- Negative-Cached Objects(消极存储对象,即链接错误、404 Not Found之类的错误信息)
3,cache_dir <scheme> <directory-name> <size> <level-1> <level-2>
用于指定用来缓存对象的 交换空间 的目录结构及大小。其中:
- scheme用于指定存储机制,可以是:ufs、aufs、coss、diskd、null
- directory-name用于指定交换空间的顶级目录
- size用于指定交换空间的大小,单位是MBytes
- 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可以是:
- src:用来指定源地址。比如,acl aclname addr1-addr2/netmask
- dst:用来指定目的地址。比如,acl aclname addr/netmask
- srcdomain:用来指定客户端所属的域。比如,acl aclname srcdomain foo.com...squid会根据客户端ip反向查询DNS
- dstdomain:用来指定被代理服务器所属的域。比如,acl aclname dstdomain foo.com...由请求的URL决定
- time:用来指定访问时间
- port:用来指定端口
- protocol:用来指定协议
- method:用来指定请求方法
- proxy_auth:通过外部程序进行用户认证
...
36,http_access
根据访问控制列表决定允许或禁止某类用户的访问。
当某次访问不匹配任何条目时,则应用最后一个条目的“非”。
37,half_closed_clients
该值为on的时候,squid会维护处于半关闭状态的连接,直到连接上出现读写错误;否则,一旦连接上返回“no more data to read”,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,其他需要注意的配置
- 设置用于用户认证的子进程的数量。比如,auth_param basic children 5 startup=5 idle=1。在比较繁忙的网络中应该适当调大该值
- 设置一次认证的有效期。比如,auth_param basic credentialsttl 2 hours
- 设置用户登陆时,向用户显示的域。比如,auth_param basic realm Squid proxy-caching web server
# 网络相关的配置 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 # !!!各种超时相关的配置!!! 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
以上所述就是小编给大家介绍的《HTTP(S)正向代理及squid简介》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。