Posted at

NginxのForkのTengineをDockerで試す

More than 3 years have passed since last update.

この記事は OIC ITCreate Club Advent Calendar 2015 14日目の記事です。

Tengine とは、中国最大級のECサイト運営会社のAlibabaが開発するNginxのForkプロジェクトです。無料版のNginxを使ってたら割りと不便に思うこと有ると思います。「1500ドル払え」という話なんですけど、貧乏学生には辛い話なのでこういうものに手を出してみました。無料で割りとPlusな機能が使えるようになります。

インストールも手軽で、以下の様なコマンドでUbuntu14に入りました。

apt-get install -y git build-essential libpcre3-dev libssl-dev debhelper

git clone https://github.com/alibaba/tengine.git
cd tengine
mv packages/debian .
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -uc -b
cd ../
dpkg -i tengine*.deb
nginx

というわけで、Dockerイメージ作りました。


Docker Composeでupstreamをテスト

プロキシを1台建てて、後ろに2台建ててテストします。割りとこういう機能もデフォルトで入っていて再コンパイルが必要ないのもありがたいです。 ngx_http_upstream_check_module


docker-compose.yml

proxy:

image: kamijin/tengine
volumes:
- "./proxyconfig/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./proxyconfig/conf.d/:/etc/nginx/conf.d/:ro"
links:
- web_1
- web_2
ports:
- "80:80"
web_1:
image: kamijin/tengine
volumes:
- "./webconfig/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./webconfig/conf.d/:/etc/nginx/conf.d/:ro"
- "./content:/usr/share/nginx/html:ro"
web_2:
image: kamijin/tengine
volumes:
- "./webconfig/nginx.conf:/etc/nginx/nginx.conf:ro"
- "./webconfig/conf.d/:/etc/nginx/conf.d/:ro"
- "./content:/usr/share/nginx/html:ro"


proxy.conf

upstream app {

server web_1 weight=10;
server web_2 weight=20;
check interval=1000 rise=5 fall=3 timeout=1000 type=http default_down=true;
check_http_send "GET / HTTP/1.1\r\nConnection: close\r\nHost: localhost\r\n\r\n";
check_http_expect_alive http_2xx;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
location /status {
check_status;
}
}

1秒毎に監視を行い5回成功したらOKとし、3回失敗したらクラスタから外します。試しに重みを1:2にして、振り分けが正常に行われているかを試してみます。


ApacheBench

# ab -c 500 -n 2000 http://172.20.0.10/



web1

root@d7bb64461162:~# wc /var/log/nginx/access.log 

804 10452 73658 /var/log/nginx/access.log


web2

root@2f9991cfb59f:~# wc /var/log/nginx/access.log 

1455 18915 135062 /var/log/nginx/access.log

ヘルスチェックのリクエストが混ざってはいますが、割りといい感じに振り分けられてそうです。

ついでに、curl http://localhost/status?format=jsonにアクセス。Upstreamのステータスを取得できるAPIが公開されています。


/status?format=json

{"servers": {

"total": 2,
"generation": 1,
"server": [
{"index": 0, "upstream": "app", "name": "172.17.0.5:80", "status": "up", "rise": 85, "fall": 0, "type": "http", "port": 0},
{"index": 1, "upstream": "app", "name": "172.17.0.4:80", "status": "up", "rise": 88, "fall": 0, "type": "http", "port": 0}
]
}}


その他の機能

気になったやつだけピックアップしました。


Link

公式ドキュメント: http://tengine.taobao.org/index.html