纸上得来终觉浅,绝知此事要躬行。
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