github.com/vicanso/pike@v1.0.1-0.20210630235453-9099e041f6ec/docs/start.md (about) 1 --- 2 description: 如何开始使用pike 3 --- 4 5 Pike是纯go的项目,可以使用各平台的执行文件启动或者已打包好的docker镜像(vicanso/pike),配置信息支持保存在文件或etcd中,生产环境中建议使用etcd便于多实例部署。 6 7 8 ## 启动参数 9 10 ```bash 11 Pike is a http cache server 12 13 Usage: 14 pike [flags] 15 16 Flags: 17 --admin string The address of admin web page, e.g.: :9013 18 --alarm string The alarm request url, alarm will post to the url, e.g.: http://192.168.1.2:3000/alarms 19 --config string The config of pike, support etcd or file, etcd://user:pass@192.168.1.2:2379,192.168.1.3:2379/pike or /opt/pike.yml (default "pike.yml") 20 -h, --help help for pike 21 --log string The log path, e.g.: /var/pike.log or lumberjack:///tmp/pike.log?maxSize=100&maxAge=1&compress=true 22 ``` 23 24 如上所示pike的启动参数如下: 25 26 - admin 管理后台监听地址,用于启动管理后台,建议最少其中一个实例启用管理后台,方便使用WEB管理后台编辑配置 27 - alarm 告警回调服务地址,当upstream的服务器检测失败或配置更新失败等时回调,用于告警通知 28 - config 配置地址,可以用于etcd或者file的形式,建议在生产环境中使用etcd,如果不配置则直接使用文件形式,文件为pike.yml 29 - log 日志目录配置,可以指定单一文件或使用lumberjack按时按文件大小分割日志并压缩 30 31 32 首次启动指定管理后台监听地址为:9013,未指定配置地址(使用pike.yml),启动成功后可以看到在执行目录下生成了一个空白的新文件pike.yml(如果该文件已存在则不新建),之后可以打开`http://127.0.0.1:9013/#/`进行配置。 33 34 ```bash 35 ./pike --admin=:9013 36 ``` 37 38 ## 压缩参数配置 39 40 - `Name` 压缩配置名称,用于区分每个压缩配置,可根据不同的应用场景配置不同的压缩参数,一般只使用一个通用配置则可 41 - `Gzip Level` gzip的压缩级别,如果CPU较为紧张,则可以配置为默认的压缩级别6,如果CPU较为空闲,建议直接配置为最高压缩级别9,减少网络带宽的占用 42 - `Br Level` brotli的压缩级别,由于br的压缩率较高,占用CPU较大,因此一般配置为6则可,具体根据CPU的使用状况可以选择更优的配置方式 43 - `Remark` 备注 44 45 <p align="center"> 46 <img src="./images/add-compress.png"/> 47 </p> 48 49 需要注意,对于缓存数据的压缩会直接使用默认的`bestCompression`的压缩配置,该配置的压缩级别为gzip:9, br:6,如果需要覆盖默认的配置,则直接新配置名为`bestCompression`的配置则可覆盖。缓存的数据只压缩一次而可使用多次,可以选择较高的压缩级别,对于常规的压缩配置,br的压缩级别配置为6则可,如果CPU占用较多,可以选择更小的值,具体各压缩级别耗时可查看模块-压缩模块的说明。 50 51 ## 缓存参数配置 52 53 - `Name` 缓存配置名称,用于区分每个缓存配置,对于请求量特别大的服务,可单独使用一个缓存,其它的服务则共用一个缓存则可 54 - `Size` 缓存数量大小,指定LRU缓存的最大数量,可根据服务的缓存情况以及机器内存选择较为合适的值,一般设置为51200已能满足大部分应用的需求,如果内存较少则设置为更小的值 55 - `HitForPass` 设置hit for pass的缓存时长,对于不可缓存的GET、HEAD请求,为了后续快速判断请求是否hit for pass,缓存中也有保存该请求的缓存状态(hitForPass)。 56 - `Store` 设置缓存持久化存储的方式,暂只支持badger,如`badger:///tmp/badger`表示将缓存保存至`/tmp/badger`目录。如果内存较为空余,可设置LRU的Size为较大的值而不设置Store。 57 - `Remark` 备注 58 59 为什么会有需要hit for pass的场景?考虑一下以下场景,由于产品刚好被下架处理,因此请求产品详情信息时,该接口返回了出错(http status: 400,cache control: no-cache),因此访问该产品的接口缓存为hit for pass,而后续产品上架了,接口正常响应,缓存时长为cache-control: max-age=60,此时接口应该可缓存的。而由于hit for pass未过期,因此只能等hit for pass过期后接口才变为可缓存。 60 61 因此在设置hit for pass的时候需要考虑应用的具体出错处理逻辑,Cache-Control是否无论怎样都不会变化(有一种处理是同样的参数,无论成功失败均使用同样的Cache-Control,这样保证无论成功还是失败,接口均是缓存,避免过多请求),如果是不变的,可以将hit for pass设置为较长的有效期,否则应该选择更短的有效期。 62 63 <p align="center"> 64 <img src="./images/add-cache.png"/> 65 </p> 66 67 ### 缓存的Store配置 68 69 - `badger`:使用badger缓存数据,配置格式为:`badger:///tmp/badger`,表示将数据缓存在`/tmp/badger`目录下。此模式下缓存会以文件的形式持久化,可减少LRU缓存的数据避免占用过多的内存。需要注意如果是启动多个实例,那么多实例间的缓存无法共享 70 - `redis`:使用redis缓存数据,配置格式为:`redis://[:pwd@]host1:port1[,...hostN:portN]/[?timeout=3s&master=master]`。密码`pwd`为只选参数。对于`sentinel`还需要指定master参数。 71 - `mongodb`:使用mongodb缓存数据,配置格式为mongodb的connection string形式,如:`mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]`,增加支持timeout参数指定请求超时。如`mongodb://localhost:27017/pike?timeout=5s`,连接localhost:27017并指定使用db:pike保存缓存数据 72 73 ### redis配置 74 75 - `普通模式`:`redis://:pwd@127.0.0.1:6379/?db=1&timeout=5s&prefix=test`,连接本地127.0.0.1:6379的redis,密码为pwd,使用db:1,并设置超时时间为5秒,key的前缀为test 76 - `sentinel`:`redis://:pwd@127.0.0.1:6379,127.0.0.1:6380/?master=master&mode=sentinel&timeout=5s&prefix=test`,以sentinel的模式连接redis,密码为pwd,master name为master,并设置超时时间为5秒,key的前缀为test 77 - `cluster`:`redis://:pwd@127.0.0.1:6379,127.0.0.1:6380/?mode=cluster&timeout=5s&prefix=test`,以cluster的模式连接redis,密码为pwd,并设置超时时间为5秒,key的前缀为test 78 79 ## Upstream配置 80 81 - `Name` upstream的配置名称,用于区分每个upstream配置 82 - `Health Check` 健康检测的url路径,对于HTTP服务尽量使用特定的url的响应来检测upstream是否可用,如果未配置,则检测地址的端口是否有监听 83 - `Policy` 服务器列表的选择策略,支持四种方式`roundRobin`,`random`, `first`与`leastConn`,一般选择`roundRobin`则可 84 - `Enable H2C` 是否启用HTTP/2 over TCP,upstream的服务支持h2c模式,则可以启用此模式,pike与upstream的服务则使用h2c方式访问 85 - `Accept Encoding` 设置可接受的编码,如果需要节约pike与upstream服务之间访问的网络带宽,可以添加此配置,pike支持编码:`gzip`,`br`,`lz4`,`zst`, 以及`snz` 86 - `Servers.Addr` 服务地址,以http(s)://ip:port的形式配置 87 - `Servers.Backup` 是否备用服务地址,如果设置为备用,则只要在主服务有一个可用时,均不会使用备用服务 88 - `Remark` 备注 89 90 <p align="center"> 91 <img src="./images/add-upstream.png"/> 92 </p> 93 94 ## Location配置 95 96 - `Name` location的配置名称,用于区分每个location配置 97 - `Upstream` 选择对应的upstream 98 - `Prefixes` 配置对应的前缀,可配置多个,前缀的匹配优先级高于host 99 - `Hosts` 配置对应的host,可配置多个 100 - `Rewrites` 转发请求时,需要重写的URL的规则,配置格式为`key:value`的形式,以`:`分割 101 - `QueryStrings` 转发请求时添加至url中querystring,配置格式为`key:value`的形式,以`:`分割 102 - `RespHeaders` 响应头配置,将在所有的响应中添加响应头,配置格式为`key:value`的形式,以`:`分割 103 - `ReqHeaders` 请求头配置,将在所有的请求中添加请求头,配置格式为`key:value`的形式,以`:`分割 104 - `ProxyTimeout` 请求超时配置,用于控制请求转发至upstream的服务中的超时,根据实际场景配置,如:30s,1m等等 105 - `Remark` 备注 106 107 <p align="center"> 108 <img src="./images/add-location.png"/> 109 </p> 110 111 112 ### Rewrite规则 113 114 重写的规则与nginx类似,支持使用正则匹配,如下面的例子: 115 116 - `/api/*:/$1` $1表示*部分,最终的处理就是转发时将/api前缀删除 117 - `/rest/*/user/*:/$1/$2` $1表示第一个*,$2表示第二个*,最终的处理就是转发的时候将/rest与/user替换 118 119 虽然通过正则可以实现各类的重写,但是不建议使用过于复杂的正则,尽可能少用或只用重写来处理前缀,规范url减少重写。 120 121 ### ENV获取配置 122 123 `QueryStrings`,`RespHeaders`以及`ReqHeaders`均支持从ENV中获取值的处理方式,如:`DC:$DC`,$DC表示从ENV中获取DC对应的值。 124 125 ## Server配置 126 127 - `Addr` 监听地址 128 - `Locations` 对应的location列表 129 - `Cache` 缓存,根据应用访问量选择合适的缓存 130 - `Compress` 压缩,根据带宽与CPU的考虑,选择合适的压缩 131 - `Compress Min Length` 最小压缩长度,此值不要设置太少,因为压缩小数据效果并不明显,而且浪费CPU。一般建议设置为1kb,如果是内网间调用,建议此值可以调更大的值 132 - `Compress Content Filter` 压缩数据类型筛选,指定针对哪些数据类型压缩,默认值为:`text|javascript|json|wasm|xml`,可按应用的需求自定义配置或不匹配。 133 - `Log Format` 请求日志格式化配置,如`{remote} {when-iso} {:proxyTarget} {method} {uri} {proto} {status} {<x-status} {size-human} {referer} {userAgent}`,配置规则参考[elton logger](https://github.com/vicanso/elton/blob/master/docs/middlewares.md#logger),日志的输出对于性能会有所影响 134 - `Remark` 备注 135 136 日志格式化配置中大部分都是通用的属性,需要注意以下的配置字段: 137 138 - `:proxyTarget` 转发的目标地址 139 - `<x-status` 接口响应的缓存状态 140 141 <p align="center"> 142 <img src="./images/add-server.png"/> 143 </p> 144 145 当Server配置完成后,可以使用`curl http://addr/ping`来检测该Server是否启动成功,`/ping`默认由pike处理而不会转发至upstream 146 147 ### Location匹配 148 149 location列表中,按是否匹配prefix与host排序,其优先级是 prefix+host > prefix > host > 无配置,从列表中按顺序一个个location匹配,匹配则该请求由此location处理,如果所有均不匹配则出错。 150 151 ## Admin配置 152 153 - `Account` 登录账号 154 - `Password` 登录密码 155 156 设置配置成功后重启pike,之后每次使用都需要登录校验,建议在首次配置则设置。 157 158 ## 缓存列表 159 160 暂未支持查询当前缓存列表功能,仅可用于删除缓存 161 162 <p align="center"> 163 <img src="./images/caches.png"/> 164 </p> 165 166 ## 非实时生效配置 167 168 - `缓存配置` 由于缓存是多个LRU组成,因此如果调整缓存大小会导致缓存失败,而且锁的处理也比较麻烦,因此缓存更新非实时生效,只能重启应用 169 - `Server配置的Log` 日志的输出是在Server创建时生成,如果后续有调整,只能重启应用 170 - `Admin配置` admin配置非实时生效,因此在初始创建时建议配置