基于HAProxy的高性能HTTP缓存服务器和RESTful NoSQL缓存服务器。
中文版更新可能不及时,最新版请参照英文版README.md
nuster是一个基于HAProxy的高性能HTTP缓存服务器和RESTful NoSQL缓存服务器,完全兼容HAProxy,并且利用HAProxy的ACL功能来提供非常细致的缓存规则。
nuster可以作为HTTP/TCP负载均衡器使用。
nuster也可以用作类似Varnish或者Nginx那样的HTTP缓存服务器,来缓存动态或者静态的HTTP资源。
nuster也可以用作RESTful NoSQL缓存服务器, 用HTTP POST/GET/DELETE
来 添加/取得/删除 Key/Value.
可以像Memcached或者Redis那样放在应用和数据库之间作为内部KV缓存使用,也可以放在用户和应用之间作为面向用户的NoSQL使用。 支持header, cookie等等,所以可以将不同的用户数据存到相同的路劲。
非常快, 单进程模式下是nginx的3倍,多进程下nginx的2倍,varnish的3倍。
生产环境的话从Download下载最新稳定版, 其他情况可以git clone。
make TARGET=linux2628 USE_LUA=1 LUA_INC=/usr/include/lua5.3 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1
make install PREFIX=/usr/local/nuster
添加
USE_PTHREAD_PSHARED=1
使用pthread
如果不需要可以删除
USE_LUA=1 LUA_INC=/usr/include/lua5.3 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1
具体可以参考HAProxy INSTALL。
准备一个配置文件: nuster.cfg
global
nuster cache on data-size 100m
nuster nosql on data-size 200m
master-worker # v3
defaults
mode http
frontend fe
bind *:8080
#bind *:4433 ssl crt example.com.pem alpn h2,http/1.1
use_backend be2 if { path_beg /_kv/ }
default_backend be1
backend be1
nuster cache on
nuster rule img ttl 1d if { path_beg /img/ }
nuster rule api ttl 30s if { path /api/some/api }
server s1 127.0.0.1:8081
server s2 127.0.0.1:8082
backend be2
nuster nosql on
nuster rule r1 ttl 3600
nuster监听8080端口,接受HTTP请求。 /_kv/
开头的请求分配到backend be2
, 可以发送HTTP POST/GET/DELETE
到/_kv/any_key
来 添加/取得/删除 Key/Value. 其他的请求都被分配到backend be1
, 并且会被转发到服务器s1
or s2
. 其中/img/*
请求会被缓存1天,而/api/some/api
会被缓存30秒。
/usr/local/nuster/sbin/nuster -f nuster.cfg
docker pull nuster/nuster
docker run -d -v /path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro -p 8080:8080 nuster/nuster
nuster基于HAProxy, 支持所有的HAProxy指令。
配置文件里有四个基本的section
s: global
, defaults
, frontend
and backend
。
nuster cache on
or nuster nosql on
,否则cache和nosql无法使用frontend
, backend
的默认参数frontend
or backend
section重新定义nuster cache on
or nuster nosql on
, 否则该backend没有nosql或者nosql功能nuster rule
可以定义多个frontend
or backend
. 如果定义了nuster cache|nosql off
或者没有nuster cache|nosql on|off
, nuster就是一个HAProxy。
无法在listen
里定义nuster。
具体参考/doc
下的HAProxy文档, 或者在线HAProxy文档
frontend mysql-lb
bind *:3306
mode tcp
default_backend mysql-cluster
backend mysql-cluster
balance roundrobin
mode tcp
server s1 10.0.0.101:3306
server s2 10.0.0.102:3306
server s3 10.0.0.103:3306
frontend web-lb
bind *:80
#bind *:443 ssl crt XXX.pem
mode http
default_backend apps
backend apps
balance roundrobin
mode http
server s1 10.0.0.101:8080
server s2 10.0.0.102:8080
server s3 10.0.0.103:8080
#server s4 10.0.0.101:8443 ssl verify none
global
nuster cache on data-size 200m
frontend fe
bind *:8080
default_backend be
backend be
nuster cache on
nuster rule all
server s1 127.0.0.1:8081
global
nuster nosql on data-size 200m
frontend fe
bind *:8080
default_backend be
backend be
nuster nosql on
nuster rule r1 ttl 3600
syntax:
nuster manager on|off [uri URI] [purge-method method]
default: off
context: global
定义并开启manager/stats/purge API, uri 和 purge method。
默认是关闭的. 如果开启了,注意开启访问控制(see FAQ).
具体请参考管理.
自定义管理URI, 默认是 /nuster
自定义PURGE用的HTTP method,默认是 PURGE
.
syntax:
nuster cache on|off [data-size size] [dict-size size] [dir DIR] [dict-cleaner n] [data-cleaner n] [disk-cleaner n] [disk-loader n] [disk-saver n]
nuster nosql on|off [data-size size] [dict-size size] [dir DIR] [dict-cleaner n] [data-cleaner n] [disk-cleaner n] [disk-loader n] [disk-saver n]
default: none
context: global
控制是否开启cache或者nosql。
会分配一块data-size + dict-size
的共享内存来存储HTTP头,数据,key等等,临时数据从系统内存池分配。 如果没有足够内存,新的请求不会被缓存直到有内存被释放。
和dict-size
一起决定内存块的大小。
可以使用m
, M
, g
和 G
. 默认是1MB,同时也是最小值。
决定hash table的大小.
可以使用m
, M
, g
和 G
. 默认是1MB,同时也是最小值。
这个决定hash table buckets的大小,并非key的大小,key存在共享内存中。
dict-size(bucket数) 不等于 key数. 就算key的数量超过了dict-size,只要整个共享内存有空间,新的key仍然可以被添加。
不过如果key数超过dict-size(bucket数)性能也许会下降. dict-size可以设为大概的最大key数乘以8。当然越大越好。
查看stats API:
dict.nosql.length: 131072
dict.nosql.used: 0
如果dict.nosql.used
比dict.nosql.length
大,调高dict-size
比较好。
将来版本会删除dict-size, 像第一版本那样自动伸缩
设置硬盘缓存文件的根目录,必须设置以开启硬盘缓存功能。
每次检查最多 dict-cleaner
个entry,无效的entry将被删除(默认1000)
每次检查最多 data-cleaner
个entry,无效的data将被删除(默认1000)
每次检查最多 disk-cleaner
个硬盘缓存文件,无效的文件将被删除(默认100)
启动后每次加载最多 disk-loader
个硬盘缓存文件的信息到内存(默认100)
每次检查最多 disk-saver
个data,并将需要保存至硬盘的data保存到硬盘(默认100)
详细请参考Store.
syntax:
nuster cache [on|off]
nuster nosql [on|off]
default: on
context: backend
决定是否在这个backend开启cache/nosql。 如果这个section有filter,记得放在最后。
syntax:
nuster rule name [key KEY] [ttl TTL] [extend EXTEND] [code CODE] [memory on|off] [disk on|off|sync] [etag on|off] [last-modified on|off] [if|unless condition]
default: none
context: backend
定义cache/nosql的生效条件,需要定义至少一个rule。
nuster cache on
# cache request `/asdf` for 30 seconds
nuster rule asdf ttl 30 if { path /asdf }
# cache if the request path begins with /img/
nuster rule img if { path_beg /img/ }
# cache if the response header `cache` is `yes`
acl resHdrCache res.hdr(cache) yes
nuster rule r1 if resHdrCache
可以定义多个rule,按定义顺序先后匹配。
acl pathA path /a.html
nuster cache on
nuster rule all ttl 3600
nuster rule path01 ttl 60 if pathA
rule path01
永远不会被匹配。
定义rule的name。
在cache manager API中使用, 不必唯一但是建议不同的rule用不同的name,否则相同name的rule视作一样。
定义cache/nosql的key, 由下列关键字加.
组成
NAME
NAME
NAME
CACHE的默认key是 method.scheme.host.uri
, NoSQL的默认key是 GET.scheme.host.uri
.
Example
GET http://www.example.com/q?name=X&type=Y
http header:
GET /q?name=X&type=Y HTTP/1.1
Host: www.example.com
ASDF: Z
Cookie: logged_in=yes; user=nuster;
生成:
默认key产生GET\0http\0www.example.com\0/q?name=X&type=Y\0
, 而key method.scheme.host.path.header_ASDF.cookie_user.param_type
则生成 GET\0http\0www.example.com\0/q\0Z\0nuster\0Y\0
.
\0
是NULL字符
相同key的请求则会直接返回cache给客户端。
设置缓存生存时间,过期后缓存会被删除。 可以使用 d
, h
, m
and s
。默认0
秒. 如果不希望失效则设为0
可以通过设置 extend
关键词来自动延长缓存的ttl。
自动延长缓存ttl。
extend on|off|n1,n2,n3,n4
默认: off.
n1,n2,n3,n4: 小于100的正整数, n1 + n2 + n3之和也小于100. 他们定义四个时间段:
time: 0 ttl ttl * (1 + n4%)
access: | A1 | A2 | A3 | A4 | |
|---------------------------|---------|---------|---------|---------|
percentage: |<- (100 - n1 - n2 - n3)% ->|<- n1% ->|<- n2% ->|<- n3% ->|<- n4% ->|
满足下列条件缓存的ttl将被延长:
ttl
和 ttl * (1 + n4%)
之间有新的请求
on
其实是33,33,33,33
默认只缓存200的响应,如果需要缓存其他的则可以添加,all
会缓存任何状态码。
cache-rule only200
cache-rule 200and404 code 200,404
cache-rule all code all
是否保存数据到内存,默认on。
详见Store
是否保存数据到硬盘,已经如何保存,默认off
需要设置memory on
以使用 disk sync
详见Store
定义是否处理etag条件请求. 如果没有 ETag
则添加。
默认off.
定义是否处理last-modified条件请求. 如果没有 Last-Modified
则添加.
默认off.
定义ACL条件
ACL分别在请求阶段和响应阶段执行。
当下述条件满足时,会进行缓存:
当使用否定的ACL或者某些样本获取方法时,需要特别注意
比如
缓存以/img/
开头的请求
nuster rule img if { path_beg /img/ }
请求阶段要么为真要么为假,因为在响应阶段无法获取path所以永远为假。
缓存响应的http头部Content-Type
为 image/jpeg
nuster rule jpeg if { res.hdr(Content-Type) image/jpeg }
因为在请求阶段无法获取res.hdr所以永远为假,在响应阶段要么为真要么为假。
/img/
开头,并且响应头 Content-Type
为image/jpeg
时缓存如果定义为下面的规则,则不会成功:
nuster rule img if { path_beg /img/ } { res.hdr(Content-Type) image/jpeg }
因为在响应阶段无法获取path所以永远为假,而在请求阶段无法获取res.hdr所以永远为假,那么这个ACL就永远无法匹配。
需要如下来定义:
http-request set-var(txn.pathImg) path
acl pathImg var(txn.pathImg) -m beg /img/
acl resHdrCT res.hdr(Content-Type) image/jpeg
nuster rule r3 if pathImg resHdrCT
或者nuster.path
(v5):
nuster rule r3 if { nuster.path -m beg /img } { res.hdr(Content-Type) image/jpeg }
/api/
开头的请求下面不正确:
acl NoCache path_beg /api/
nuster rule r3 if !NoCache
因为虽然在响应阶段path并不存在,所以NoCache永远为假,而 !NoCache
为真,所有的请求都会被缓存。
需要改成:
http-request set-var(txn.path) path
acl NoCache var(txn.path) -m beg /api/
nuster rule r1 if !NoCache
新sample fetch详见Sample fetches
详见HAProxy configuration的7. Using ACLs and fetching samples
nuster也可以用作类似Varnish或者Nginx那样的HTTP缓存服务器,来缓存动态或者静态的HTTP资源。 出了HAProxy的SSL, HTTP, HTTP2, 重写重定向,增删改Header等等,还提供了下面的功能。
global
nuster cache on data-size 200m
frontend fe
bind *:8080
default_backend be
backend be
nuster cache on
nuster rule r1 if { path /a1 }
nuster rule r2 key method.scheme.host.path.delimiter.query.cookie_userId if { path /a2 }
nuster rule r3 ttl 10 if { path /a3 }
nuster rule r4 disk only if { path /a4 }
server s1 127.0.0.1:8081
nuster会依次检查rule, 先生成key然后查找,如果找到则返回缓存,否则就测试ACL, 如果ACL通过则缓存响应。
nuster也可以用作RESTful NoSQL缓存服务器, 用HTTP POST/GET/DELETE
来 添加/取得/删除 Key/Value.
curl -v -X POST -d value1 http://127.0.0.1:8080/key1
curl -v -X POST --data-binary @icon.jpg http://127.0.0.1:8080/imgs/icon.jpg
curl -v http://127.0.0.1:8080/key1
curl -v -X DELETE http://127.0.0.1:8080/key1
Check status code.
通过在key里加入header, cookie等等,可以将不同的用户数据存到相同的路劲。
nuster rule r1 key method.scheme.host.uri.header_userId if { path /mypoint }
nuster rule r2 key method.scheme.host.uri.cookie_sessionId if { path /mydata }
curl -v -X POST -d "333" -H "userId: 1000" http://127.0.0.1:8080/mypoint
curl -v -X POST -d "555" -H "userId: 1001" http://127.0.0.1:8080/mypoint
curl -v -X POST -d "userA data" --cookie "sessionId=ijsf023xe" http://127.0.0.1:8080/mydata
curl -v -X POST -d "userB data" --cookie "sessionId=rosre329x" http://127.0.0.1:8080/mydata
curl -v http://127.0.0.1:8080/mypoint
< 404 Not Found
curl -v -H "userId: 1000" http://127.0.0.1:8080/mypoint
< 200 OK
333
curl -v --cookie "sessionId=ijsf023xe" http://127.0.0.1:8080/mydata
< 200 OK
userA data
支持任何支持HTTP的客户端,库: curl
, postman
, python requests
, go net/http
, etc.
可以通过uri
定义一个endpoint并发送HTTP请求来进行管理。
定义并且开启
nuster manager on uri /internal/nuster purge-method PURGEX
METHOD | Endpoint | description |
---|---|---|
GET | /internal/nuster | 获得stats |
POST | /internal/nuster | 开启关闭rule, 更新ttl |
DELETE | /internal/nuster | 高级Purge |
PURGEX | /any/real/path | 基础Purge |
可以通过GET uri
定义的endpoint来获取统计信息。
curl http://127.0.0.1/nuster
**NUSTER**
nuster.cache: on
nuster.nosql: on
nuster.manager: on
**MANAGER**
manager.uri: /nuster
manager.purge_method: PURGE
**DICT**
dict.cache.size: 1048576
dict.cache.length: 131072
dict.cache.used: 0
dict.cache.cleanup_idx: 0
dict.cache.sync_idx: 0
dict.nosql.size: 1048576
dict.nosql.length: 131072
dict.nosql.used: 0
dict.nosql.cleanup_idx: 0
dict.nosql.sync_idx: 0
**STORE MEMORY**
store.memory.cache.size: 2098200576
store.memory.cache.used: 1048960
store.memory.cache.count: 0
store.memory.nosql.size: 11534336
store.memory.nosql.used: 1048960
store.memory.nosql.count: 0
**STORE DISK**
store.disk.cache.dir: /tmp/nuster/cache
store.disk.cache.loaded: yes
store.disk.nosql.dir: /tmp/nuster/nosql
store.disk.nosql.loaded: yes
**STATS**
stats.cache.total: 0
stats.cache.hit: 0
stats.cache.fetch: 0
stats.cache.abort: 0
stats.cache.bytes: 0
stats.nosql.total: 0
stats.nosql.get: 0
stats.nosql.post: 0
stats.nosql.delete: 0
**PROXY cache app1**
app1.rule.rule1: state=on memory=on disk=off ttl=10
app1.rule.rule2: state=on memory=on disk=on ttl=10
app1.rule.rule3: state=on memory=on disk=sync ttl=10
app1.rule.rule4: state=on memory=off disk=on ttl=10
app1.rule.rule5: state=on memory=off disk=off ttl=10
**PROXY nosql app2**
app2.rule.ruleA: state=on memory=on disk=off ttl=10
app2.rule.ruleB: state=on memory=on disk=on ttl=10
app2.rule.ruleC: state=on memory=on disk=sync ttl=10
app2.rule.ruleD: state=on memory=off disk=on ttl=10
app2.rule.ruleE: state=on memory=off disk=off ttl=10
rule可以通过manager uri动态开启关闭,关闭的rule不会再进行匹配。
headers
header | value | description |
---|---|---|
state | enable | enable rule |
disable | disable rule | |
name | rule NAME | the rule to be enabled/disabled |
proxy NAME | all rules of proxy NAME | |
* | all rules |
相同name的rule都会被开启关闭。
Examples
关闭rule r1
curl -X POST -H "name: r1" -H "state: disable" http://127.0.0.1/nuster
关闭backend app1b的所有rule
curl -X POST -H "name: app1b" -H "state: disable" http://127.0.0.1/nuster
开启所有的rule
curl -X POST -H "name: *" -H "state: enable" http://127.0.0.1/nuster
更改TTL,只会影响后续的新缓存,不会影响已经存在的缓存。
headers
header | value | description |
---|---|---|
ttl | new TTL | see ttl in nuster rule |
name | rule NAME | the rule to be changed |
proxy NAME | all rules of proxy NAME | |
* | all rules |
Examples
curl -X POST -H "name: r1" -H "ttl: 0" http://127.0.0.1/nuster
curl -X POST -H "name: r2" -H "ttl: 2h" http://127.0.0.1/nuster
同时设置state和ttl
curl -X POST -H "name: r1" -H "ttl: 0" -H "state: enabled" http://127.0.0.1/nuster
有两种清除模式:
purge-method MYPURGE
定义的方法到想要删除的Pathcurl -XPURGE http://127.0.0.1/imgs/test.jpg
根据rule生成key并删除那个key。只对GET请求生成的缓存有效。
默认key 包含Host
, 如果缓存时用了http://example.com/test
而在localhost删除是需要Host
header:
curl -XPURGE -H "Host: example.com" http://127.0.0.1/test
对cache和nosql都有效,nosql模式相当于 DELETE
。
可以通过带上name
header来 PURGE
headers
header | value | description |
---|---|---|
name | nuster rule NAME | caches of rule ${NAME} will be purged |
proxy NAME | caches of proxy ${NAME} | |
* | all caches |
Examples
# 删除所有缓存
curl -X DELETE -H "name: *" http://127.0.0.1/nuster
# 删除backend applb的所有缓存
curl -X DELETE -H "name: app1b" http://127.0.0.1/nuster
# 删除所有rule r1生成的缓存
curl -X DELETE -H "name: r1" http://127.0.0.1/nuster
通过带上nuster-host
header来删除所有属于这个host的缓存。
headers
header | value | description |
---|---|---|
host | HOST | the ${HOST} |
nuster-host | HOST | nuster-host存在则使用nuster-host |
mode | cache, nosql | purge cache or nosql data |
Examples
curl -X DELETE -H "nuster-host: 127.0.0.1:8080" http://127.0.0.1/nuster
默认情况下,query部分也包含在key中,所以相同的path不同的query会产生不同的缓存。
比如nuster rule imgs if { path_beg /imgs/ }
, 然后请求
curl http://127.0.0.1/imgs/test.jpg?w=120&h=120
curl http://127.0.0.1/imgs/test.jpg?w=180&h=180
会生成两个缓存,因为query不一样。
如果要删除这些缓存,可以
如果知道所有的query,那么可以一个一个删除
curl -XPURGE http://127.0.0.1/imgs/test.jpg?w=120&h=120
curl -XPURGE http://127.0.0.1/imgs/test.jpg?w=180&h=180
大多数情况下不知道所有的query
如果query部分不重要,则可以从key里面删除query
定义nuster rule imgs key method.scheme.host.path if { path_beg /imgs }
, 这样的话只会生成一个缓存,那么就可以不用query删除缓存
curl -XPURGE http://127.0.0.1/imgs/test.jpg
大多数情况需要query
通过rule name删除
curl -X PURGE -H "name: imgs" http://127.0.0.1/nuster/cache
但是如果rule被定义成了 nuster rule static if { path_beg /imgs/ /css/ }
,则无法只删除imgs
因此,可以通过path删除
headers
header | value | description |
---|---|---|
path | PATH | caches with ${PATH} will be purged |
host | HOST | and host is ${HOST} |
nuster-host | HOST | nuster-host has higher precedence over host |
mode | cache, nosql | purge cache or nosql data |
Examples
# 删除所有path是/imgs/test.jpg的缓存
curl -X DELETE -H "path: /imgs/test.jpg" http://127.0.0.1/nuster
# 删除所有path是/imgs/test.jpg 并且host是127.0.0.1:8080的缓存
curl -X DELETE -H "path: /imgs/test.jpg" -H "nuster-host: 127.0.0.1:8080" http://127.0.0.1/nuster
也可以通过正则删除,所有匹配正则的缓存将被删除。
headers
header | value | description |
---|---|---|
regex | REGEX | caches which path match with ${REGEX} will be purged |
host | HOST | and host is ${HOST} |
nuster-host | HOST | nuster-host has higher precedence over host |
mode | cache, nosql | purge cache or nosql data |
Examples
# 删除所有 /imgs 开头 .jpg结尾的缓存
curl -X DELETE -H "regex: ^/imgs/.*\.jpg$" http://127.0.0.1/nuster
#delete all caches which path starts with /imgs and ends with .jpg and with host of 127.0.0.1:8080
curl -X DELETE -H "regex: ^/imgs/.*\.jpg$" -H "127.0.0.1:8080" http://127.0.0.1/nuster
PURGE 注意事项
开启访问控制
如果有多个header,按照name
, path & host
, path
, regex & host
, regex
, host
的顺序处理
curl -X DELETE -H "name: rule1" -H "path: /imgs/a.jpg"
: purge by name
如果有重复的header,处理第一个
curl -X DELETE -H "name: rule1" -H "name: rule2"
: purge by rule1
regex
不是 glob
比如 /imgs下的.jpg文件是^/imgs/.*\.jpg$
而不是 /imgs/*.jpg
通过rule name或proxy name删除缓存时,需要注意这两种方法只在当前进程有效。如果重启了进程则无法通过这两种方法删除缓存文件,因为rule name信息和proxy name信息并没有保存在缓存文件中。
只有disk load结束后才能通过host or path or regex 来删除缓存文件。是否已经load结束可以查看stats URL。
Nuster(cache和nosql) 支持多种后端存储. 目前支持memory和disk。计划添加其他后段。
数据被存在一个大小由data-size
定义的内存区域。重启后数据会消失。
数据被存到硬盘由dir
定义的目录下。重启后数据不会消失。
有三种模式:
memory on
。先保存至内存然后由master进程在一定时间后同步到硬盘,每次同步dict-saver
个缓存。Nuster 加入了一些新的sample fetches
表示是否是HIT缓存,可以像如下使用
http-response set-header x-cache hit if { nuster.cache.hit }
类似HAProxy的 req.hdr(Host)
,但是请求和响应中都可使用
等同于HAProxy的capture.req.uri
.
类似HAProxy的 path
,但是请求和响应中都可使用
类似HAProxy的 query
,但是请求和响应中都可使用
在global
添加 master-worker
或者启动时使用-W
参数。
在global
添加debug
, 或者带-d
启动nuster
nuster相关的调试信息以[nuster
开头
添加option http-buffer-request
如果自定义了key的话需要使用body
关键字
请求body可能不完整,详见HAProxy configuration 的 option http-buffer-request小节
另外可以为post请求单独设置一个后端
类似
acl network_allowed src 127.0.0.1
acl purge_method method PURGE
http-request deny if purge_method !network_allowed
bind :443 ssl crt pub.pem alpn h2,http/1.1
global
nuster cache on data-size 100m
nuster nosql on data-size 100m
master-worker # v3
# daemon
# debug
defaults
retries 3
option redispatch
timeout client 30s
timeout connect 30s
timeout server 30s
frontend web1
bind *:8080
mode http
acl pathPost path /search
use_backend app1a if pathPost
default_backend app1b
backend app1a
balance roundrobin
# mode must be http
mode http
# http-buffer-request must be enabled to cache post request
option http-buffer-request
acl pathPost path /search
# enable cache for this proxy
nuster cache
# cache /search for 120 seconds. Only works when POST/PUT
nuster rule rpost key method.scheme.host.uri.body ttl 120 if pathPost
server s1 10.0.0.10:8080
backend app1b
balance roundrobin
mode http
nuster cache on
# cache /a.jpg, not expire
acl pathA path /a.jpg
nuster rule r1 ttl 0 if pathA
# cache /mypage, key contains cookie[userId], so it will be cached per user
acl pathB path /mypage
nuster rule r2 key method.scheme.host.path.delimiter.query.cookie_userId ttl 60 if pathB
# cache /a.html if response's header[cache] is yes
http-request set-var(txn.pathC) path
acl pathC var(txn.pathC) -m str /a.html
acl resHdrCache1 res.hdr(cache) yes
nuster rule r3 if pathC resHdrCache1
# cache /heavy for 100 seconds if be_conn greater than 10
acl heavypage path /heavy
acl tooFast be_conn ge 100
nuster rule heavy ttl 100 if heavypage tooFast
# cache all if response's header[asdf] is fdsa
acl resHdrCache2 res.hdr(asdf) fdsa
nuster rule resCache ttl 0 if resHdrCache1
server s1 10.0.0.10:8080
frontend web2
bind *:8081
mode http
default_backend app2
backend app2
balance roundrobin
mode http
# disable cache on this proxy
nuster cache off
nuster rule all
server s2 10.0.0.11:8080
frontend nosql_fe
bind *:9090
default_backend nosql_be
backend nosql_be
nuster nosql on
nuster rule r1 ttl 3600
nuster 1.7.9.5 已发布,本次更新主要添加可以动态开启和禁用 cache 的 API,可以针对单个 tag(cache-rule 的 name),整个后端的 cache 和所有 cache 进行操作。 项目主页 github.com/jiangwenyua… 欢迎大家试用并随手 star,提供宝贵意见,谢谢:) 添加 Cache manager API Cache manager ap
英文原文:https://github.com/jiangwenyuan/nuster/wiki/Performance-benchmark:-nuster-vs-nginx-vs-varnish 简单比较了 nuster, nginx和varnish的缓存性能 结果显示nuster的RPS(每秒请求数)单进程模式下大概是nginx的3倍,多进程下是nginx的2倍,varnish的3倍。 /he
高性能 Web 缓存服务器 nuster 1.7.9.7 已发布。本次更新主要添加删除全部缓存,根据后端代理名字,根据缓存规则名字删除缓存的功能。 项目主页 github.com/jiangwenyua… 本次更新 Added Purge all cache (curl -X PURGE -H "name: *") Purge the cache belong to a proxy (curl -
Nuster是一个基于HAProxy的高性能缓存服务器 github.com/jiangwenyua… 介绍 Nuster是一个基于HAProxy的高性能缓存服务器。Nuster完全兼容HAProxy,并且利用 HAProxy的ACL功能来提供非常细致的缓存规则,比如 请求地址为某某时缓存 请求参数中的X为Y时缓存 响应头中的X为Y时缓存 请求速率超过多少时缓存 等等 性能 非常快, 单进程模式下
简单的用 h2load测试了nuster和nginx的http/2下的缓存性能,结果显示RPS(每秒请求数)nuster差不多是nginx的3倍 https://github.com/jiangwenyuan/nuster data size CONN nuster nginx 12(hello world) 1000 338924 110419 测试环境 服务器 两台linux服务器:一台测试服
大家好,分享一个基于 HAProxy 的高性能 web 缓存服务器 nuster。nuster 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。 可以根据 url, path, query, header, cookie,请求速率等等来动态生成缓存,并设置有效期。支持 purge,支持前后端 HTTPS。 非常快, 单进程模式下是 nginx 的 3
高性能缓存服务器 nuster v1.7.10.1 已发布。本次更新主要升级到HAProxy v1.7.10, 更改了配置文件关键字,删除了share关键字, 为升级到HAProxy v1.8进行了代码重构。这应该是1.7版本的最后一次更新,下次主要是升级到1.8,添加HTTP2功能。 项目主页 https://github.com/jiangwenyuan/nuster 本次更新 Added U
高性能缓存服务器 nuster 1.7.9.8 已发布。本次更新主要添加根据 Host, 根据 Path 和根据正则来删除缓存的功能。 项目主页 github.com/jiangwenyua… 本次更新 Added Purge cache by host Purge cache by path Purge cache by regex Changed Incorrect host and path
nuster 1.7.9.4 已发布。nuster是一个基于HAProxy的高性能缓存服务器。nuster完全兼容HAProxy,并且利用 HAProxy的ACL功能来提供非常细致的缓存规则。特性包括 github.com/jiangwenyua… 完全兼容HAProxy,支持所有HAProxy的特性和功能 强大的动态缓存功能 根据HTTP method, uri, path, query, he
高性能缓存服务器 nuster v1.8.8.1 已发布。本次更新主要升级到HAProxy v1.8.8, 支持HTTP/2和多线程。 项目主页 https://github.com/jiangwenyuan/nuster 介绍 nuster 是一个基于 HAProxy 的高性能缓存服务器。nuster 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。
简单的用 h2load测试了nuster和nginx的http/2下的缓存性能,结果显示RPS(每秒请求数)nuster差不多是nginx的3倍 码云:https://gitee.com/nuster/nuster data size CONN nuster nginx 12(hello world) 1000 338924 110419 测试环境 服务器 两台linux服务器:一台测试服务器se
Nuster是一个基于HAProxy的高性能缓存服务器 https://github.com/jiangwenyu... 介绍 Nuster是一个基于HAProxy的高性能缓存服务器。Nuster完全兼容HAProxy,并且利用 HAProxy的ACL功能来提供非常细致的缓存规则,比如 请求地址为某某时缓存 请求参数中的X为Y时缓存 响应头中的X为Y时缓存 请求速率超过多少时缓存 等等 性能 非常
高性能缓存服务器 nuster 1.7.9.9 已发布。本次更新主要添加缓存stats功能,修复一个安全漏洞。 项目主页 github.com/jiangwenyua… 本次更新 1.7.9.9 - 2018-04-01 Added Cache stats applet Various cache stats Changed Separate cache manager file/applet R
本文向大家介绍基于Centos7 部署Varnish缓存代理服务器,包括了基于Centos7 部署Varnish缓存代理服务器的使用技巧和注意事项,需要的朋友参考一下 一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合。与传统的squid相比,Varnish具有高性能、速度快、管理更
imi v1.0.13 版本新增了一个 Swoole\Coroutine\Http\Server 实现的协程服务器。需要 Swoole 4.4+ 才可使用该特性。 该特性是可选的,不影响以前使用的服务器模式。 使用协程服务器特性,依靠 Linux 系统的端口重用机制,系统级的负载均衡,可以让你的多进程 Http 服务处理请求的能力得到提升。 使用 ab,本机->虚拟机(双核+2进程)压测Hello
StaticCache 静态变量形式的缓存(是存放于当前进程的内存中)。注册中心的服务地址也存放于静态缓存中。 StaticCache::set($key, $value, $canUnset = true) use StaticCache; StaticCache::set('foo', 'bar'); //默认该变量可以被释放,也可设置不释放。使用情况:在使用Async
问题内容: 我读过,为避免在nodejs中缓存,必须使用: 但是我不知道如何使用它,因为当我在代码中添加该行时会出错。 我的功能(我认为我必须不编程缓存)是: 有人知道如何在我的代码中不放置任何缓存吗?谢谢 问题答案: 您已经编写了标题。我认为您完成此操作后无法添加更多内容,因此只需将标题放在第一个对象中即可。
我正在使用Spring方法级别的注释@cacheable来缓存我从数据库中获取的数据。我可以在服务器启动时使用上述注释执行缓存吗?我尝试了这个,但它再次从数据库而不是从缓存中获取。
问题内容: 我正在从servlet提供图像。响应内容类型为image / jpeg。我发现从我的servlet请求的图像没有被缓存。如何使它们像文件图像请求通常那样被缓存?我尝试设置Cache- Control:public,但无济于事。 问题答案: 好的..看起来默认头字段应该启用缓存。我在另一个论坛上找到了解决方案。显然,您需要在响应中显式设置content- length。不知道为什么。我认
我希望能够创建一个自定义的AngularJS服务,当其数据对象为空时发出HTTP“GET”请求,并在成功时填充数据对象。 下一次调用此服务时,我希望绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗?
我想使用准备好的语句缓存。我的应用程序目前使用HikariCP和MySQL5.6。