nuster 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
nuster 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议 GPL
开发语言 C/C++
操作系统 Linux
软件类型 开源软件
开发厂商
地区 国产
提 交 者 nuster
适用人群 未知
收录时间 2017-11-02

软件简介

nuster

Wiki | English | 中文 | 日本語

基于HAProxy的高性能HTTP缓存服务器和RESTful NoSQL缓存服务器。

中文版更新可能不及时,最新版请参照英文版README.md

目录

介绍

nuster是一个基于HAProxy的高性能HTTP缓存服务器和RESTful NoSQL缓存服务器,完全兼容HAProxy,并且利用HAProxy的ACL功能来提供非常细致的缓存规则。

特性

HTTP/TCP负载均衡器

nuster可以作为HTTP/TCP负载均衡器使用。

  • 继承了HAProxy的所有特性,完全兼容HAProxy
  • 负载均衡
  • 前端后端HTTPS
  • HTTP压缩
  • HTTP重写重定向
  • HTTP信息增删改
  • HTTP2
  • 监控
  • 粘性
  • 访问控制
  • 内容切换

HTTP缓存服务器

nuster也可以用作类似Varnish或者Nginx那样的HTTP缓存服务器,来缓存动态或者静态的HTTP资源。

  • HAProxy的所有特性(HTTPS, HTTP/2, ACL, etc)
  • 非常快
  • 强大的动态缓存功能
    • 基于HTTP method, URI, path, query, header, cookies, etc
    • 基于HTTP request or response contents, etc
    • 基于environment variables, server state, etc
    • 基于SSL version, SNI, etc
    • 基于connection rate, number, byte, etc
  • 缓存管理
  • 缓存清除
  • 缓存统计信息
  • 缓存生存时间
  • 持久化

RESTful NoSQL缓存服务器

nuster也可以用作RESTful NoSQL缓存服务器, 用HTTP POST/GET/DELETE 来 添加/取得/删除 Key/Value.

可以像Memcached或者Redis那样放在应用和数据库之间作为内部KV缓存使用,也可以放在用户和应用之间作为面向用户的NoSQL使用。 支持header, cookie等等,所以可以将不同的用户数据存到相同的路劲。

  • HAProxy的所有特性(HTTPS, HTTP/2, ACL, etc)
  • 有条件的缓存
  • 内部KV缓存
  • 面向用户缓存
  • 支持任何类型的数据
  • 支持所有编程语言,不需要特定的库,只需HTTP支持
  • 持久化

性能

非常快, 单进程模式下是nginx的3倍,多进程下nginx的2倍,varnish的3倍。

详见benchmark

入门指南

下载

生产环境的话从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

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指令。

基本

配置文件里有四个基本的sections: globaldefaultsfrontend and backend

  • global
    • 定义全局指令
    • 需要定义nuster cache on or nuster nosql on,否则cache和nosql无法使用
  • defaults
    • 定义frontendbackend的默认参数
    • 可以在frontend or backend section重新定义
  • frontend
    • 定义监听端口等等面向用户的设置
  • bankend
    • 定义后端服务器等等设置
    • 需要设置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文档

As TCP loader balancer

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

As HTTP/HTTPS loader balancer

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

As HTTP cache server

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

As RESTful NoSQL cache server

global
    nuster nosql on data-size 200m
frontend fe
    bind *:8080
    default_backend be
backend be
    nuster nosql on
    nuster rule r1 ttl 3600

指令

global: nuster manager

syntax:

nuster manager on|off [uri URI] [purge-method method]

default: off

context: global

定义并开启manager/stats/purge API, uri 和 purge method。

默认是关闭的. 如果开启了,注意开启访问控制(see FAQ).

具体请参考管理.

uri

自定义管理URI, 默认是 /nuster

purge-method

自定义PURGE用的HTTP method,默认是 PURGE.

global: nuster cache|nosql

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等等,临时数据从系统内存池分配。 如果没有足够内存,新的请求不会被缓存直到有内存被释放。

data-size

dict-size一起决定内存块的大小。

可以使用mMg 和 G. 默认是1MB,同时也是最小值。

dict-size

决定hash table的大小.

可以使用mMg 和 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, 像第一版本那样自动伸缩

dir

设置硬盘缓存文件的根目录,必须设置以开启硬盘缓存功能。

dict-cleaner

每次检查最多 dict-cleaner 个entry,无效的entry将被删除(默认1000)

data-cleaner

每次检查最多 data-cleaner 个entry,无效的data将被删除(默认1000)

disk-cleaner

每次检查最多 disk-cleaner 个硬盘缓存文件,无效的文件将被删除(默认100)

disk-loader

启动后每次加载最多 disk-loader 个硬盘缓存文件的信息到内存(默认100)

disk-saver

每次检查最多 disk-saver 个data,并将需要保存至硬盘的data保存到硬盘(默认100)

详细请参考Store.

proxy: nuster cache|nosql

syntax:

nuster cache [on|off]

nuster nosql [on|off]

default: on

context: backend

决定是否在这个backend开启cache/nosql。 如果这个section有filter,记得放在最后。

proxy: nuster rule

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永远不会被匹配。

name

定义rule的name。

在cache manager API中使用, 不必唯一但是建议不同的rule用不同的name,否则相同name的rule视作一样。

key KEY

定义cache/nosql的key, 由下列关键字加.组成

  • method: http method, GET/POST...
  • scheme: http or https
  • host: the host in the request
  • uri: first slash to end of the url
  • path: the URL path of the request
  • delimiter: '?' if query exists otherwise empty
  • query: the whole query string of the request
  • header_NAME: the value of header NAME
  • cookie_NAME: the value of cookie NAME
  • param_NAME: the value of query NAME
  • body: the body of the request

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;

生成:

  • method: GET
  • scheme: http
  • host: www.example.com
  • uri: /q?name=X&type=Y
  • path: /q
  • delimiter: ?
  • query: name=X&type=Y
  • header_ASDF: Z
  • cookie_user: nuster
  • param_type: Y
  • body: (empty)

默认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给客户端。

ttl TTL

设置缓存生存时间,过期后缓存会被删除。 可以使用 dhm and s。默认0秒. 如果不希望失效则设为0

可以通过设置 extend 关键词来自动延长缓存的ttl。

extend EXTEND

自动延长缓存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将被延长:

  1. A4 > A3 > A2
  2. 在 ttl 和 ttl * (1 + n4%) 之间有新的请求

on 其实是33,33,33,33

code CODE1,CODE2...

默认只缓存200的响应,如果需要缓存其他的则可以添加,all会缓存任何状态码。

cache-rule only200
cache-rule 200and404 code 200,404
cache-rule all code all

memory on|off

是否保存数据到内存,默认on。

详见Store

disk on|off|sync

是否保存数据到硬盘,已经如何保存,默认off

需要设置memory on 以使用 disk sync

详见Store

etag on|off

定义是否处理etag条件请求. 如果没有 ETag 则添加。

默认off.

last-modified on|off

定义是否处理last-modified条件请求. 如果没有 Last-Modified 则添加.

默认off.

if|unless condition

定义ACL条件

ACL分别在请求阶段和响应阶段执行。

当下述条件满足时,会进行缓存:

  1. 在请求阶段ACL为真
  2. 请求阶段ACL为假,但是响应阶段ACL为真

当使用否定的ACL或者某些样本获取方法时,需要特别注意

比如

  1. 缓存以/img/开头的请求

    nuster rule img if { path_beg /img/ }

请求阶段要么为真要么为假,因为在响应阶段无法获取path所以永远为假。

  1. 缓存响应的http头部Content-Type 为 image/jpeg

    nuster rule jpeg if { res.hdr(Content-Type) image/jpeg }

因为在请求阶段无法获取res.hdr所以永远为假,在响应阶段要么为真要么为假。

  1. /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 }
  1. 另一个例子,缓存所有不以 /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 configuration7. Using ACLs and fetching samples

Cache

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通过则缓存响应。

NoSQL

nuster也可以用作RESTful NoSQL缓存服务器, 用HTTP POST/GET/DELETE 来 添加/取得/删除 Key/Value.

基本操作

Set

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

Get

curl -v http://127.0.0.1:8080/key1

Delete

curl -v -X DELETE http://127.0.0.1:8080/key1

Response

Check status code.

  • 200 OK
    • POST/GET: 成功
    • DELETE: 总是
  • 400 Bad request
    • 空值
    • 不正确的acl, rules, etc
  • 404 Not Found
    • POST: rule tests失败
    • GET: not found
  • 405 Method Not Allowed
    • 其他的methods
  • 500 Internal Server Error
    • 发生未知错误
  • 507 Insufficient Storage
    • 超过data-size

分用户的data

通过在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 }

Set

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

Get

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的客户端,库: curlpostman, 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来获取统计信息。

Usage

curl http://127.0.0.1/nuster

Output

**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

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

同时设置state和ttl

curl -X POST -H "name: r1" -H "ttl: 0" -H "state: enabled" http://127.0.0.1/nuster

清除

有两种清除模式:

  • 基础Purge: 发送 purge-method MYPURGE 定义的方法到想要删除的Path
  • 高级Purge: 发送DELETE 到manager uri

基础Purge: 删除一个特定URL

curl -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

高级Purge: 通过name删除

可以通过带上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

高级Purge: 通过host删除

通过带上nuster-hostheader来删除所有属于这个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

高级Purge: 通过path删除

默认情况下,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

高级Purge: 通过正则删除

也可以通过正则删除,所有匹配正则的缓存将被删除。

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 注意事项

  1. 开启访问控制

  2. 如果有多个header,按照namepath & hostpathregex & hostregexhost的顺序处理

    curl -X DELETE -H "name: rule1" -H "path: /imgs/a.jpg": purge by name

  3. 如果有重复的header,处理第一个

    curl -X DELETE -H "name: rule1" -H "name: rule2": purge by rule1

  4. regex 不是 glob

    比如 /imgs下的.jpg文件是^/imgs/.*\.jpg$ 而不是 /imgs/*.jpg

  5. 通过rule name或proxy name删除缓存时,需要注意这两种方法只在当前进程有效。如果重启了进程则无法通过这两种方法删除缓存文件,因为rule name信息和proxy name信息并没有保存在缓存文件中。

  6. 只有disk load结束后才能通过host or path or regex 来删除缓存文件。是否已经load结束可以查看stats URL。

Store

Nuster(cache和nosql) 支持多种后端存储. 目前支持memory和disk。计划添加其他后段。

Memory

数据被存在一个大小由data-size定义的内存区域。重启后数据会消失。

Disk

数据被存到硬盘由dir定义的目录下。重启后数据不会消失。

有三种模式:

  • off: 默认,不保存到硬盘
  • on: 保存到硬盘
  • sync: 需要设置memory on。先保存至内存然后由master进程在一定时间后同步到硬盘,每次同步dict-saver个缓存。

Sample fetches

Nuster 加入了一些新的sample fetches

[cache] nuster.cache.hit: boolean

表示是否是HIT缓存,可以像如下使用

http-response set-header x-cache hit if { nuster.cache.hit }

[cache|nosql] nuster.host: string

类似HAProxy的 req.hdr(Host),但是请求和响应中都可使用

[cache|nosql] nuster.uri: string

等同于HAProxy的capture.req.uri.

[cache|nosql] nuster.path: string

类似HAProxy的 path,但是请求和响应中都可使用

[cache|nosql] nuster.query: string

类似HAProxy的 query,但是请求和响应中都可使用

FAQ

无法启动,报错: not in master-worker mode

global 添加 master-worker 或者启动时使用-W参数。

如何调试?

global添加debug, 或者带-d启动nuster

nuster相关的调试信息以[nuster开头

如何缓存POST请求?

添加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

如何开启HTTP2?

bind :443 ssl crt pub.pem alpn h2,http/1.1

Example

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

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (9)

加载中
可以加上支持限流的相关功能,例如:固定窗口,滑动窗口,取令牌,令牌桶漏斗等
2019/01/16 10:05
回复
举报
这个方案。。。连集群都没有的样子 看上去是打算在客户端做这些了。。。。
2019/10/05 00:18
回复
举报
集群只是部署策略,像这种类似nginx的软件本身都是支持集群的
2019/10/08 11:34
回复
举报
nginx的集群?那是因为nginx默认是被认为是无状态的 而nuster是一个存储方案 存储方案是最具代表性的有状态后端组件 跟他是不是http协议的可没有关系 nginx默认说的集群 本来就只是个配置文件一致的 无状态实例 一般是接在一个高性能七层或者 更常见的硬件四层 lb 组件的后面 无状态的集群怎么能简单的跟存储的集群去相比。。。。
2019/10/09 21:48
回复
举报
mysql的集群方案 基础之一就是主备模式需要的 服务器端节点间 数据复制 以及 分片集群模式 需要的 中间代里层入口 前者是必然要有的任何一种集群 数据冗余 高可用 都必须有节点间数据复制 没有这个的nuster。。。。算不上一个合格的存储方案 几乎。。。咳咳
2019/10/10 00:28
回复
举报
一个存储 没有节点间数据复制这种冗余的基础功能 连客户端分片集群都很难搞起来的
2019/10/10 00:32
回复
举报
仔细又看了你第一条对这组件的评论感觉。。。。。。你把这货当作网关在想 就没想过作为存储 连基本的节点复制都没提供。。。。
2019/10/13 20:30
回复
举报
首先它不是单独作为一个存储来用的,其次作为网关采用基本的单机缓存是为了减少磁盘IO
2019/10/29 09:52
回复
举报
RESTful NoSQL 。。。。。 我以为nosql 都起码该算是一种存储呢。。。。。
2019/10/30 20:48
回复
举报
更多评论
发表于开发技能专区
07/09 09:03

nuster v5.2.0.22 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 中文 readme:https://github.com/ji...

2
7
发表于AI & 大数据专区
05/19 18:08

nuster v5.0.8.21 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 中文 readme:https://github.com/ji...

1
13
发表于服务端专区
05/04 08:45

nuster v5.0.5.21 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 中文 readme:https://github.com/ji...

0
15
发表于服务端专区
04/13 22:12

nuster v5.0.1.21 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 中文 readme:https://github.com/ji...

0
5
发表于运维专区
02/12 09:30

nuster v3.2.2.19 发布,高性能缓存服务器  

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 Fixed Fix incorrect rule compariso...

4
2
发表于服务端专区
2019/10/04 09:04

nuster v3.1.0.19 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 ### Added * nuster.cache.hit sampl...

4
19
发表于服务端专区
2019/07/30 08:58

高性能缓存服务器 nuster v3.0.0.19 发布,支持硬盘持久化   

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 这次更新主要添加对硬盘持久化的支持 ...

2
11
发表于服务端专区
2019/01/16 07:50

高性能缓存服务器 nuster v2.0.6.18 发布  

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 Upgrade to HAProxy v1.8.17 Changed...

0
13
发表于开发技能专区
2018/12/10 08:26

高性能缓存服务器 nuster v2.0.4.18 发布

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 Fix some init issues Fixed uniniti...

0
19
发表于开发技能专区
2018/10/09 09:33

nuster v2.0.3.18 发布,高性能缓存服务器

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 主要更新如下: Fixed Fix #28, stall...

1
6
发表于DevOps专区
2018/08/16 07:49

高性能缓存服务器 nuster v2.0.2.18 发布

nuster 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 主要更新如下: Fixed Fix #24, segfa...

6
6
发表于运维专区
2018/08/06 08:12

高性能缓存服务器 NuSTER v2.0.1.18 发布

NuSTER 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 https://github.com/jiangwenyuan/nu...

5
4
发表于开发技能专区
2018/07/09 10:16

NuSTER v2.0.0.18 发布,新增 NoSQL 模式

NuSTER 是一个基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓存服务器,既可以用作类似 Varnish 或者 Nginx 那样的 HTTP 缓存服务器,来缓存动态或者静态的 HTTP 资源,也可以用作 RESTful NoSQL 缓存服务器, 用 HTTP POST/GET/DELETE 来 添加 /取得 /删除 Key/Value。 https://github.com/jiangwenyuan/nu...

4
7
发表于DevOps专区
2018/06/10 06:05

高性能缓存服务器 nuster v1.8.8.3 和 v1.7.11.3 发布

高性能缓存服务器 nuster v1.8.8.3 和 v1.7.11.3 发布。本次更新主要修复了 一个配置文件解析的bug。 Broken rule key parser in config file (Thanks to Nelson) 介绍 nuster 是一个基于 HAProxy 的高性能缓存服务器。nuster 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。特性包括 完全兼...

0
4
发表于软件架构专区
2018/05/29 08:51

高性能缓存服务器 nuster v1.8.8.2 和 v1.7.11.2 发布

高性能缓存服务器 nuster v1.8.8.2 和 v1.7.11.2 发布。本次更新主要修复了两个比较隐蔽的 bug。 项目主页 https://github.com/jiangwenyuan/nuster Fixed Rare case segfault when comparing a valid entry with null entry->key (Thanks to Martin) Incorrect address when appending separator to long cache key (T...

2
7
发表于DevOps专区
2018/05/08 08:43

高性能缓存服务器 nuster v1.8.8.1 支持 HTTP/2,多线程

高性能缓存服务器 nuster v1.8.8.1 已发布。本次更新主要是升级到 HAProxy v1.8.8, 支持 HTTP/2 和多线程。 项目主页 https://github.com/jiangwenyuan/nuster 介绍 nuster 是一个基于 HAProxy 的高性能缓存服务器。nuster 完全兼容 HAProxy,并且利用 HAProxy 的 ACL 功能来提供非常细致的缓存规则。特性包括 完全兼容 ...

6
12
发表于运维专区
2018/04/24 08:27

高性能缓存服务器 nuster v1.7.10.1 发布

高性能缓存服务器 nuster v1.7.10.1 已发布。本次更新主要升级到 HAProxy v1.7.10, 更改了配置文件关键字,删除了 share 关键字, 为升级到 HAProxy v1.8 进行了代码重构。这应该是 1.7 版本的最后一次更新,下次主要是升级到 1.8,添加 HTTP2 功能。 本次更新 Added Upgrade to HAProxy v1.7.10 Proxy mode Changed Refa...

0
10
发表于运维专区
2018/04/02 10:14

高性能缓存服务器 nuster 1.7.9.9 添加缓存 stats 功能

高性能缓存服务器 nuster 1.7.9.9 已发布。本次更新主要添加缓存 stats 功能,修复一个安全漏洞。 项目主页 https://github.com/jiangwenyuan/nuster 本次更新 1.7.9.9 - 2018-04-01 Added Cache stats applet Various cache stats Changed Separate cache manager file/applet Rename manager_uri to uri for reuse Sim...

0
7
发表于AI & 大数据专区
2018/03/21 12:39

Nuster 1.7.9.8 发布,高性能缓存服务器

高性能 Web 缓存服务器 nuster 1.7.9.8 已发布。本次更新主要添加根据 Host, 根据 Path 和根据正则来删除缓存的功能。 本次更新 Added Purge cache by host Purge cache by path Purge cache by regex Changed Incorrect host and path of cache.entry 介绍 nuster 是一个基于 HAProxy 的高性能 web 缓存服务器。nuster ...

0
4
发表于AI & 大数据专区
2018/03/13 08:30

高性能缓存服务器 nuster 1.7.9.7 发布

高性能 Web 缓存服务器 nuster 1.7.9.7 已发布。本次更新主要添加删除全部缓存,根据后端代理名字,根据缓存规则名字删除缓存的功能。 本次更新 ---------- ### Added - Purge all cache (`curl -X PURGE -H "name: *"`) - Purge the cache belong to a proxy (`curl -X PURGE -H "name: proxy-name"`) - Purge the cach...

4
10
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表于运维专区
2018/06/13 08:46

web缓存服务器HTTP2性能测试: nuster vs nginx

简单的用 `h2load`测试了[nuster](https://github.com/jiangwenyuan/nuster)和nginx的http/2下的缓存性能,结果显示RPS(每秒请求数)nuster差不多是nginx的3倍 码云:https://gitee.com/nuster/nuster data size | CONN | nuster | nginx --------- | ---- | ------ | ----- 12(hello world) | 1000 | 338924 | 110419 ...

0
0
发表于DevOps专区
2018/05/31 10:37

根据 JWT 的 key 和 URL 决定是否缓存 HTTP 请求

## 需求 根据JWT的key和URL决定是否缓存HTTP请求 比如JWT里 ``` payload: { "iss": "iss", "sub": "sub", "userGroupID": "{userGroupID}" } ``` 然后请求 https://myapi.example.com/groups/{groupID}/cars 如果 userGroupID和groupID一样,则缓存,否则不缓存 ## 解决方案 使用 https://github.com/jiangwenyuan/nust...

0
7
发表了博客
2019/12/24 13:48

运维工程师基础知识原理

MySQL主从原理 MySQL主从主要涉及了两个线程:IO线程和SQL线程           两个日志: 二进制日志(binlog)和中继日志(relaylog) MySQL主上写入内容,内容会存储至log-bin日志中。MySQL从会通过IO线程,从MySQL主上拿到数据, 并且将数据存储到relay-log日志中,再通过SQL线程将relay-log日志中拿到的数据进...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
9 评论
131 收藏
分享
返回顶部
顶部