Help us understand the problem. What is going on with this article?

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした