nuster 基于 HAProxy 的高性能 HTTP 缓存服务器和 RESTful NoSQL 缓开源项目

我要开发同款
匿名用户2017年11月02日
144阅读
开发技术C/C++
所属分类服务器软件、Web加速缓存软件
授权协议GPL

作品详情

nusterWiki | English | 中文 | 日本語

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

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

目录介绍性能入门指南使用方法指令CacheNoSQL管理统计开启关闭rule更新生存时间清除StoreSamplefetchesFAQ介绍nuster是一个基于HAProxy的高性能HTTP缓存服务器和RESTfulNoSQL缓存服务器,完全兼容HAProxy,并且利用HAProxy的ACL功能来提供非常细致的缓存规则。

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

继承了HAProxy的所有特性,完全兼容HAProxy负载均衡前端后端HTTPSHTTP压缩HTTP重写重定向HTTP信息增删改HTTP2监控粘性访问控制内容切换HTTP缓存服务器nuster也可以用作类似Varnish或者Nginx那样的HTTP缓存服务器,来缓存动态或者静态的HTTP资源。

HAProxy的所有特性(HTTPS,HTTP/2,ACL,etc)非常快强大的动态缓存功能基于HTTPmethod,URI,path,query,header,cookies,etc基于HTTPrequestorresponsecontents,etc基于environmentvariables,serverstate,etc基于SSLversion,SNI,etc基于connectionrate,number,byte,etc缓存管理缓存清除缓存统计信息缓存生存时间持久化RESTfulNoSQL缓存服务器nuster也可以用作RESTfulNoSQL缓存服务器,用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下载最新稳定版,其他情况可以gitclone。

编译makeTARGET=linux2628USE_LUA=1LUA_INC=/usr/include/lua5.3USE_OPENSSL=1USE_PCRE=1USE_ZLIB=1makeinstallPREFIX=/usr/local/nuster

添加USE_PTHREAD_PSHARED=1使用pthread

如果不需要可以删除USE_LUA=1LUA_INC=/usr/include/lua5.3USE_OPENSSL=1USE_PCRE=1USE_ZLIB=1

具体可以参考HAProxyINSTALL。

配置文件准备一个配置文件: nuster.cfg

globalnustercacheondata-size100mnusternosqlondata-size200mmaster-worker#v3defaultsmodehttpfrontendfebind*:8080#bind*:4433sslcrtexample.com.pemalpnh2,http/1.1use_backendbe2if{path_beg/_kv/}default_backendbe1backendbe1nustercacheonnusterruleimgttl1dif{path_beg/img/}nusterruleapittl30sif{path/api/some/api}servers1127.0.0.1:8081servers2127.0.0.1:8082backendbe2nusternosqlonnusterruler1ttl3600nuster监听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-fnuster.cfg

Dockerdockerpullnuster/nusterdockerrun-d-v/path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro-p8080:8080nuster/nuster使用方法nuster基于HAProxy,支持所有的HAProxy指令。

基本配置文件里有四个基本的sections: global, defaults, frontend and backend。

global定义全局指令需要定义nustercacheon or nusternosqlon,否则cache和nosql无法使用defaults定义frontend, backend的默认参数可以在frontend or backend section重新定义frontend定义监听端口等等面向用户的设置bankend定义后端服务器等等设置需要设置nustercacheon or nusternosqlon,否则该backend没有nosql或者nosql功能需要设置nusterrule可以定义多个frontend or backend .如果定义了nustercache|nosqloff或者没有nustercache|nosqlon|off,nuster就是一个HAProxy。

无法在listen里定义nuster。

具体参考/doc下的HAProxy文档,或者在线HAProxy文档

AsTCPloaderbalancerfrontendmysql-lbbind*:3306modetcpdefault_backendmysql-clusterbackendmysql-clusterbalanceroundrobinmodetcpservers110.0.0.101:3306servers210.0.0.102:3306servers310.0.0.103:3306AsHTTP/HTTPSloaderbalancerfrontendweb-lbbind*:80#bind*:443sslcrtXXX.pemmodehttpdefault_backendappsbackendappsbalanceroundrobinmodehttpservers110.0.0.101:8080servers210.0.0.102:8080servers310.0.0.103:8080#servers410.0.0.101:8443sslverifynoneAsHTTPcacheserverglobalnustercacheondata-size200mfrontendfebind*:8080default_backendbebackendbenustercacheonnusterruleallservers1127.0.0.1:8081AsRESTfulNoSQLcacheserverglobalnusternosqlondata-size200mfrontendfebind*:8080default_backendbebackendbenusternosqlonnusterruler1ttl3600指令global:nustermanagersyntax:

nustermanageron|off[uriURI][purge-methodmethod]

default: off

context: global

定义并开启manager/stats/purgeAPI,uri和purgemethod。

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

具体请参考管理.

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

purge-method自定义PURGE用的HTTPmethod,默认是 PURGE.

global:nustercache|nosqlsyntax:

nustercacheon|off[data-sizesize][dict-sizesize][dirDIR][dict-cleanern][data-cleanern][disk-cleanern][disk-loadern][disk-savern]

nusternosqlon|off[data-sizesize][dict-sizesize][dirDIR][dict-cleanern][data-cleanern][disk-cleanern][disk-loadern][disk-savern]

default: none

context: global

控制是否开启cache或者nosql。

会分配一块data-size+dict-size的共享内存来存储HTTP头,数据,key等等,临时数据从系统内存池分配。如果没有足够内存,新的请求不会被缓存直到有内存被释放。

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

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

dict-size决定hashtable的大小.

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

这个决定hashtablebuckets的大小,并非key的大小,key存在共享内存中。

dict-size(bucket数) 不等于 key数.就算key的数量超过了dict-size,只要整个共享内存有空间,新的key仍然可以被添加。

不过如果key数超过dict-size(bucket数)性能也许会下降.dict-size可以设为大概的最大key数乘以8。当然越大越好。

查看statsAPI:

dict.nosql.length:131072dict.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:nustercache|nosqlsyntax:

nustercache[on|off]

nusternosql[on|off]

default: on

context: backend

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

proxy:nusterrulesyntax:

nusterrulename[keyKEY][ttlTTL][extendEXTEND][codeCODE][memoryon|off][diskon|off|sync][etagon|off][last-modifiedon|off][if|unlesscondition]

default: none

context: backend

定义cache/nosql的生效条件,需要定义至少一个rule。

nustercacheon#cacherequest`/asdf`for30secondsnusterruleasdfttl30if{path/asdf}#cacheiftherequestpathbeginswith/img/nusterruleimgif{path_beg/img/}#cacheiftheresponseheader`cache`is`yes`aclresHdrCacheres.hdr(cache)yesnusterruler1ifresHdrCache可以定义多个rule,按定义顺序先后匹配。

aclpathApath/a.htmlnustercacheonnusterruleallttl3600nusterrulepath01ttl60ifpathArule path01永远不会被匹配。

name定义rule的name。

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

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

method:httpmethod,GET/POST...scheme:httporhttpshost:thehostintherequesturi:firstslashtoendoftheurlpath:theURLpathoftherequestdelimiter:'?'ifqueryexistsotherwiseemptyquery:thewholequerystringoftherequestheader_NAME:thevalueofheader NAMEcookie_NAME:thevalueofcookie NAMEparam_NAME:thevalueofquery NAMEbody:thebodyoftherequestCACHE的默认key是 method.scheme.host.uri,NoSQL的默认key是 GET.scheme.host.uri.

Example

GEThttps://www.example.com/q?name=X&type=Yhttpheader:GET/q?name=X&type=YHTTP/1.1Host:www.example.comASDF:ZCookie:logged_in=yes;user=nuster;生成:

method:GETscheme:httphost: www.example.comuri:/q?name=X&type=Ypath:/qdelimiter:?query:name=X&type=Yheader_ASDF:Zcookie_user:nusterparam_type:Ybody:(empty)默认key产生GET\0http\0www.example.com\0/q?name=X&type=Y\0,而keymethod.scheme.host.path.header_ASDF.cookie_user.param_type 则生成 GET\0http\0www.example.com\0/q\0Z\0nuster\0Y\0.

\0是NULL字符

相同key的请求则会直接返回cache给客户端。

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

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

extendEXTEND自动延长缓存ttl。

格式extendon|off|n1,n2,n3,n4

默认:off.

n1,n2,n3,n4:小于100的正整数,n1+n2+n3之和也小于100.他们定义四个时间段:

time:0ttlttl*(1+n4%)access:|A1|A2|A3|A4|||---------------------------|---------|---------|---------|---------|percentage:|<-(100-n1-n2-n3)%->|<-n1%->|<-n2%->|<-n3%->|<-n4%->|满足下列条件缓存的ttl将被延长:

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

on 其实是33,33,33,33

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

cache-ruleonly200cache-rule200and404code200,404cache-ruleallcodeallmemoryon|off是否保存数据到内存,默认on。

详见Store

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

需要设置memoryon 以使用 disksync

详见Store

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

默认off.

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

默认off.

if|unlesscondition定义ACL条件

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

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

在请求阶段ACL为真请求阶段ACL为假,但是响应阶段ACL为真当使用否定的ACL或者某些样本获取方法时,需要特别注意

比如

缓存以/img/开头的请求

nusterruleimgif{path_beg/img/}

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

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

nusterrulejpegif{res.hdr(Content-Type)image/jpeg}

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

以/img/开头,并且响应头 Content-Type 为image/jpeg时缓存如果定义为下面的规则,则不会成功:

nusterruleimgif{path_beg/img/}{res.hdr(Content-Type)image/jpeg}因为在响应阶段无法获取path所以永远为假,而在请求阶段无法获取res.hdr所以永远为假,那么这个ACL就永远无法匹配。

需要如下来定义:

http-requestset-var(txn.pathImg)pathaclpathImgvar(txn.pathImg)-mbeg/img/aclresHdrCTres.hdr(Content-Type)image/jpegnusterruler3ifpathImgresHdrCT或者nuster.path(v5):

nusterruler3if{nuster.path-mbeg/img}{res.hdr(Content-Type)image/jpeg}另一个例子,缓存所有不以 /api/ 开头的请求下面不正确:

aclNoCachepath_beg/api/nusterruler3if!NoCache因为虽然在响应阶段path并不存在,所以NoCache永远为假,而 !NoCache 为真,所有的请求都会被缓存。

需要改成:

http-requestset-var(txn.path)pathaclNoCachevar(txn.path)-mbeg/api/nusterruler1if!NoCache新samplefetch详见Samplefetches

详见HAProxyconfiguration的7.UsingACLsandfetchingsamples

Cachenuster也可以用作类似Varnish或者Nginx那样的HTTP缓存服务器,来缓存动态或者静态的HTTP资源。出了HAProxy的SSL,HTTP,HTTP2,重写重定向,增删改Header等等,还提供了下面的功能。

globalnustercacheondata-size200mfrontendfebind*:8080default_backendbebackendbenustercacheonnusterruler1if{path/a1}nusterruler2keymethod.scheme.host.path.delimiter.query.cookie_userIdif{path/a2}nusterruler3ttl10if{path/a3}nusterruler4diskonlyif{path/a4}servers1127.0.0.1:8081nuster会依次检查rule,先生成key然后查找,如果找到则返回缓存,否则就测试ACL,如果ACL通过则缓存响应。

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

基本操作Setcurl-v-XPOST-dvalue1https://127.0.0.1:8080/key1curl-v-XPOST--data-binary@icon.jpghttps://127.0.0.1:8080/imgs/icon.jpgGetcurl-vhttps://127.0.0.1:8080/key1

Deletecurl-v-XDELETEhttps://127.0.0.1:8080/key1

ResponseCheckstatuscode.

200OKPOST/GET:成功DELETE:总是400Badrequest空值不正确的acl,rules,etc404NotFoundPOST:ruletests失败GET:notfound405MethodNotAllowed其他的methods500InternalServerError发生未知错误507InsufficientStorage超过data-size分用户的data通过在key里加入header,cookie等等,可以将不同的用户数据存到相同的路劲。

nusterruler1keymethod.scheme.host.uri.header_userIdif{path/mypoint}nusterruler2keymethod.scheme.host.uri.cookie_sessionIdif{path/mydata}Setcurl-v-XPOST-d"333"-H"userId:1000"https://127.0.0.1:8080/mypointcurl-v-XPOST-d"555"-H"userId:1001"https://127.0.0.1:8080/mypointcurl-v-XPOST-d"userAdata"--cookie"sessionId=ijsf023xe"https://127.0.0.1:8080/mydatacurl-v-XPOST-d"userBdata"--cookie"sessionId=rosre329x"https://127.0.0.1:8080/mydataGetcurl-vhttps://127.0.0.1:8080/mypoint<404NotFoundcurl-v-H"userId:1000"https://127.0.0.1:8080/mypoint<200OK333curl-v--cookie"sessionId=ijsf023xe"https://127.0.0.1:8080/mydata<200OKuserAdata客户端支持任何支持HTTP的客户端,库: curl, postman,python requests,go net/http,etc.

管理可以通过uri定义一个endpoint并发送HTTP请求来进行管理。

定义并且开启

nustermanageronuri/internal/nusterpurge-methodPURGEX方法一览METHODEndpointdescriptionGET/internal/nuster获得statsPOST/internal/nuster开启关闭rule,更新ttlDELETE/internal/nuster高级PurgePURGEX/any/real/path基础Purge统计可以通过GET uri定义的endpoint来获取统计信息。

Usagecurlhttps://127.0.0.1/nuster

Output**NUSTER**nuster.cache:onnuster.nosql:onnuster.manager:on**MANAGER**manager.uri:/nustermanager.purge_method:PURGE**DICT**dict.cache.size:1048576dict.cache.length:131072dict.cache.used:0dict.cache.cleanup_idx:0dict.cache.sync_idx:0dict.nosql.size:1048576dict.nosql.length:131072dict.nosql.used:0dict.nosql.cleanup_idx:0dict.nosql.sync_idx:0**STOREMEMORY**store.memory.cache.size:2098200576store.memory.cache.used:1048960store.memory.cache.count:0store.memory.nosql.size:11534336store.memory.nosql.used:1048960store.memory.nosql.count:0**STOREDISK**store.disk.cache.dir:/tmp/nuster/cachestore.disk.cache.loaded:yesstore.disk.nosql.dir:/tmp/nuster/nosqlstore.disk.nosql.loaded:yes**STATS**stats.cache.total:0stats.cache.hit:0stats.cache.fetch:0stats.cache.abort:0stats.cache.bytes:0stats.nosql.total:0stats.nosql.get:0stats.nosql.post:0stats.nosql.delete:0**PROXYcacheapp1**app1.rule.rule1:state=onmemory=ondisk=offttl=10app1.rule.rule2:state=onmemory=ondisk=onttl=10app1.rule.rule3:state=onmemory=ondisk=syncttl=10app1.rule.rule4:state=onmemory=offdisk=onttl=10app1.rule.rule5:state=onmemory=offdisk=offttl=10**PROXYnosqlapp2**app2.rule.ruleA:state=onmemory=ondisk=offttl=10app2.rule.ruleB:state=onmemory=ondisk=onttl=10app2.rule.ruleC:state=onmemory=ondisk=syncttl=10app2.rule.ruleD:state=onmemory=offdisk=onttl=10app2.rule.ruleE:state=onmemory=offdisk=offttl=10开启关闭rulerule可以通过manageruri动态开启关闭,关闭的rule不会再进行匹配。

headers

headervaluedescriptionstateenableenablerule disabledisablerulenameruleNAMEtheruletobeenabled/disabled proxyNAMEallrulesofproxyNAME *allrules相同name的rule都会被开启关闭。

Examples

关闭ruler1

curl-XPOST-H"name:r1"-H"state:disable"https://127.0.0.1/nuster

关闭backendapp1b的所有rule

curl-XPOST-H"name:app1b"-H"state:disable"https://127.0.0.1/nuster

开启所有的rule

curl-XPOST-H"name:*"-H"state:enable"https://127.0.0.1/nuster

更新生存时间更改TTL,只会影响后续的新缓存,不会影响已经存在的缓存。

headers

headervaluedescriptionttlnewTTLsee ttl in nusterrulenameruleNAMEtheruletobechanged proxyNAMEallrulesofproxyNAME *allrulesExamples

curl-XPOST-H"name:r1"-H"ttl:0"https://127.0.0.1/nustercurl-XPOST-H"name:r2"-H"ttl:2h"https://127.0.0.1/nuster同时设置state和ttl同时设置state和ttl

curl-XPOST-H"name:r1"-H"ttl:0"-H"state:enabled"https://127.0.0.1/nuster清除有两种清除模式:

基础Purge:发送 purge-methodMYPURGE 定义的方法到想要删除的Path高级Purge:发送DELETE到manageruri基础Purge:删除一个特定URLcurl-XPURGEhttps://127.0.0.1/imgs/test.jpg

根据rule生成key并删除那个key。只对GET请求生成的缓存有效。

默认key包含Host,如果缓存时用了https://example.com/test 而在localhost删除是需要Host header:

curl-XPURGE-H"Host:example.com"https://127.0.0.1/test

对cache和nosql都有效,nosql模式相当于 DELETE。

高级Purge:通过name删除可以通过带上name header来 PURGE

headers

headervaluedescriptionnamenusterruleNAMEcachesofrule${NAME}willbepurged proxyNAMEcachesofproxy${NAME} *allcachesExamples

#删除所有缓存curl-XDELETE-H"name:*"https://127.0.0.1/nuster#删除backendapplb的所有缓存curl-XDELETE-H"name:app1b"https://127.0.0.1/nuster#删除所有ruler1生成的缓存curl-XDELETE-H"name:r1"https://127.0.0.1/nuster高级Purge:通过host删除通过带上nuster-hostheader来删除所有属于这个host的缓存。

headers

headervaluedescriptionhostHOSTthe${HOST}nuster-hostHOSTnuster-host存在则使用nuster-hostmodecache,nosqlpurgecacheornosqldataExamples

curl-XDELETE-H"nuster-host:127.0.0.1:8080"https://127.0.0.1/nuster高级Purge:通过path删除默认情况下,query部分也包含在key中,所以相同的path不同的query会产生不同的缓存。

比如nusterruleimgsif{path_beg/imgs/},然后请求

curlhttps://127.0.0.1/imgs/test.jpg?w=120&h=120curlhttps://127.0.0.1/imgs/test.jpg?w=180&h=180会生成两个缓存,因为query不一样。

如果要删除这些缓存,可以

如果知道所有的query,那么可以一个一个删除

curl-XPURGEhttps://127.0.0.1/imgs/test.jpg?w=120&h=120curl-XPURGEhttps://127.0.0.1/imgs/test.jpg?w=180&h=180大多数情况下不知道所有的query

如果query部分不重要,则可以从key里面删除query

定义nusterruleimgskeymethod.scheme.host.pathif{path_beg/imgs},这样的话只会生成一个缓存,那么就可以不用query删除缓存

curl-XPURGEhttps://127.0.0.1/imgs/test.jpg

大多数情况需要query

通过rulename删除

curl-XPURGE-H"name:imgs"https://127.0.0.1/nuster/cache

但是如果rule被定义成了 nusterrulestaticif{path_beg/imgs//css/},则无法只删除imgs

因此,可以通过path删除

headers

headervaluedescriptionpathPATHcacheswith${PATH}willbepurgedhostHOSTandhostis${HOST}nuster-hostHOSTnuster-hosthashigherprecedenceoverhostmodecache,nosqlpurgecacheornosqldataExamples

#删除所有path是/imgs/test.jpg的缓存curl-XDELETE-H"path:/imgs/test.jpg"https://127.0.0.1/nuster#删除所有path是/imgs/test.jpg并且host是127.0.0.1:8080的缓存curl-XDELETE-H"path:/imgs/test.jpg"-H"nuster-host:127.0.0.1:8080"https://127.0.0.1/nuster高级Purge:通过正则删除也可以通过正则删除,所有匹配正则的缓存将被删除。

headers

headervaluedescriptionregexREGEXcacheswhichpathmatchwith${REGEX}willbepurgedhostHOSTandhostis${HOST}nuster-hostHOSTnuster-hosthashigherprecedenceoverhostmodecache,nosqlpurgecacheornosqldataExamples

#删除所有/imgs开头.jpg结尾的缓存curl-XDELETE-H"regex:^/imgs/.*\.jpg$"https://127.0.0.1/nuster#deleteallcacheswhichpathstartswith/imgsandendswith.jpgandwithhostof127.0.0.1:8080curl-XDELETE-H"regex:^/imgs/.*\.jpg$"-H"127.0.0.1:8080"https://127.0.0.1/nusterPURGE注意事项

开启访问控制

如果有多个header,按照name, path&host, path, regex&host, regex, host的顺序处理

curl-XDELETE-H"name:rule1"-H"path:/imgs/a.jpg":purgebyname

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

curl-XDELETE-H"name:rule1"-H"name:rule2":purgeby rule1

regex 不是glob

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

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

只有diskload结束后才能通过hostorpathorregex来删除缓存文件。是否已经load结束可以查看statsURL。

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

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

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

有三种模式:

off:默认,不保存到硬盘on:保存到硬盘sync:需要设置memoryon。先保存至内存然后由master进程在一定时间后同步到硬盘,每次同步dict-saver个缓存。SamplefetchesNuster加入了一些新的samplefetches

[cache]nuster.cache.hit:boolean表示是否是HIT缓存,可以像如下使用

http-responseset-headerx-cachehitif{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无法启动,报错:notinmaster-workermode在global 添加 master-worker 或者启动时使用-W参数。

如何调试?在global添加debug,或者带-d启动nuster

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

如何缓存POST请求?添加optionhttp-buffer-request

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

请求body可能不完整,详见HAProxyconfiguration 的 optionhttp-buffer-request小节

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

如何做访问控制?类似

aclnetwork_allowedsrc127.0.0.1aclpurge_methodmethodPURGEhttp-requestdenyifpurge_method!network_allowed如何开启HTTP2?bind:443sslcrtpub.pemalpnh2,http/1.1Exampleglobalnustercacheondata-size100mnusternosqlondata-size100mmaster-worker#v3#daemon#debugdefaultsretries3optionredispatchtimeoutclient30stimeoutconnect30stimeoutserver30sfrontendweb1bind*:8080modehttpaclpathPostpath/searchuse_backendapp1aifpathPostdefault_backendapp1bbackendapp1abalanceroundrobin#modemustbehttpmodehttp#http-buffer-requestmustbeenabledtocachepostrequestoptionhttp-buffer-requestaclpathPostpath/search#enablecacheforthisproxynustercache#cache/searchfor120seconds.OnlyworkswhenPOST/PUTnusterrulerpostkeymethod.scheme.host.uri.bodyttl120ifpathPostservers110.0.0.10:8080backendapp1bbalanceroundrobinmodehttpnustercacheon#cache/a.jpg,notexpireaclpathApath/a.jpgnusterruler1ttl0ifpathA#cache/mypage,keycontainscookie[userId],soitwillbecachedperuseraclpathBpath/mypagenusterruler2keymethod.scheme.host.path.delimiter.query.cookie_userIdttl60ifpathB#cache/a.htmlifresponse'sheader[cache]isyeshttp-requestset-var(txn.pathC)pathaclpathCvar(txn.pathC)-mstr/a.htmlaclresHdrCache1res.hdr(cache)yesnusterruler3ifpathCresHdrCache1#cache/heavyfor100secondsifbe_conngreaterthan10aclheavypagepath/heavyacltooFastbe_connge100nusterruleheavyttl100ifheavypagetooFast#cacheallifresponse'sheader[asdf]isfdsaaclresHdrCache2res.hdr(asdf)fdsanusterruleresCachettl0ifresHdrCache1servers110.0.0.10:8080frontendweb2bind*:8081modehttpdefault_backendapp2backendapp2balanceroundrobinmodehttp#disablecacheonthisproxynustercacheoffnusterruleallservers210.0.0.11:8080frontendnosql_febind*:9090default_backendnosql_bebackendnosql_benusternosqlonnusterruler1ttl3600 
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论