nusterとは
NusterはHAProxyを元に開発したキャッシュサーバで、HAProxyと互換性がある。
そしてHAProxyのACLを利用して細かいキャッシュルールを定義できる。
仕様は変更されるかもしれないので、最新のものはhttps://github.com/jiangwenyuan/nuster/blob/master/README.mdを参照してください。
ホームページ
https://github.com/jiangwenyuan/nuster
特徴
- HAProxyのすべての機能や特徴がサポート、100%互換性
- 動的キャッシング機能
- HTTP method, URI, path, query, header, cookiesなどでキャッシング
- HTTP request or response contentsなどでキャッシング
- environment variables, server stateなどでキャッシング
- SSL version, SNI などでキャッシング
- connection rate, number, byte などでキャッシング
- スーパー速い
- キャッシュ purging
- フロントエンドとバックエンド両方HTTPS
- HTTP圧縮
- HTTPリライトやリダイレクト
- などなど
仕組み
TCP/HTTPロードバランサーとキャッシュサーバで使える
client - nuster(http/https load balancer, cache server) - App [- nuster(tcp load balancer)] - DB
セットアップ
インストール
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/bin
lua, ssl, zlibいらない場合はパラメータから外す
TARGET: linux2628, linux26, linux24, linux24e, linux22, solaris, freebsd, openbsd, cygwin, custom, generic
docker
docker pull nuster/nuster
docker run -d -v /path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro -p 8080:8080 nuster/nuster
コンフィグ
最小限ファイル
global
nuster cache on
daemon
nbproc 2
defaults
retries 3
option redispatch
option dontlognull
timeout client 300s
timeout connect 300s
timeout server 300s
frontend web1
bind *:8080
mode http
default_backend app1
backend app1
balance roundrobin
mode http
nuster cache
nuster-rule all ttl 0
server s1 10.0.0.101:8080
server s2 10.0.0.102:8080
server s3 10.0.0.103:8080
セクション
- global: 全体に関連するパラメータを設定する
- defaults: 各プロキシにおけるパラメータのデフォルト値を設定する
- frontend: クライアントからリクエストを受ける側についてを設定する
- backend: 受けたリクエストを振り分ける先のサーバについてを設定する
- listen: frontendとbackendを合わせて1つで設定する
cacheとして基本設定
- globalに
nuster cache on
を設定する - backendに
nuster cache on
とnuster-rule
を設定する
詳細はhttps://github.com/jiangwenyuan/nuster/blob/master/README.md#directives
起動
/usr/local/nuster/bin/haproxy -f nuster.conf
例
コンフィグ抜粋で
tcp load 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
http load balancerとして
frontend web-lb
bind *:80
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
https
frontend web
bind *:8080 ssl crt XXX.pem # HTTPSリクエストを受ける
# bind *:8080
mode http
default_backend app
backend app
balance roundrobin
nuster cache off
nuster-rule all
mode http
#server a1 10.0.0.101:8002 # HTTPでbackendと通信
server a2 10.0.0.101:8003 ssl verify none # HTTPSでbackendと通信
クライアント、バックエンドサーバ両方HTTPSできる
user == https ==> nuster == https ==> backend
user == https ==> nuster == http ==> backend
user == http ==> nuster == https ==> backend
user == http ==> nuster == http ==> backend
POSTをキャッシング
frontend web1
bind *:8080
mode http
use_backend app1a if { path /search }
default_backend app1b
backend app1a
balance roundrobin
mode http
option http-buffer-request
nuster cache
# /searchの結果を60秒間キャッシングする
nuster-rule rpost ttl 60 if METH_POST
backend app1b
#***
キャッシング例
cache /a.jpg, expire しない
nuster-rule r1 ttl 0 if { path /a.jpg }
staticファイルをcache
acl static path_beg -i /static/ /images/ /css/
nuster-rule static_files ttl 0 if static
ユーザー毎に /mypageをcache: keyにsessionIdを入れる
acl pathB path /mypage
nuster-rule r2 key method.scheme.host.path.delimiter.query.cookie_sessionId ttl 60 if pathB
リクエストが/a.html且つリスポンスにcache headerがあれば /a.htmlをcache
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
connectionが100を超えると /heavy を 100 秒cache
acl heavypage path /heavy
acl tooFast be_conn ge 100
nuster-rule heavy ttl 100 if heavypage tooFast
cache前にresponseにheaderを入れる
http-response set-header X-ASDF fdsa
cache前に圧縮する
backend app
filter compression
compression algo gzip
compression type text/html text/plain text/css text/javascript
nuster cache
nuster-rule all