我们使用apache2.2作为前端服务器,应用服务器作为Apache后面的反向代理服务器。
我们正在使用mod_cache的一些图像,并启用它是这样的:
<IfModule mod_disk_cache.c> CacheEnable disk / CacheRoot /var/cache/apache2/mod_disk_cache CacheIgnoreCacheControl On CacheMaxFileSize 2500000 CacheIgnoreURLSessionIdentifiers jsessionid CacheIgnoreHeaders Set-Cookie </IfModule>
图片url完全不同,没有共同的开始模式,但都以“.png”结尾。 这就是为什么我们使用CacheEnable /
如果没有从caching中提供,则通过反向代理将请求转发到应用服务器。 目前为止,caching工作正常。
但我真的只需要caching以“.png”结尾的所有图像请求。 我的上面的configuration仍然工作,因为我的应用程序服务器发送一个适当的caching控制:no-cache标题的方式返回到Apache。 所以大多数页面都会发送一个no-cache头文件,并且根本不会被caching。 我的“.png”响应不会发送Cache-Control标头,所以apache只会用“.png”来caching所有的url。 精细。
但是,当一个新的请求进入apache,apache不知道只应该考虑.png请求,所以每个请求都检查磁盘上的文件(用strace -e trace=file -p pid ):
[pid 19063] open("/var/cache/apache2/mod_disk_cache/zK/q8/Kd/g6OIv@woJRC_ba_A.header", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
我不希望有apache去磁盘每个请求,因为大部分请求都没有被caching。 在高峰时间我们有高达10.000个请求。 有时我们读IO等待峰值。 它不是很慢,但我们试图调整它以获得更好的性能。
在Apache 2.4中,你可以说:
<LocationMatch .png$> CacheEnable disk </LocationMatch>
这在2.2中是不可能的,因为我看不到debian的后台我不会升级。
所以我试图调整apache2.2遵循我的规则:
<IfModule mod_disk_cache.c> SetEnvIf Request_URI "\.png$" image RequestHeader unset Cache-Control RequestHeader append Cache-Control no-cache env=!image CacheEnable disk / CacheRoot /var/cache/apache2/mod_disk_cache #CacheIgnoreCacheControl on CacheMaxFileSize 2500000 CacheIgnoreURLSessionIdentifiers jsessionid CacheIgnoreHeaders Set-Cookie </IfModule>
这个想法是让apache根据Cache-control头部(CacheIgnoreCacheControl默认为off)决定从caching中提供请求。 之前只需根据请求设置RequestHeader。 如果它不是一个图像请求,请设置一个Cache-control头,所以它应该绕过所有的caching。
这是行不通的,我猜是因为后期处理RequestHeader指令,请参阅https://httpd.apache.org/docs/2.2/mod/mod_headers.html#early
由于“early”关键字不能与条件“env =!image”一起使用,因此无法添加早期处理
我不能改变请求图像的url,我知道当然有其他解决scheme。 但我只对configurationapache2.2来达到我的目标感兴趣。
有没有人有一个想法如何实现我的目标?
https://httpd.apache.org/docs/2.2/mod/mod_cache.html#cachedisable
可以将no-cache环境variables设置为在版本2.2.12及更高版本中的更精细的一组资源上禁用caching。
所以你应该可以禁用除了以.png结尾的请求之外的其他所有内容的caching
SetEnvIf Request_URI !\.png$ no-cache