前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高性能缓存服务器 Nuster

高性能缓存服务器 Nuster

作者头像
Debian中国
发布2018-12-20 15:54:06
1.7K0
发布2018-12-20 15:54:06
举报
文章被收录于专栏:Debian中国Debian中国

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

  • 请求地址为某某时缓存
  • 请求参数中的 X 为 Y 时缓存
  • 响应头中的 X 为 Y 时缓存
  • 请求速率超过多少时缓存
  • 等等

Nuster 性能评测

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

安装 Nuster

代码语言:javascript
复制
git clone https://github.com/jiangwenyuan/nuster.git
cd nuster
make TARGET=linux2628
make install

详情请参照 HAProxy README

Naster 使用方法

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

(adsbygoogle = window.adsbygoogle || []).push({});

Naster 指令

cache

syntax: cache on|off [data-size size]

default: none

context: global

控制是否开启缓存。 可以设置data-size来控制缓存数据的内存使用量。可以使用mMg 和 G. 默认是 1MB,同时也是最小使用量。只有 http 内容计算在内,并不包括使用缓存带来的内存开销。

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

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

代码语言:javascript
复制
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
  • path: the URL path of the request
  • 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.query.body

Example

代码语言:javascript
复制
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
  • path: /q
  • query: name=X&type=Y
  • header_ASDF: Z
  • cookie_user: nuster
  • param_type: Y
  • body: (empty)

所以默认的 key 就会得到GEThttpwww.example.com/qname=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会缓存任何状态码。

代码语言:javascript
复制
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

常见问题

如何调试?

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

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

如何缓存 POST 请求?

添加option http-buffer-request

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

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

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

配置样例

代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nuster 性能评测
  • 安装 Nuster
  • Naster 使用方法
  • Naster 指令
    • cache
      • filter cache
        • cache-rule
          • name
          • key KEY
          • ttl TTL
          • code CODE1,CODE2…
          • if|unless condition
      • 常见问题
        • 如何调试?
          • 如何缓存 POST 请求?
          • 配置样例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档