NGINX Unit

NGINX Unit は複数の言語でアプリケーションを実行するように設計された動的なwebアプリケーションです。Unit は軽量、polyglot、およびAPIを使って動的に設定されます。サーバの設計により、engineeringあるいは操作によって必要に応じて特定のアプリケーションのパラメータを再設定することができます。

NGINX Unit は現在のところベータとして利用可能です。そのためテスト環境内での利用に適していますが、プロダクション環境での使用はお勧めできません。

ソースはApache 2.0ライセンスのもとに配布されます。

重要な特徴

サポートされるアプリケーション言語

インストール

システム要求

NGINX Unit は以下のシステムでコンパイルおよび実行をテストされています:

アーキテクチャー:

NGINX Unitの中で実行しているアプリケーションのために、それぞれプログラミング言語が必要です:

同じシステム上にインストールされている複数の同じ言語を実行することができます。

再コンパイルされたパッケージ

CentOS 7.0 および Ubuntu 16.04 LTS のためのUnitの再コンパイルされたバイナリ。

CentOS パッケージ

  1. 以下の内容で **/etc/yum.repos.d/unit.repo** ファイルを生成します:

    [unit]
    name=unit repo
    baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    
  2. Unitパッケージをダウンロードします:

    # yum install unit
    

Ubuntu パッケージ

  1. NGINX, Inc. のリポジトリとパッケージを署名するために使われている キー をダウンロードする。

  2. キーをaptプログラムのキーリングに追加する。プログラムはNGINXのリポジトリの署名を認証することができます。これはUnitパッケージのインストールの間に失われたPGPキーについての警告を無視します。

    # sudo apt-key add nginx_signing.key
    
  3. 以下をファイル /etc/apt/sources.listの最後に追加します:

    deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
    deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
    
  4. Unitパッケージをダウンロードします:

    # apt-get update
    # apt-get install unit
    

ソースコード

この章はソースコードからUnitをコンパイルしインストールする方法を説明します。

ソースの取得

Unitソースコードを取得するには3つの方法があります: NGINX, Inc. のMercurialリポジトリから、GitHubから、あるいはtarballの中で。

どの場合でも、ソースは現在の作業ディレクトリのunit サブディレクトリに置かれます。

Mercurial リポジトリ
  1. Mercurial ソフトウェアがまだ無い場合は、ダウンロードしインストールします。例えば、Ubuntuシステムでは、このコマンドを実行します:

    # apt-get install mercurial
    
  2. Unitソースをダウンロードします:

    # hg clone http://hg.nginx.org/unit
    
GitHub リポジトリ
  1. まだGitソフトウェアが無い場合は、ダウンロードします。GitHub ドキュメントを見てください。

  2. Unitソースをダウンロードします:

    # git clone https://github.com/nginx/unit
    
Tarball

Unit ソースコードのtarballは http://unit.nginx.org/download/で利用可能です。

必要なソフトウェアのインストール

Unitを設定およびコンパイルする前に、必要なビルドツールに加えてサポートしたい利用可能な言語 (Go, PHP, and Python) のそれぞれのためのライブラリをインストールする必要があります。

Ubuntuの前提条件
  1. ビルドツールをインストールする。

    # apt-get install build-essential
    
  2. Goアプリケーションのサポートのために、golang パッケージをインストールします。

    # apt-get install golang
    
  3. PHPアプリケーションのために、php-devlibphp-embed パッケージをインストールします。

    # apt-get install php-dev
    # apt-get install libphp-embed
    
  4. Python アプリケーションのサポートのために、python-dev パッケージをインストールします。

    # apt-get install python-dev
    
CentOSの前提条件
  1. ビルドツールをインストールする。

    # yum install gcc make
    
  2. Goアプリケーションのサポートのために、golang パッケージをインストールします。

    # yum install golang
    
  3. PHP アプリケーションのサポートのために、php-develphp-embedded パッケージをインストールします。

    # yum install php-devel php-embedded
    
  4. Python アプリケーションのサポートのために、python-devel パッケージをインストールします。

    # yum install python-devel
    

ソースの設定

Unitを使って、サポートされる言語 (Go, PHP, or Python) の異なるバージョンを使うアプリケーションを同時に実行することができます。それぞれのために個々のUnitモジュールを設定する必要があります。以下のコマンドは各モジュールについてMakefileの中の必要な命令を生成します。

Goパッケージの設定

NGINX Unit はUnit内であなたのGoアプリケーションを実行するために必要なGoパッケージを提供するでしょう。

  1. GOPATH 環境変数を設定します。これはUnit Goパッケージのための出力ディレクトリを設定します。

    # export GOPATH=/home/user/go_apps
    
  2. 次のコマンドを実行します:

    ```

    ./configure go

    configuring Go package checking for Go ... found

  3. go version go1.6.2 linux/amd64
  4. Go package path: "/home/user/go_apps" ```
Goアプリケーションのビルド
  1. Goアプリケーションのためのソースファイルを修正し、二つの箇所を変更します:

    a. import セクションの中で、個々の行で "unit" を追加します。

    import {
    "fmt"
    "net/http"
    "unit"
    }
    

    b. main() 関数の中で、http.ListenandServe 関数をコメントアウトし、unit.ListenAndServe 関数を挿入します。

    func main() {
    http.HandleFunc("/", handler)
    //http.ListenAndServe(":8080", nil)
    unit.ListenAndServe(":8080", nil)
    
  2. Goアプリケーションをビルドします。

    # go build
    

Goアプリケーションが直接実行される場合、unitモジュールはhttpモジュールに戻るでしょう。GoアプリケーションがUnitによって起動される場合、共有メモリを経由してUnitルーターと通信するでしょう。

PHPモジュールの設定

To configure a Unit module (called php.unit.so) for the most recent version of PHP that the configure script finds bundled with the operating system, run this command:

# ./configure php

他のバージョンのPHP(あなたがカスタム化したバージョンを含む)のためにUnitモジュールを設定するために、それぞれについて以下のコマンドを繰り返します:

# ./configure php --module=<prefix> --config=<script-name> --lib-path=<pathname>

ここで

例えば、このコマンドはPHP 7.0のための php70.unit.so と呼ばれるモジュールを生成します:

# ./configure php --module=php70 \
 --config=/usr/lib64/php7.0/php-config \
 --lib-path=/usr/lib64/php7.0/lib64
configuring PHP module
checking for PHP ... found
 + PHP version: 7.0.22-0ubuntu0.16.04.1
 + PHP SAPI: [apache2handler embed cgi cli fpm]
checking for PHP embed SAPI ... found
 + PHP module: php70.unit.so
Pythonモジュールの設定

To configure a Unit module (called python.unit.so) for the most recent version of Python that the configure script finds bundled with the operating system, run this command.

# ./configure python

他のバージョンのPython(あなたがカスタム化したバージョンを含む)のためにUnitモジュールを設定するために、それぞれについて以下のコマンドを繰り返します:

# ./configure python --module=<prefix> --config=<script-name>

ここで

例えば、このコマンドはPython 3.3のための py33.unit.so と呼ばれるモジュールを生成します:

# ./configure php --module=py33 \
 --config=python-config-3.3
configuring Python module
checking for Python ... found
checking for Python version ... 3.3
 + Python module: py33.unit.so

ソースのコンパイル

Unitの実行ファイルおよび全ての設定されたPHP、Pythonあるいは両方のためのモジュールをコンパイルするには、以下のコマンドを実行します:

# make all

Goのためのパッケージをコンパイルするには:

  1. GOPATH 環境変数が正しく設定されているかを検証するか、GOPATH 変数を設定します。

    # go env GOPATH
    
    # export GOPATH=<path>
    
  2. コンパイルし、パッケージをインストールします:

    # make go-install
    

ソースからのインストール

全てのモジュールとGoパッケージと一緒にUnitをインストールするには、以下のコマンドを実行します:

# make install

設定

デフォルトでは、Unit APIがコントロール ソケット ファイル unit.control.sock の中で利用可能です。

アプリケーション

各アプリケーションのために、Unit設定のapplicationsのセクション内のJSONオブジェクトを呈するためにAPIを使います。JSONオブジェクトは、書かれている言語、実行するアプリケーションワーカープロセスの数、アプリケーションのためのファイルを持つディレクトリ、および言語によって変わるパラメータを含む、アプリケーションの幾つかの特徴を定義します。

この例は/www/blogs/scripts内で見つかるファイルを使ってblogsという名前のPHPアプリケーションの3つのワーカーを実行します。URLがPHPファイルを指定しない場合のデフォルトの起動ファイルは index.phpです。

 {
 ...
 "applications": {
 "blogs": {
 "type": "php",
 "workers": 20,
 "root": "/www/blogs/scripts",
 "index": "index.php"
 }
 }
 }

ライセンス

HTTPを経由してアクセス可能なアプリケーションについて、Unit設定のlisteners セクションの中でそれのための少なくとも1つのlistenerを定義する必要があります。listener は名前付きのアプリケーションへのクライアントのリクエストのためのUnit listenerのIPアドレスとポートです。IP アドレスは完全アドレス(例えば127.0.0.1:8300) あるいはワイルドカード (例えば `*:8300)です。

この例では、ポート 8300 で受け取られるリクエストは blogs アプリケーションに送られます:

 {
 "listeners": {
 "*:8300": {
 "application": "blogs"
 }
 },
 ...
 }

各言語のJSONオブジェクトについての詳細は、listenerとアプリケーション オブジェクトのためのJSON仕様を見てください。

最小構成

設定は、この例のように少なくとも1つのlistenerと関係するアプリケーションを含まなければなりません:

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

設定オブジェクトの生成

オブジェクトを設定するには、PUT リクエストのボディ内でJSONのデータを指定します。エラーを減らすために、ファイル内にJSONデータを書き、curl コマンドの -d オプションを使ってファイルパスを指定するのが合理的です。

例: 完全な設定の作成

start.json ファイルの内容をアップロードすることで初期設定を生成します。

# curl -X PUT -d @/path/to/start.json \
 --unix-socket ./control.unit.sock http://localhost/

例: アプリケーションオブジェクトの生成

ファイル wiki.jsonからwiki と呼ばれる新しいアプリケーションオブジェクトを生成します。

# curl -X PUT -d @/path/to/wiki.json \
 --unix-socket ./control.unit.sock http://localhost/applications/wiki

wiki.json の内容は以下のとおりです:

{
 "type": "python",
 "workers": 10,
 "module": "wsgi",
 "user": "www-wiki",
 "group": "www-wiki",
 "path": "/www/wiki"
}

設定オブジェクトの表示

設定オブジェクトを表示するには、そのパスをcurl URL に追加します。

例: 完全な設定の表示

完全な設定を表示します:

# curl --unix-socket ./control.unit.sock http://localhost/
{
 "applications": {
 "blogs": {
 "type": "php",
 "user": "nobody",
 "group": "nobody",
 "workers": 20,
 "root": "/www/blogs/scripts",
 "index": "index.php"
 },

 "wiki": {
 "type": "python",
 "user": "nobody",
 "group": "nobody",
 "workers": 10,
 "path": "/www/wiki",
 "module": "wsgi"
 }
 },


 "listeners": {
 "*:8300": {
 "application": "blogs"
 },


 "*:8400": {
 "application": "wiki"
 }
 }
}

例: オブジェクトの表示

wiki アプリケーションについてのデータを表示します:

# curl --unix-socket ./control.unit.sock http://localhost/applications/wiki
{
 "type": "python",
 "workers": 10,
 "module": "wsgi",
 "user": "www",
 "group": "www",
 "path": "/www/wiki"
}

設定オブジェクトの修正

設定オブジェクトを変更するには、PUTリクエストのボディ内にオブジェクトのJSONデータを指定するために、curlコマンドに -dオプションを使います。

例: listenerのためのアプリケーションの変更

*:8400上のlistenerについて、application オブジェクトを wiki-dev に変更します:

# curl -X PUT -d '"wiki-dev"' --unix-socket ./control.unit.sock \
 'http://localhost/listeners/*:8400/application'
{
 "success": "Reconfiguration done."
}

例: アプリケーションのためのファイルパスの変更

blogsアプリケーションについての root オブジェクトを /www/blogs-dev/scriptsに変更します:

# curl -X PUT -d '"/www/blogs-dev/scripts"' \
 --unix-socket ./control.unit.sock \
 http://localhost/applications/blogs/root
{
 "success": "Reconfiguration done."
}

設定オブジェクトの削除

設定オブジェクトを削除するために、DELETE リクエストを作成し、オブジェクトのパスをcurl URL に追加します。

例: listenerの削除

*:8400上のlistenerを削除します:

# curl -X DELETE --unix-socket ./control.unit.sock \
 'http://localhost/listeners/*:8400'
{
 "success": "Reconfiguration done."
}

listenerとアプリケーションオブジェクト

listener

オブジェクト 解説
<IP-address>:<port> Unitが名前付きのアプリケーションへのリクエストをlistenするIPアドレスとポート。IP アドレスは完全アドレス(例えば127.0.0.1:8300) あるいはワイルドカード (例えば `*:8300)です。
アプリケーション アプリケーション名。

例:

"*:8300": {
 "application": "blogs"
 }

Go アプリケーション

オブジェクト 解説
種類 アプリケーションの種類 (go).
ワーカー アプリケーション ワーカーの数。
実行ファイル コンパイルされたGoアプリケーションへのパス。
user (任意) アプリケーションプロセスを実行するユーザ名。指定されない場合、nobody が使われます。
group (任意) アプリケーションプロセスを実行するグループ名。指定されない場合、ユーザのプライマリ グループが使われます。

例:

"go_chat_app": {
 "type": "go",
 "executable": "/www/chat/bin/chat_app",
 "user": "www-go",
 "group": "www-go"
 }

PHP アプリケーション

オブジェクト 解説
種類 アプリケーションの種類 (php).
ワーカー アプリケーション ワーカーの数。
root PHPファイルを探すディレクトリ。
見出し URL内でPHPファイル名が指定されない場合のデフォルトの起動ファイル。
script (任意) ファイルシステム内でファイルを探す代わりにUnitが各URLについて実行するファイル。場所はrootへの相対です。
user (任意) アプリケーションプロセスを実行するユーザ名。指定されない場合、nobody が使われます。
group (任意) アプリケーションプロセスを実行するグループ名。指定されない場合、ユーザのプライマリ グループが使われます。

例:

"blogs": {
 "type": "php",
 "workers": 20,
 "root": "/www/blogs/scripts",
 "index": "index.php",
 "user": "www-blogs",
 "group": "www-blogs"
 },

Python アプリケーション

オブジェクト 解説
種類 アプリケーションの種類 (python).
ワーカー アプリケーション ワーカーの数。
path wsgi.py ファイルを探すパス。
module 必須。現在のところ、唯一サポートされる値はwsgiです。
user (任意) アプリケーションプロセスを実行するユーザ名。指定されない場合、nobody が使われます。
group (任意) アプリケーションプロセスを実行するグループ名。指定されない場合、ユーザのプライマリ グループが使われます。

例:

"shopping_cart": {
 "type": "python",
 "workers": 10,
 "path": "/www/store/cart",
 "module": "wsgi",
 "user": "www",
 "group": "www"
 },

完全な例

{
 "listeners": {
 "*:8300": {
 "application": "blogs"
 },
 "*:8400": {
 "application": "wiki"
 },
 "*:8401": {
 "application": "shopping_cart"
 },
 "*:8500": {
 "application": "go_chat_app"
 }
 },
 "applications": {
 "blogs": {
 "type": "php",
 "workers": 20,
 "root": "/www/blogs/scripts",
 "user": "www-blogs",
 "group": "www-blogs",
 "index": "index.php"
 },
 "wiki": {
 "type": "python",
 "workers": 10,
 "user": "www-wiki",
 "group": "www-wiki",
 "path": "/www/wiki"
 },
 "shopping_cart": {
 "type": "python",
 "workers": 10,
 "module": "wsgi",
 "user": "www",
 "group": "www",
 "path": "/www/store/cart"
 },
 "go_chat_app": {
 "type": "go",
 "user": "www-chat",
 "group": "www-chat",
 "executable": "/www/chat/bin/chat_app"
 }
 }
}

NGINXとの統合

NGINXの背後にUnitをインストール

NGINXを静的なwebサーバでUnitの前のリバースプロキシとして設定します。

NGINX はファイルシステムから直接静的なファイルを提供し、アプリケーションへのリクエストはUnitに転送されます。

NGINX設定のhttpコンテキストの中のupstreamブロックを生成し、UnitサーバのIPとポートをupstreamブロックに追加します。例えば:

upstream unit_backend {
 server 127.0.0.1:8300;
}

NGINX設定のhttpコンテキスト内のserver および location ブロックを生成あるいは修正します。静的ファイルのディレクトリおよびUnit upstreamの名前を指定します。

例 1

PHP アプリケーションについては、.phpで終了するURLを持つ全てのリクエストはUnitへプロキシされるでしょう:他の全てのファイルは直接NGINXによって提供されるでしょう:

server {

 location / {
 root /var/www/static-data;
 }

 location ~ \.php$ {
 proxy_pass http://unit_backend;
 proxy_set_header Host $host;
 }
}

例 2

以下のアプリケーションでは、全ての静的ファイルは /var/www/files ディレクトリ内に配置されなければならず、/staticで始まるURLによって参照されます。他の全てのリクエストはUnitにプロキシされるでしょう:

 server {

 location /static {
 root /var/www/files;
 }

 location / {
 proxy_pass http://unit_backend;
 proxy_set_header Host $host;
 }
}

更なる情報は http://nginx.orgのドキュメントを参照してください。商用サポートと上級機能が https://www.nginx.com で利用可能です

Unit APIの安全化とプロキシ

デフォルトでは、Unit APIはUnixドメインソケットを使って利用可能です。APIがリモートで利用可能にするために、NGINを使ってリバースプロキシを設定します。

NGINXはセキュリティ、認証、およびAPIへのアクセス制御を提供します。安全では無いUnit APIを公開することはお勧めできません。

NGINXのための以下の設定例を使ってください:

server {

 # Configure SSL encryption
 server 443 ssl;
 ssl_certificate /path/to/ssl/cert.pem;
 ssl_certificate_key /path/to/ssl/cert.key;

 # Configure SSL client certificate validation
 ssl_client_certificate /path/to/ca.pem;
 ssl_verify_client on;

 # Configure network ACLs
 #allow 1.2.3.4; # Uncomment and change to the IP addresses and networks
 # of the administrative systems.
 deny all;

 # Configure HTTP Basic authentication
 auth_basic on;
 auth_basic_user_file /path/to/htpasswd.txt;

 location / {
 proxy_pass http://unix:/path/to/control.unit.sock
 }
}

貢献

NGINX Unit はApache 2.0ライセンスの元にリリースされています。

変更の貢献は、それらをメールで unit@nginx.org にサブミットするか、https://github.com/nginx/unit リポジトリにプルリクエストをサブミットしてください。

トラブルシューティング

バイナリパッケージのためのUnit log は /var/log/unit.log にあります。

Log file の場所は unitd --help を実行することで見つけることもできます。

設定時にはログのデバッグ冗長レベルが有効にされています:

./configure --debug

再設定の後でUnitと全てのモジュールは再コンパイルし再インストールする必要があります。

デバッグのログサイズはとても速く増加することに注意してください。

コミュニティのメーリングリストは unit@nginx.org で利用可能です。メールをunit-subscribe@nginx.orgに送信するか、ここでメーリングリストを購買することができます。

TOP
inserted by FC2 system