用 PHP + curl + secache 替代 Nginx 的反向代理功能
用 PHP + curl + secache + memcached 替代 Nginx 的反向代理功能
原文作者:21Andy.com
转载请完整保留文内容及链接 http://www.21andy.com/new/20120830/2095.html
昨天刚重新写完了一个 php 反向代理+缓存控制的程序,功能很完善了,记录一下
Nginx 自身的反向代理功能速度很快,但是存在缺点
1. 不能只存储 gzip 压缩内容,再根据客户端请求发送 gzip 或非 gzip内容
2. 根据不同 URI 请求结构设置不同缓存时间,配置文件要写很长,管理不便
3. 缓存大小虽然可以控制,但清理机制还是离不开PHP等程序
所以,我自行用PHP写了,功能类似以前很流行的小偷程序,不过偷的是自己的内容
源码就不放了,以免有人拿去干坏事
记录一下几个要点
1. php + curl + secache 实现
lru算法可实现缓存总体大小控制,有效利用空间,如一个20G的VPS,可以刚好控制在18G,呵呵
2. 反代时注意 post 请求和 cookie
cookie 从客户端接受,然后请求反代服务端,得到cookie以后,再设置给客户端
3. 缓存时间和缓存存储结构
根据不同 URI 设置不同缓存时间控制,如
'post' => 60,
'list' => 1440,
);
缓存文件名
GET 请求为 domain + uri 的MD5值,取前几位分目录
POST 请求视情况,也许不缓存
缓存文件存储结构
1 层目录结构共 16 个目录, /cache/a/ /cache/0/
2 层目录结构共 256 个目录,/cache/ab/ /cache/01/
3 层目录结构共 4096 个目录, /cache/a/bc/ /cache/0/12/
4 层目录结构共 65536 个目录 /cache/ab/cd/ /cache/01/23/
用以保证每个目录内不超过1000个文件或目录
1 层目录,可以支持 16,000 个文件
2 层目录,可以支持 256,000 个文件
3 层目录,可以支持 4,096,000 个文件
4 层目录,可以支持 65,536,000 个文件
为避免过多文件数量及控制容量,使用secache存储时情况下如:
每个文件 1MB,1 位文件,共 16 个,总大小 16 MB
每个文件 1MB,2 位文件 共 256 个,总大小 256 MB
每个文件 1MB,3 位文件 共 4096 个,总大小 4096 MB = 4G
每个文件 10MB,1 位文件,共 16 个,总大小 160 MB = 0.16G
每个文件 10MB,2 位文件 共 256 个,总大小 2,560 MB = 2.5G
每个文件 10MB,3 位文件 共 4096 个,总大小 40,960 MB = 40G
每个文件 100MB,1 位文件,共 16 个,总大小 1,600 MB = 1.6G
每个文件 100MB,2 位文件 共 256 个,总大小 25,600 MB = 25G
每个文件 100MB,3 位文件 共 4096 个,总大小 409,600 MB = 400G
4. 配合 Nginx 的 SSI,以减少多个缓存页面内的相同内容
gzip + ssi 后,有效降低空间占用
5. 模拟 Nginx 的内存缓存
以 URI 访问计数统计,取TOP N个,存储 memcached,也可以APC
6. 增加一个config设置界面,以文本文件 + APC 存储
用以设置 uri 缓存时间,压缩级别,目录结构,过滤替换等
Incoming search terms:
- php 反向代理
- php反向代理
- 反向代理 php
- curl 反向代理
- php curl 反向代理
- php反代
- php实现反向代理
- php 反向代理 提示文件不存在
- php 反代
- php 实现反向代理
- curl反向代理
- PHP Secache 配置
- php 域名反向代理 seo
- php curl secache 实现
- php curl 反代
- curl反代
终于放来了,学习中!
想法很别致,但是实际应用是不是可行,有测试过吗?
andy 于 2012-09-01 22:14:06 回复:
使用中, 没有问题, 比nginx的反代缓存系统好用, 主要是功能多, 易管理
博主有没有好用的vpn给推荐一个吧,谢谢
请教一个问题:如何保证缓存的正确性?
我目前用nginx搭建反向代理服务器,会碰到一个问题:有时从后端存储取数据时,如果网络不稳定则取到的文件是不完整的,而这个文件被代理服务器缓存下来后,其他用户继续请求这个url还是会得到不完整的缓存文件。。。
这个问题如何解决呢?博主有考虑过么?谢谢。
Andy 于 2012-10-09 13:09:31 回复:
后端发送文件长度,前端检查文件长度
jojo 于 2012-10-16 13:41:54 回复:
我也是这个思路,不过nginx缓存是通过配置实现的,怎么实现检查文件长度后再缓存呢?
复杂到不行,新手表示很无奈
您好
能不能像您購買 code ?
謝謝
我想购买这个code,能联系我吗?
博主好。什么好东西分享下 。放着不会升值的。
博主,由于备案的原因,我需要用PHP反代,以前用7GHOST的,但是它没有缓存(经过测试,确实没有),速度不尽如人意,不知道博主可否共享一下你的CODE,感激不尽