HTTP(S)正向代理及squid简介

栏目: 后端 · 发布时间: 5年前

内容简介:最常用的反向代理软件是Nginx,并且Nginx也能正向代理HTTP请求,然而,原生Nginx不支持正向代理HTTPS请求。GitHub上有一个Nginx模块:多个squid服务可以通过icp协议相互沟通,形成树形层次关系(父代理、兄弟代理、子代理),构建代理服务集群。但是,下面只会介绍普通的配置方式。squid的配置选项很多,分为13类:

目录

正向代理的工作流程如下:

HTTP(S)正向代理及squid简介

在客户端看来,正向代理(也就是常说的代理)是它的“代言人”。在使用代理的时候,需要客户端进行配置。

反向代理的工作流程如下:

HTTP(S)正向代理及squid简介

在客户端看来,反向代理就是它要访问的目标服务,但是本质上,反向代理会将请求转发给内部的服务来处理。

HTTP协议中,常用的请求方法有GET、POST、PUT、DELETE、HEAD等。还有一些不常用的请求方法,比如:CONNECT。

CONNECT的作用就是把服务器作为代理,帮助客户端去访问目标服务。其工作流程如下:

HTTP(S)正向代理及squid简介
  • 客户端与代理服务之间建立一条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简介》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法设计与分析

算法设计与分析

张德富 / 2009-8 / 36.00元

《算法设计与分析》主要取材于算法设计与分析领域的经典内容,并介绍了算法设计的发展趋势。内容主要包括非常经典的算法设计技术,例如递归与分治、动态规划、贪心、回溯、分支限界、图算法,也包括了一些高级的算法设计主题,例如网络流和匹配、启发式搜索、线性规划、数论以及计算几何。在算法分析方面,介绍了概率分析以及最新的分摊分析和实验分析方法。在算法的理论方面,介绍了问题的下界、算法的正确性证明以及NP完全理论......一起来看看 《算法设计与分析》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具