纸上得来终觉浅,绝知此事要躬行。
1. 代理
代理服务器的主要作用就是为了那些不能直接连接到Internet或目标网络的用户提供一个转发服务,它就像是一个中转站,转发用户的请求到目标网络并取回用户所需要的信息,在回馈给用户。
代理服务器的优势
- (1) 隐匿内部网络,节约 IP 地址
- 通过代理对内部网络的主机,全部进行映射,进行数据包的转发
- (2) 提高访问速度,节约网络带宽
- 对于经常访问却不经常改动的网站,可以设置缓存,提高访问速度
- (3) 监控和过滤
- 通过日志记录和查看用户访问的清新请求,过滤掉某些不希望访问的网站和内容
- (4) 支持多种协议
- HTTP、HTTPS、FTP
从Apache2.0开始,mod_proxy模块不但被重写了,而且还分割为4个不同的模块:mod_proxy、mod_proxy_http、mod_proxy_ftp、mod_proxy_connect,并且能够使用HTTP规范比较新的特征。而到了Apache2.2以后则更进一步加入了mod_proxy_ajp、mod_proxy_balancer者两个模块。所有需要了解mod_proxy模块的最新动态,请查看官网文档。
- mod_proxy模块:基础模块
- mod_proxy_ajp模块:提供Apache JServ Protocol Version 1.3的支持
- mod_proxy_balancer模块:为了Apache提供负载均衡支持,支持HTTP、HTTPS、FTP协议
- mod_proxy_connect模块:提供对处理HTTP CONNECT方法的支持,这种支持主要应用于处理通过代理服务器的SSL连接请求
- mod_proxy_ftp模块:提供对FTP功能的支持,但是只支持GET方式,即支持下载不支持上传
- mod_proxy_http模块:提供代理HTTP请求的功能
正向代理
反向代理
1.1 mod_proxy模块
mod_proxy模块是Apache实现代理或网关的关键模块,其他的5个模块都需要它的支持才能运行,mod_proxy_http、mod_proxy_ftp、mod_proxy_connect、mod_proxy_ajp、mod_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的代理会使用HTTPS和SNEWS进行连接,而使用了AllowCONNECT指令后可以指定一个端口进行连接
AllowCONNECT 8080 8081
NoProxy指令
- 只在局域网内使用,可以让用户不适用Apache的代理服务而直接连接到主机或者网络上
# 可以使用主机名、网站名、域名、网段 NoProxy 172.16.3.1/24 # Apache会进行DNS查找消耗时间和性能 NoProxy .wsescpae.com
ProxyBlock指令
- 用于屏蔽网站
- 可以设定主机、域、IP 地址设置是语句的列表来进行屏蔽,支持HTTP、HTTPS、FTP
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 !
ProxyPassReverse指令
- 用于重写HTTP重写向应应答中的Location、Content-Location、URI头里的URL
- 以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题
ProxyPass /apache/2.2/ http://www.wsescpae.com ProxyPassReverse /apache/2.2/ http://www.wsescpae.com
- ProxyPassReverseCookieDomain和ProxyPassReverseCookiePath指令
- ProxyPassReverseCookieDomain改写域名
- ProxyPassReverseCookiePath改写cookie
- ProxyRemote和ProxyRemoteMatch指令
- ProxyRemote定义了此代理的远程代理,可以是远程代理服务器支持的URL形式的名称
- 也可以是远程代理服务器使用的部分URL或代表服务器可以接受所有请求的*
- ProxyRemoteMatch在此基础上,支持了正则表达式匹配功能
ProxyRemote * http://www.proxy.org/
- ProxyReceivBufferSize指令
- 用于设置代理服务器的HTTP或FTP连接的缓冲区域大小
- 这个区域必须大于512或直接设置为0表示禁止使用系统缓冲大小
- ProxyTimeout指令
- 用于设置反向代理时请求连接超时时间
- 如果网络比较慢,可以将这个时间设置的长一点
- ProxyBadHeader指令
- 用来设置mod_proxy如何处理不合法的应答头
- ProxyPreserveHost指令
- 用于将用户请求的HOST:行传递给被代理的服务器,而不是传递给ProxyPass中指定的主机名
- ProxyVia指令
- 用于控制代理服务器对Via:头的使用
- 根据HTTP/1.1协议,代理服务器的出入连接中必须带有一个Via:头以说明服务器的身份或表示服务器软件的版本
- 而通过Via:头管理员可以记录代理请求的流向,从而最大成都避免循环的产生
- 有一下4中参数进行控制
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-Control或Pragma为no-cache的资源
- CacheIgnoreNoLastMod
- 缓存所有没有在header中设置LastMod的资源
- CacheIgnoreQueryString
- 在缓存中忽略查询字符串
- CacheLastModifiedFactor
- 用来回应Last Modified资源从而计算出到期时间
- CacheStoreNoStore
- 可以使用on或off开关来控制
- 设置为on,表示返回内容的头部信息Cache-Control:中包含no-sotre,则进行缓存
- 设置为off,表示不进行缓存
- CacheStorePrivate
- 可以使用on或off开关来控制
- 设置为on,表示返回内容的头部信息Cache-Control:中包含private,则进行缓存
- 设置为off,表示不进行缓存
2.2 mod_mem_cache模块
内存读取速度比磁盘快很多倍
在Apache中,我们可以使用mod_mem_cache模块来做基于内存的缓存管理,它需要配合mod_cache模块才能使用,你可以将它配合为两种不同的缓存模式。
- 缓存打开的文件描述符
- 在堆上缓存资源
- 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万个文件。需要说明的是,CacheDirLevels和CacheDirLength指令的最大值不可以超过20,否则会报错的。
CacheDirLevels 5 CacheDirLength 5
每个URL在缓存目录中至少会使用连个文件,一个是.data文件是按节缓存的,为链接的内容;而.header文件则包含了URL的元信息,例如何时失效等。
CacheMaxFileSize与CacheMinFileSize指令分别用来设置缓存文件的最大和最小体积,单位为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