aspec7's garage

エンジニア生活の中で学んだことの備忘録

NGINX Unit が便利そうなので早速試してみた

f:id:aspec7:20160318095017j:plain

NGINX Unit?

NGINX Unit が発表されました。
NGINXブランドのWEBアプリケーションサーバです。

このサーバは、複数のプログラム言語に対応しているので、それらで作られたWebアプリケーションであれば、Unitをアプリケーションサーバとして利用が可能になります。
サポートしているのは、Python / PHP / Go で、さらに Node.js / Java / Ruby が対応予定となっています。

このUnitサーバ自体はRESTful JSON APIが利用できるようになっていて、サーバの設定をHTTP経由で変更できます。
設定のためのコンフィグがJSON形式なので、開発者には扱いやすいかと思います。

試した環境

DockerコンテナでUbuntuイメージを使って環境を作りサクッと試しました。
PHPPythonで作ったHelloWorldアプリケーションを動かしてみました。
ソースと設定ファイルは、Githubに公開してあります。

Unitのインストール方法

Unitのインストールは非常に簡単です。
インストールマニュアルに従って、行けば特に何もハマることなくインストールできました。

他に、試すためにインストールしたものとしては以下のパッケージです。

(wgetcurlがデフォルトで使えるので要らなかったなぁ・・)

インストール手順

wgetとりあえずインストール

# apt-get update
# apt-get -y install wget

NGINX Unitのインストール準備

# wget http://nginx.org/keys/nginx_signing.key
# apt-key add nginx_signing.key
# echo "deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx" >>  /etc/apt/sources.list
# echo "deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx" >>  /etc/apt/sources.list
# apt-get update

NGINX Unitのインストール

# apt-get -y install unit

NGINX Unitの起動

# service unitd start

PHPのインストール

# apt-get -y install php

Pythonのインストール

# apt-get -y install python python-pip
# pip install flask

編集用にとりあえずvimインストール

# apt-get -y install vim

スクリプトの配置

# mkdir -p /www/{php-app,py-app}
# vi /www/php-app/index.php
# vi /www/py-app/wsgi.py

index.php

<?php
echo("<h1>Hello world from PHP</h1>");

wsgi.py

#!/usr/bin/env python

from flask import Flask

application = Flask(__name__)

@application.route("/")
def index():
    return "<h1>Hello world from Python</h1>"

設定方法

Unitの設定もマニュアル通りにやって非常にシンプルです。
注意点としては、PHPPythonで若干設定項目が違います。
今回は下記のような「config.json」というファイルに保存して、保存先は「/etc/unit/」にしました。

config.json

{
  "listeners": {
    "*:8300": {
      "application": "php-app"
    },

    "*:8400": {
      "application": "py-app"
    }
  },

  "applications": {
    "php-app": {
      "type": "php",
      "workers": 20,
      "index": "index.php",
      "root": "/www/php-app"
    },
    "py-app": {
      "type": "python",
      "workers": 10,
      "module": "wsgi",
      "path": "/www/py-app"
    }
  }
}

上記設定ファイルを、マニュアル通りにcurlで設定しますが、その前にcontrol.unit.sockの場所を確認しました。

# find / -name control.unit.sock
/run/control.unit.sock

Unitに設定を反映します。

# curl -X PUT -d @/etc/unit/config.json --unix-socket /run/control.unit.sock http://localhost/
{
  "success": "Reconfiguration done."
}

反映内容を確認します。

# curl --unix-socket /run/control.unit.sock http://localhost/
{
  "listeners": {
    "*:8300": {
      "application": "php-app"
    },

    "*:8400": {
      "application": "py-app"
    }
  },

  "applications": {
    "php-app": {
      "type": "php",
      "workers": 20,
      "index": "index.php",
      "root": "/www/php-app"
    },

    "py-app": {
      "type": "python",
      "workers": 10,
      "module": "wsgi",
      "path": "/www/py-app"
    }
  }
}

とりあえず動かすための設定はこれだけです。

そして動作確認

curlコマンドで確認してみます。

# curl http://localhost:8300/
<h1>Hello world from PHP</h1>
# curl http://localhost:8400/
<h1>Hello world from Python</h1>

所感

まだバージョンが0.1なので、機能の拡充はこれからだと思いますが、非常にミニマムに利用開始できます。
RESTful APIの動的設定が可能なので、デプロイ時のコントロールなどはプログラマブルに出来ますね。
設定データも、JSON形式なので開発者には管理も楽だと思います。
何より、Webアプリケーションの主要な言語が対応しているので、NGINXエコシステムを使った多様な機能を持つサービスが構築可能なのも、管理の複雑さの軽減につながるのではないでしょうか?