开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
Nuster首页、文档和下载 - 基于 HAProxy 的高性能缓存服务器 - 开源中国社区
全部项目分类
我要评价
GPL
C/C++
Linux
nuster
分享
收藏
84 人收藏
收录时间:2017-11-02
Nuster 详细介绍

Nuster是一个基于HAProxy的高性能缓存服务器

介绍

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

  • 完全兼容HAProxy,支持所有HAProxy的特性和功能

  • 强大的动态缓存功能

    • 根据HTTP method, uri, path, query, header, cookie等等进行缓存

    • 根据HTTP 请求和响应内容等等进行缓存

    • 根据环境变量服务器状态等等进行缓存

    • 根据SSL版本, SNI等等进行缓存

    • 根据连接数量,请求速率等等进行缓存

    • 等等

  • 非常快

  • 删除缓存

  • 前后端HTTPS

  • HTTP压缩

  • HTTP重写重定向

性能

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

安装

make TARGET=linux2628
make install

具体参照HAProxy README

Docker

docker pull nuster/nuster
docker run -d -v /path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro -p 8080:8080 nuster/nuster:1.7.9.3

使用方法

global中添加cache on, 然后在backendlisten中添加cache filter和cache rule

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

指令

cache

syntax: cache on|off [share on|off] [data-size size] [dict-size size] [purge-method method]

default: none

context: global

控制是否开启缓存。

share on|off用来定义是否使用共享内存。

当share为on时将会创建一个大小为data-size + dict-size的共享内存区域,用来保存缓存数据,key和一些开销。多进程时,默认为on。

当share为off时,缓存数据会被保存在内存池,data-size表示最大可使用内存。单进程时默认为off。

data-size

share为on时,和dict-size一起决定共享内存大小。

share为off时,决定缓存可以使用的最大内存。

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

dict-size

只在share on模式下有用,决定hash table的大小。在share off时没用,share off模式下hash table会自动扩容。

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

仅仅决定hash table的大小,并非key的数量。key是保存于共享内存其数量由共享内存大小决定。

可以将dict-size指定为大约的key的数目乘以8,如果实际的key数目超过hashtable的大小,性能可能会稍微受影响。

purge-method

指定purge的http方法,默认是PURGE,可以指定自己的方法比如 MYPURGE

filter cache

syntax: filter cache [on|off]

default: on

context: backendlisten

定义一个cache filter, 另外cache-rule也需要添加。 可以为多个代理添加,并单独设置某个代理的缓存是否开启。 如果定义了多个filter,需要把cache filter放在最后。

cache-rule

syntax: cache-rule name [key KEY] [ttl TTL] [code CODE] [if|unless condition]

default: none

context: backendlisten

定义缓存规则。可以同时定义多个,但是需要注意顺序,匹配则会停止测试。

acl pathA path /a.html
filter cache
cache-rule all ttl 3600
cache-rule path01 ttl 60 if pathA

path01这条规则永远不会执行,因为all会匹配所有的规则。

name

定义一个名字。

key KEY

定义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

默认key是method.scheme.host.path.delimiter.query.body

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就会得到GEThttpwww.example.com/q?name=X&type=Y, 而 key method.scheme.host.path.header_ASDF.cookie_user.param_type则会生成 GEThttpwww.example.com/qZnusterY

一个请求的key能在缓存中找到则返回缓存内容。

ttl TTL

定义key的失效时间,可以使用 dhm and s。默认3600秒. 如果不希望失效则设为0

code CODE1,CODE2...

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

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

if|unless condition

定义ACL条件 详见HAProxy configuration7. Using ACLs and fetching samples

FAQ

如何调试?

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

缓存相关的调试信息以[CACHE]开头

如何缓存POST请求?

添加option http-buffer-request

如果自定义了key的话需要使用body关键字

请求body可能不完整,详见HAProxy configuration 的 option http-buffer-request小节

另外可以为post请求单独设置一个后端

如何PURGE缓存?

curl -X PURGE http://127.0.0.1/asdf

Example

global
    cache on data-size 100m
    #daemon
    ## to debug cache
    #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
    filter cache

    # cache /search for 120 seconds. Only works when POST/PUT
    cache-rule rpost ttl 120 if pathPost

    server s1 10.0.0.10:8080
backend app1b
    balance     roundrobin
    mode http

    filter cache on

    # cache /a.jpg, not expire
    acl pathA path /a.jpg
    cache-rule r1 ttl 0 if pathA

    # cache /mypage, key contains cookie[userId], so it will be cached per user
    acl pathB path /mypage
    cache-rule r2 key method.scheme.host.path.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
    cache-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
    cache-rule heavy ttl 100 if heavypage tooFast 

    # cache all if response's header[asdf] is fdsa
    acl resHdrCache2 res.hdr(asdf)  fdsa
    cache-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
    filter cache off
    cache-rule all

    server s2 10.0.0.11:8080

listen web3
    bind *:8082
    mode http

    filter cache
    cache-rule everything

    server s3 10.0.0.12:8080

约定

  1. 有相同文件名时,Nuster使用以.md结尾的文档

Nuster

选择将代码托管在码云
你还在等什么

可能是中国最大最好的代码托管平台


大家对 Nuster 的评论 (全部 0 条评论)
{{repayCom.userName}}
顶部