はじめに
Nginxからリリースされた新しいサーバ、NGINX Unit(正式名称はUnitで、他のプロダクトと区別するためにNGINX Unitと呼んでいます)について、Dockerで動かしました。
現時点で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
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
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/
中身はこんな感じです。
{
"listeners": {
"*:8300": {
"application": "blogs"
}
},
"applications": {
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/root",
"index": "index.php"
}
}
}
ホスト側から制御する
Linuxの場合にはsocketファイルを共有することで、ホスト側から制御を行うことができます。
$ sudo curl -X PUT -d @./json/start.json --unix-socket ./run/control.unit.sock http://localhost/
コマンドを送ると結果が帰ってきます。
ホスト側から制御する利点は、JSONファイルなどをホスト側のエディタで編集できることです。
またcurlのコマンドもホスト側のものを使えるので、細かい所でオプションが違って動かない、ということを防ぐことができます。(とは言えcurlはかなり互換性が高そうです)
接続試験
8300で待受をさせたので繋いでみます。
$ curl -s http://localhost:8300 | less
ブラウザでも http://localhost:8300 に繋いでみます.
phpinfo() が表示されました!バッチリですね!
ToDO
- socketファイルがroot権限になっているのでsudo curlしないとダメなので直したいです。
-
Macでsocketファイルが共有できない…。betaなら行ける? https://github.com/docker/for-mac/issues/1962コンテナ内部で作業すればOK - アプリケーションを動かしてみたいです
参考サイト
すごく参考になりました。恐らく公式ドキュメントから情報を拾ったのだと思います、それが結構大変なので助かりました。
http://yaaamaaaguuu.hatenablog.com/entry/2017/09/08/031316