Apache服务之缓存和代理


纸上得来终觉浅,绝知此事要躬行。

Apache服务之代理和缓存


1. 代理

代理服务器的主要作用就是为了那些不能直接连接到Internet或目标网络的用户提供一个转发服务,它就像是一个中转站,转发用户的请求到目标网络并取回用户所需要的信息,在回馈给用户。

代理服务器的优势

  • (1) 隐匿内部网络,节约 IP 地址
    • 通过代理对内部网络的主机,全部进行映射,进行数据包的转发
  • (2) 提高访问速度,节约网络带宽
    • 对于经常访问却不经常改动的网站,可以设置缓存,提高访问速度
  • (3) 监控和过滤
    • 通过日志记录和查看用户访问的清新请求,过滤掉某些不希望访问的网站和内容
  • (4) 支持多种协议
    • HTTPHTTPSFTP

Apache2.0开始,mod_proxy模块不但被重写了,而且还分割为4个不同的模块:mod_proxymod_proxy_httpmod_proxy_ftpmod_proxy_connect,并且能够使用HTTP规范比较新的特征。而到了Apache2.2以后则更进一步加入了mod_proxy_ajpmod_proxy_balancer者两个模块。所有需要了解mod_proxy模块的最新动态,请查看官网文档。

  • mod_proxy模块:基础模块
  • mod_proxy_ajp模块:提供Apache JServ Protocol Version 1.3的支持
  • mod_proxy_balancer模块:为了Apache提供负载均衡支持,支持HTTPHTTPSFTP协议
  • mod_proxy_connect模块:提供对处理HTTP CONNECT方法的支持,这种支持主要应用于处理通过代理服务器的SSL连接请求
  • mod_proxy_ftp模块:提供对FTP功能的支持,但是只支持GET方式,即支持下载不支持上传
  • mod_proxy_http模块:提供代理HTTP请求的功能

正向代理

Apache服务之代理和缓存

反向代理

Apache服务之代理和缓存


1.1 mod_proxy模块

mod_proxy模块Apache实现代理或网关的关键模块,其他的5个模块都需要它的支持才能运行,mod_proxy_httpmod_proxy_ftpmod_proxy_connectmod_proxy_ajpmod_proxy_balancer

启用 mod_proxy 模块

  • 需要说明的是Apache的代理模块并不提供缓冲支持,如果你需要缓冲支持,还需要使用mod_cache模块。同样,如果要使用SSL的代理支持,还需要使用mod_ssl的代理支持。
# httpd.conf配置文件加载模块
LoadModule proxy_module modules/mod_proxy.so

mod_proxy 模块的指令

  • ProxyRequests指令
    • 设置启用或禁止Apache作为正向代理服务器的功能
    • 但如果将它设置为off也不会禁用ProxyPass指令的功能
ProxyRequests on

<Proxy><ProxyMatch>容器

  • <Proxy>用来存放作用于代理服务器指令,容器中可以控制用户的访问权限
  • <ProxyMatch>容器则多了支持正则表达式的功能

    Order Deny,Allow
    Deny from all
    Allow from www.wsescape.com

AllowCONNECT指令

  • 用于指定以CONNECT方式连接时的端口号,使用时需要先加载mod_proxy_connect模块
  • 默认状况下,Apache的代理会使用HTTPSSNEWS进行连接,而使用了AllowCONNECT指令后可以指定一个端口进行连接
AllowCONNECT 8080 8081

NoProxy指令

  • 只在局域网内使用,可以让用户不适用Apache的代理服务而直接连接到主机或者网络上
# 可以使用主机名、网站名、域名、网段
NoProxy 172.16.3.1/24

# Apache会进行DNS查找消耗时间和性能
NoProxy .wsescpae.com

ProxyBlock指令

  • 用于屏蔽网站
  • 可以设定主机、域、IP 地址设置是语句的列表来进行屏蔽,支持HTTPHTTPSFTP
ProxyBlock wsescape

ProxyDomain指令

  • 只能作用于局域网,用来指定一个默认的域名,当用户使用一个没有域名的访问请求时,代理模块会自动加上一个默认的域名
# 用户在浏览器输入www,代理服务器会自动补上.wsescape.com,转到正确的地址上
ProxyDomain .wsescape.com

ProxyIOBufferSize指令

  • 用于调整内部缓冲区的大小
  • 有效值必须小于或者等于8192,建议使用mod_cache模块来作缓存
ProxyIOBufferSize 8192

ProxyMaxForwards指令

  • 主要是为了防止DoS攻击,用它指定允许转发请求的最大代理数目,以防止连接数太多导致崩溃
ProxyMaxForwards 1024

ProxyPass指令

  • 将一个远程服务器映射到本地服务器中,类似于镜像,但又不太一样
  • 它只是将用户对远程服务器的请求缓存到本地服务器中,使用户以更快的速度进行访问
# 如果http://wsescpae.com为本地服务器地址,则对http://wsescpae.com/apache/2.2/xxx.tar.gz的本地请求将会在内部转换为一个代理请求http://www.wsescpae.com/apache/2.2/xxx.tar.gz
ProxyPass /apache/2.2/ http://www.wsescpae.com

# 如果不想对某个子目录进行反向代理,可以使用!符号
ProxyPass /apache/2.2/docs !

Apache服务之代理和缓存

ProxyPassReverse指令

  • 用于重写HTTP重写向应应答中的LocationContent-LocationURI头里的URL
  • 以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题
ProxyPass /apache/2.2/ http://www.wsescpae.com
ProxyPassReverse /apache/2.2/ http://www.wsescpae.com
  • ProxyPassReverseCookieDomainProxyPassReverseCookiePath指令

    • ProxyPassReverseCookieDomain改写域名
    • ProxyPassReverseCookiePath改写cookie
  • ProxyRemoteProxyRemoteMatch指令

    • ProxyRemote定义了此代理的远程代理,可以是远程代理服务器支持的URL形式的名称
    • 也可以是远程代理服务器使用的部分URL或代表服务器可以接受所有请求的*
    • ProxyRemoteMatch在此基础上,支持了正则表达式匹配功能
ProxyRemote * http://www.proxy.org/
  • ProxyReceivBufferSize指令

    • 用于设置代理服务器的HTTPFTP连接的缓冲区域大小
    • 这个区域必须大于512或直接设置为0表示禁止使用系统缓冲大小
  • ProxyTimeout指令

    • 用于设置反向代理时请求连接超时时间
    • 如果网络比较慢,可以将这个时间设置的长一点
  • ProxyBadHeader指令

    • 用来设置mod_proxy如何处理不合法的应答头
  • ProxyPreserveHost指令

    • 用于将用户请求的HOST:行传递给被代理的服务器,而不是传递给ProxyPass中指定的主机名
  • ProxyVia指令

    • 用于控制代理服务器对Via:头的使用
    • 根据HTTP/1.1协议,代理服务器的出入连接中必须带有一个Via:头以说明服务器的身份或表示服务器软件的版本
    • 而通过Via:头管理员可以记录代理请求的流向,从而最大成都避免循环的产生
    • 有一下4中参数进行控制

Apache服务之代理和缓存


1.2 常见的代理

  • 正向代理服务器
    • ProxyRequests On开启正向代理服务
    • ProxyVia所有的连接请求和应答增加一个Via:
    • Proxy容器接受所有用户的连接
ProxyRequests On
ProxyVia on


    Order deny,allow
    Deny from all
    Allow from all

  • 反向代理服务器
  • ProxyRequests Off关闭正向代理功能
  • Proxy容器接受所有用户的连接
  • 最后使用ProxyPass功能来将http://www.wsescape.com映射到本地服务器的/wsescape目录中
  • 同时使用ProxyPassReverse改写http://www.wsescape.com的重定向应答到/wsescape
ProxyRequests Off


    Order deny,allow
    Allow from all


ProxyPass /wsescape http://www.wsescape.com
ProxyPassReverse /wsescape http://www.wsescape.com

2. 缓存

几乎每个大型的Web网站中都可以看到缓存技术的使用,可以有效的降低负载和提高响应速度。而这些站点使用的缓存技术无非两种,一种是基于磁盘的,另一种则时基于内存的。

Apache中缓存模块可以将本地服务器提供的Web连接进行缓存,同时也可以为正、反向代理服务器提供一个缓存空间,而这些内容会被以URL的方式进行缓存和索引。

Aapche中有三个缓存模块:

  • mod_cache模块:提供缓存的全局设置支持
  • mod_mem_cache模块:基于内存的缓存支持
  • mod_disk_cache模块:基于磁盘的缓存支持

2.1 mod_cache模块

mod_cache模块是在Apache2.x之后的版本中新提供的

  • CacheDefaultExpire
    • 设置缓存资源的有效时间,单位为秒,默认为3600,即一个小时
    • 一般来说,这个时间太短了,因此建议设置更长的时间,如 48 小时
CacheDefaultExpire 3600
  • CacheDisable
  • 用于设置指定目录或是所有以url-string开头的URL不进行缓存
CacheDisable /code/github
  • CacheEnable
  • 用于指定用何种缓存方式来缓存指定的目录或网址
  • mem参数:使用内存缓存指定内容
  • disk参数:使用磁盘缓存指定内容
  • fd参数:使用文件描述符缓存指定内容
CacheEnable mem /srv/svn
CacheEnable disk /srv/www/htdocs
CacheEnable fd /srv/www/img

CacheEnable disk http://www.wsescape.com
  • CacheMaxExpire

    • 缓存文件的最长有效时间,单位为秒,默认为86400,即24小时
  • CacheIgnoreHeaders

    • 不缓存指定的HTTP头部
  • CacheIgnoreCacheControl

    • 缓存所有没有在header中设置Cache-ControlPragmano-cache的资源
  • CacheIgnoreNoLastMod

    • 缓存所有没有在header中设置LastMod的资源
  • CacheIgnoreQueryString

    • 在缓存中忽略查询字符串
  • CacheLastModifiedFactor

    • 用来回应Last Modified资源从而计算出到期时间
  • CacheStoreNoStore

    • 可以使用onoff开关来控制
    • 设置为on,表示返回内容的头部信息Cache-Control:中包含no-sotre,则进行缓存
    • 设置为off,表示不进行缓存
  • CacheStorePrivate

    • 可以使用onoff开关来控制
    • 设置为on,表示返回内容的头部信息Cache-Control:中包含private,则进行缓存
    • 设置为off,表示不进行缓存

2.2 mod_mem_cache模块

内存读取速度比磁盘快很多倍

Apache中,我们可以使用mod_mem_cache模块来做基于内存的缓存管理,它需要配合mod_cache模块才能使用,你可以将它配合为两种不同的缓存模式。

  • 缓存打开的文件描述符
  • 在堆上缓存资源

Apache服务之代理和缓存

  • MCacheMaxObjectCount
    • 用于设置最大缓存对象的数量
    • 示例:MCacheMaxObjectCount 1000
  • MCacheMaxObjectSize
    • 设定允许缓存的最大文档大小,单位为Byte
    • 示例:MCacheMaxObjectSize 6400000
  • MCacheMinObjectSize
    • 设定允许缓存的最小文档大小,单位为Byte
    • 示例:MCacheMinObjectSize 10000
  • MCacheRemovalAlgorithm
    • 指定当需要从缓存中一处哪个文档时所使用的算法
    • LRU算法:最近最少使用的文档
    • GDSF算法:先计算命中率和文档大小并形成一个优先级,需要移除时,优先级最低的文档先移除缓存
  • MCacheSize
    • 用来设置缓存使用的最大内存量数量,单位为KB
    • 示例:MCacheSize 10240

2.3 mod_disk_cache模块

Apache中,我们可以使用mod_disk_cache模块来做基于磁盘的缓存管理,它需要配合mod_cache模块才能使用,你可以通过Apache服务器提供的htcacheclean程序来管理缓存,以将缓存保持在一个合适的水平上。

mod_disk_cache模块也是一个只能的缓存,当有请求时,只有在缓存没有找到的情况下才会在本地进行查找,而对缓存区内的文件,mod_disk_cache模块首先根据CacheRoot指令定义缓存文件存放在服务器磁盘上的具体位置,如:

CacheRoot /var/cache/Apache2/mod_disk_cache

当启用mod_disk_cache模块后,mod_disk_cache模块会在每一个连接请求生成一个22个字符的哈希值。该哈希值将包含请求连接的主机名、协议、端口、路径、CGI变量等信息,以确保每一个请求连接都会不一样。当然可以使用CacheDirLevels指定每级子目录名的字符数,默认为4,用CacheDirLength指令指定每个子目录名的字符数,默认是3

如果CacheDirLevels设置为1,则任意一层目录下的子目录数都不会超过64;如果为2,则为64x64,以此类推。CacheDirLength的设置与其类似,如果设置为2,则会建立4096个目录保存约100万个文件。需要说明的是,CacheDirLevelsCacheDirLength指令的最大值不可以超过20,否则会报错的。

CacheDirLevels 5
CacheDirLength 5

每个URL在缓存目录中至少会使用连个文件,一个是.data文件是按节缓存的,为链接的内容;而.header文件则包含了URL的元信息,例如何时失效等。

CacheMaxFileSizeCacheMinFileSize指令分别用来设置缓存文件的最大和最小体积,单位为Bytes

CacheMaxFileSize 64000
CacheMinFileSize 64

对于mod_disk_cache模块来说,虽然它也会自动删除缓存中的失效文件,但是并不是主动维护缓存区的去使用情况,只是根据用户设置的参数来决定失效时长。因此Apache提供了一个工具用来清理有mod_disk_cache模块生成的缓存,就是htcacheclean程序。

# 周期任务
crontab -e
0  23  *  *  6 htcacheclean -p /var/cache/Apache2/mod_disk_cache/ -l 50k

2.4 mod_file_cache的文件缓存支持

mod_file_cache模块提供了文件缓存的支持,可以将指定的页面进行缓存,从而提高用户访问速度。

使用MMapFile指令将index.html文件中的内容映射到内存中,当用户访问这个文件时,会从内存中读取并返回给用户,从而提高访问效率。也可以使用CacheFile指令来进行缓存,与MMapFile指令不同的是,CacheFile指令在Apache启动时记录打开你所指定的文件的文件描述符,并为之后这个文件的所有访问重复使用这个文件描述符。

MMapFile /srv/www/index.html

CacheFile /srv/www/index.html

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录