nginx
centos7
nginx-unit

NGINX Unit が正式リリースされたので触ってみる

NGINX Unitが正式リリース。PHP、Go、Pythonなどに対応した軽量アプリケーションサーバ
http://www.publickey1.jp/blog/18/nginx_unitphpgopython.html

はぇ~便利なものが出てきたんすね~
拙者、新しいもの大好き侍のため触ってみることにしました

環境

  • CentOS7
  • PHP

やっていくぞ

セットアップ

まずは Nginx Unit をインストールしましょう
yum installする前にリポジトリを追加します
/etc/yum.repos.d/unit.repoを作成します

/etc/yum.repos.d/unit.repo
[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

(引用: http://unit.nginx.org/installation/#precompiled-packages

そしたらインストール

$ yum install unit

セッティング

適当なパスに設定ファイルを作ります。

~/unit-php-conf.json
{
  "listeners": {
    "*:80": {
      "application": "my-site"
    }
  },

  "applications": {
    "my-site": {
      "type": "php",
      "processes": 20,
      "root": "/var/www/html/",
      "index": "index.php"
    }
  }
}

(引用: http://unit.nginx.org/configuration/#minimum-configuration)

listenersからapplicationsで定義したアプリを呼び出す形のようです。
processesは並列プロセスの上限数でしょうか…?この辺りは勉強が必要ですね…。
rootはお決まりのパスにしましたので、index.phpを作りましょう。

/var/www/html/index.php
<?php
  phpinfo();
?>

実行する

いよいよサービスを開始してみます

$ systemctl start unit
$ systemctl status unit

できましたか?
関係ないですが、unitは語尾にdつかないんですね…。

unitに対して設定を当てていきますが、ここからが特殊です。
まずはcontrol.unit.sockというファイルを探します。

$ find / -name 'control.unit.sock'
/run/control.unit.sock

/run/control.unit.sockにあるようです。

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

configファイルをcurlでPUTするんですか!?!!??!
す、しゅごい…

でもやってみたらエラーが出てしましました

{
        "error": "Invalid configuration.",
        "detail": "The module to run \"php\" is not found among the available application modules."
}

ちょっと何言ってるかよく分かんないです(英語弱者)
どうやらphpを実行するためのモジュールが足りてないよ!と言っているようです

$ yum install unit-php

(引用: http://unit.nginx.org/installation/#precompiled-packages)

使用するアプリケーションによってモジュールをインストールしないとダメだったようです
気を取り直して以下を実行します

$ systemctl restart unit
$ curl -X PUT -d @./unit-php-conf.json --unix-socket /run/control.unit.sock http://localhost/
{
        "success": "Reconfiguration done."
}

できたっぽいですね。
そしたらfirewallからhttpを許可して閲覧してみます

確認する

$ firewall-cmd --add-service=http --zone=public --permanent
$ firewall-cmd --reload
$ firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

キャプチャ.PNG

できました!!

諸注意

  • systemctl restart unitするとPUTしたconfファイルがなかったことになるので、もう一度PUTする必要があります。
  • そういえばPHPを一回もインストールした覚えがないんですが、このPHPはどこから来てるんでしょうか…?
    • PHPunit-phpに含まれているようで、他言語でも別途インストールする必要はなさそうです
    • PHPのバージョンは 5, 7 のどちらかが選べるようです

最後に

詳細な設定についてはgithubからソースを引っ張ってきて、それを利用して行うようです
時間があればこちらもご紹介します

参考リンク