NGINX Unit は複数の言語でアプリケーションを実行するように設計された動的なwebアプリケーションです。Unit は軽量、polyglot、およびAPIを使って動的に設定されます。サーバの設計により、engineeringあるいは操作によって必要に応じて特定のアプリケーションのパラメータを再設定することができます。
NGINX Unit は現在のところベータとして利用可能です。そのためテスト環境内での利用に適していますが、プロダクション環境での使用はお勧めできません。
ソースはApache 2.0ライセンスのもとに配布されます。
NGINX Unit は以下のシステムでコンパイルおよび実行をテストされています:
アーキテクチャー:
NGINX Unitの中で実行しているアプリケーションのために、それぞれプログラミング言語が必要です:
同じシステム上にインストールされている複数の同じ言語を実行することができます。
CentOS 7.0 および Ubuntu 16.04 LTS のためのUnitの再コンパイルされたバイナリ。
以下の内容で **/etc/yum.repos.d/unit.repo** ファイルを生成します:
[unit]
name=unit repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
Unitパッケージをダウンロードします:
# yum install unit
NGINX, Inc. のリポジトリとパッケージを署名するために使われている キー をダウンロードする。
キーをapt
プログラムのキーリングに追加する。プログラムはNGINXのリポジトリの署名を認証することができます。これはUnitパッケージのインストールの間に失われたPGPキーについての警告を無視します。
# sudo apt-key add nginx_signing.key
以下をファイル /etc/apt/sources.listの最後に追加します:
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
Unitパッケージをダウンロードします:
# apt-get update
# apt-get install unit
この章はソースコードからUnitをコンパイルしインストールする方法を説明します。
Unitソースコードを取得するには3つの方法があります: NGINX, Inc. のMercurialリポジトリから、GitHubから、あるいはtarballの中で。
どの場合でも、ソースは現在の作業ディレクトリのunit サブディレクトリに置かれます。
Mercurial ソフトウェアがまだ無い場合は、ダウンロードしインストールします。例えば、Ubuntuシステムでは、このコマンドを実行します:
# apt-get install mercurial
Unitソースをダウンロードします:
# hg clone http://hg.nginx.org/unit
まだGitソフトウェアが無い場合は、ダウンロードします。GitHub ドキュメントを見てください。
Unitソースをダウンロードします:
# git clone https://github.com/nginx/unit
Unit ソースコードのtarballは http://unit.nginx.org/download/で利用可能です。
Unitを設定およびコンパイルする前に、必要なビルドツールに加えてサポートしたい利用可能な言語 (Go, PHP, and Python) のそれぞれのためのライブラリをインストールする必要があります。
ビルドツールをインストールする。
# apt-get install build-essential
Goアプリケーションのサポートのために、golang
パッケージをインストールします。
# apt-get install golang
PHPアプリケーションのために、php-dev
と libphp-embed
パッケージをインストールします。
# apt-get install php-dev
# apt-get install libphp-embed
Python アプリケーションのサポートのために、python-dev
パッケージをインストールします。
# apt-get install python-dev
ビルドツールをインストールする。
# yum install gcc make
Goアプリケーションのサポートのために、golang
パッケージをインストールします。
# yum install golang
PHP アプリケーションのサポートのために、php-devel
と php-embedded
パッケージをインストールします。
# yum install php-devel php-embedded
Python アプリケーションのサポートのために、python-devel
パッケージをインストールします。
# yum install python-devel
Unitを使って、サポートされる言語 (Go, PHP, or Python) の異なるバージョンを使うアプリケーションを同時に実行することができます。それぞれのために個々のUnitモジュールを設定する必要があります。以下のコマンドは各モジュールについてMakefileの中の必要な命令を生成します。
NGINX Unit はUnit内であなたのGoアプリケーションを実行するために必要なGoパッケージを提供するでしょう。
GOPATH
環境変数を設定します。これはUnit Goパッケージのための出力ディレクトリを設定します。
# export GOPATH=/home/user/go_apps
次のコマンドを実行します:
```
configuring Go package checking for Go ... found
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)
Goアプリケーションをビルドします。
# go build
Goアプリケーションが直接実行される場合、unitモジュールはhttpモジュールに戻るでしょう。GoアプリケーションがUnitによって起動される場合、共有メモリを経由してUnitルーターと通信するでしょう。
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>
ここで
--module
はPHPバージョンに固有のUnitモジュールのためのファイル名のプリフィックスを設定します (つまり、結果のモジュールは <prefix>.unit.soと呼ばれます)。
--config
はPHPの特定のバージョンのための php-config スクリプトのファイル名を指定します。
--lib-path
は使用するPHPライブラリのためのディレクトリを指定します。
例えば、このコマンドは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
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>
ここで
--module
はPythonバージョンに固有のUnitモジュールのためのファイル名のプリフィックスを設定します (つまり、結果のモジュールは <prefix>.unit.soと呼ばれます)。
--config
はPythonの特定のバージョンのための python-config スクリプトのファイル名を指定します。
例えば、このコマンドは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のためのパッケージをコンパイルするには:
GOPATH
環境変数が正しく設定されているかを検証するか、GOPATH
変数を設定します。
# go env GOPATH
# export GOPATH=<path>
コンパイルし、パッケージをインストールします:
# 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
オプションを使います。
*: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 に追加します。
*:8400上のlistenerを削除します:
# curl -X DELETE --unix-socket ./control.unit.sock \
'http://localhost/listeners/*:8400'
{
"success": "Reconfiguration done."
}
オブジェクト | 解説 |
---|---|
<IP-address>:<port> |
Unitが名前付きのアプリケーションへのリクエストをlistenするIPアドレスとポート。IP アドレスは完全アドレス(例えば127.0.0.1:8300 ) あるいはワイルドカード (例えば `*:8300 )です。 |
アプリケーション |
アプリケーション名。 |
例:
"*:8300": {
"application": "blogs"
}
オブジェクト | 解説 |
---|---|
種類 |
アプリケーションの種類 (go ). |
ワーカー |
アプリケーション ワーカーの数。 |
実行ファイル |
コンパイルされたGoアプリケーションへのパス。 |
user (任意) |
アプリケーションプロセスを実行するユーザ名。指定されない場合、nobody が使われます。 |
group (任意) |
アプリケーションプロセスを実行するグループ名。指定されない場合、ユーザのプライマリ グループが使われます。 |
例:
"go_chat_app": {
"type": "go",
"executable": "/www/chat/bin/chat_app",
"user": "www-go",
"group": "www-go"
}
オブジェクト | 解説 |
---|---|
種類 |
アプリケーションの種類 (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 ). |
ワーカー |
アプリケーション ワーカーの数。 |
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を静的な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の名前を指定します。
PHP アプリケーションについては、.php
で終了するURLを持つ全てのリクエストはUnitへプロキシされるでしょう:他の全てのファイルは直接NGINXによって提供されるでしょう:
server {
location / {
root /var/www/static-data;
}
location ~ \.php$ {
proxy_pass http://unit_backend;
proxy_set_header Host $host;
}
}
以下のアプリケーションでは、全ての静的ファイルは /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は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に送信するか、ここでメーリングリストを購買することができます。