nginx
docker
nginx-unit

NGINX UnitをDockerで動かす

More than 1 year has passed since last update.

はじめに

Nginxからリリースされた新しいサーバ、NGINX Unit(正式名称はUnitで、他のプロダクトと区別するためにNGINX Unitと呼んでいます)について、Dockerで動かしました。

https://github.com/yousan/nginx-unit

現時点でPHP、Go、Pythonに対応。Java、Ruby、Node.jsにも対応予定です。
NGINX Unitの最大の特徴として挙げられているのは、最初から動的制御が可能なように設計されており、アプリケーションの入れ替えやバージョンアップなどを再起動することなくシームレスに行えるところです。
http://www.publickey1.jp/blog/17/nginx_unit.html

ということで、ソケットファイルを使ったHTTP通信でサーバのコンフィギュレーションが可能、というのが最大の特徴のようです。

Linuxの場合にはソケットファイルを共有してホスト側のcURLを利用することができます。

動かし方

NGINX Unitの起動

GitHubのリポジトリにdocker-composeを置いています。こちらから動かすと簡単です。

$ git clone https://github.com/yousan/nginx-unit
$ cd nginx-unit
$ docker-compose up

Screen Shot 2017-09-13 at 17.37.04.png

dockerコマンド手動だとこんな感じで動きます。

$ docker run --name some-nginx-unit -v /var/www:/www/root -v /var/run:/var/run:rw  -p 8200:8200 -p 8300:8300  yousan/nginx-unit

ドキュメントルートにするディレクトリ、ソケットファイル、HTTP待受ポートの指定が必要です。

NGINX Unitに開始コマンドを送る

コンテナ内部で制御

コンテナ内部で作業をします。コンテナでbashを開きます。

$ docker exec -it nginx-unit /bin/bash

Screen Shot 2017-09-14 at 11.44.22.png

NGIN Unitでは制御するためにJSONファイルでやり取りを行います。
その為ホスト側のjsonディレクトリをマウントしておくと、コンテナ内でのcurlで利用できるので便利です。
上述のdocker-composeで起動した場合には、/root/jsonに入っています。

$ curl -X PUT -d @/root/json/start.json --unix-socket /var/run/control.unit.sock  http://localhost/

中身はこんな感じです。

start.json
{
  "listeners": {
    "*:8300": {
      "application": "blogs"
    }
  },
  "applications": {
    "blogs": {
      "type": "php",
      "workers": 20,
      "root": "/www/root",
      "index": "index.php"
    }
  }
}

Screen Shot 2017-09-14 at 11.46.39.png

ホスト側から制御する

Linuxの場合にはsocketファイルを共有することで、ホスト側から制御を行うことができます。

$ sudo curl -X PUT -d @./json/start.json --unix-socket ./run/control.unit.sock http://localhost/

コマンドを送ると結果が帰ってきます。

Screen Shot 2017-09-13 at 17.44.16.png

ホスト側から制御する利点は、JSONファイルなどをホスト側のエディタで編集できることです。
またcurlのコマンドもホスト側のものを使えるので、細かい所でオプションが違って動かない、ということを防ぐことができます。(とは言えcurlはかなり互換性が高そうです)

接続試験

8300で待受をさせたので繋いでみます。

$ curl -s http://localhost:8300 | less

ブラウザでも http://localhost:8300 に繋いでみます.

Screen Shot 2017-09-14 at 11.52.40.png

phpinfo() が表示されました!バッチリですね!

Screen Shot 2017-09-13 at 17.45.34.png

ToDO

  1. socketファイルがroot権限になっているのでsudo curlしないとダメなので直したいです。
  2. Macでsocketファイルが共有できない…。betaなら行ける? https://github.com/docker/for-mac/issues/1962 コンテナ内部で作業すればOK
  3. アプリケーションを動かしてみたいです

参考サイト

すごく参考になりました。恐らく公式ドキュメントから情報を拾ったのだと思います、それが結構大変なので助かりました。
http://yaaamaaaguuu.hatenablog.com/entry/2017/09/08/031316

公式マニュアル
http://unit.nginx.org/docs-nginx-unit.html