はてな村定点観測所

運動、瞑想、睡眠、野菜350g

Nginx UnitでPHPアプリケーションサーバー構築に挑戦してみたよ

   

Nginx Unitが公開!

一昨日くらいにNGINXがアプリケーションサーバーUnitを公開しました。

www.nginx.com

www.publickey1.jp

f:id:netcraft3:20170908200413p:plain

Unitがあれば言語ごとに違うアプリケーションサーバーを立てずにすみます。PHPでもPHP-FPMやFastCGIモードなどがいらなくなるかも。「やったー!クールだ!」と思って早速人柱になって動作検証するべく、AWSにCentOS7のインスタンスを立ち上げてUnitを導入してみました。今回の目標はみんな大好きWordPressを動作させることです。

CentOS7へのUnitのインストール

まず、UnitのYUMレポジトリを登録します。

$ sudo vi /etc/yum.repos.d/unit.yum

以下の内容を記述します。

[unit]
name=unit repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

CentOS7の書き方です。Unitは現状ではCentOS6用のRPMは配布されていません。このRPMはsystemdと依存関係にあるようです。CentOS6やAmazonLinuxの場合はソースからインストールする必要があります。

続いてyumコマンドでunitをインストールします。

$ sudo yum install -y unit

インストールに成功しました!unitdを有効にしましょう。systemctlで有効化します。

$ sudo systemctl enable unitd.service
$ sudo systemctl start unitd.service

unitのプロセスが立ち上がっていることが確認できます。

$ ps aux|grep unit
root      9232  0.0  0.0  16172   628 ?        Ss   06:59   0:00 unit: main [/usr/sbin/unitd --log /var/log/unitd.log --pid /run/unitd.pid]
nobody    9234  0.0  0.0  16172   672 ?        S    06:59   0:00 unit: controller
nobody    9235  0.0  0.0  16172   672 ?        S    06:59   0:00 unit: router

Unitの設定

unitの設定はconfファイルのような形式ではなく、APIにJSONをアップロードする形で適用させることになります。php.jsonというファイルを作成しました。

{
     "listeners": {
         "*:8080": {
             "application": "blogs"
         }
     },
     "applications": {
         "blogs": {
             "type": "php",
              "workers": 20,
              "root": "/var/www/html",
              "index": "index.php"
         }
     }
}

このJSONをcurlコマンドで適用させます。

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

設定に成功するとその結果もJSONで返ってきます。

{
    "success": "Reconfiguration done."
}

設定ミスの結果もJSONです。

{
    "error": "Invalid configuration."
}

試しにphpinfo()を実行するファイルを置いてみました。正常表示されています。

f:id:netcraft3:20170908172450p:plain

次にWordPressを設置してみました。アプリケーションサーバーなので静的ファイルは表示されませんが、問題なくPHPが実行され初期画面が出てきています。

f:id:netcraft3:20170908172518p:plain

Nginxとの統合

Nginxとの連携は公式ドキュメントにならって、/etc/nginx/conf.d/default.confを以下のように設定しました。

server {
    location / {
         root /var/www/html;
    }

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

これでNginxをrestart。

$ sudo systemctl restart nginx.service

CSSなども含めて連携に成功し、正常に初期画面が表示されました。

f:id:netcraft3:20170908192359p:plain

$_POSTが空っぽ

しかし、ここからが鬼門…。WordPressのインストールウィザードに沿って項目を入力していきましたが、ERROR: "Table Prefix" must not be empty.のエラーが出てインストールできませんでした。

f:id:netcraft3:20170908201130p:plain

もちろんテーブルプレフィックスは入力しています。色々トライしたのですが、いずれも失敗…。検索していたら、つい3時間前に私と同じことに挑戦して同じ箇所で失敗している方の記事が見つかりました。

qiita.com

wp-admin/setup-config.php?step=2で"Table Prefix" must not be empty.と言われて先に進めない。 $_POSTをdumpしてみるとNULLという悲しい事実。POSTが扱えないらしい。

リポジトリを見るとPHP POSTに関するコミットがあるのでmasterをコンパイルすれば大丈夫な気がする。

POSTが空…。確かにPOSTの値は空っぽになっていました。ここでインストール継続を断念。まだUnitは出たばかりですので、バッドノウハウの共有も何かの役に立つかと思い公開しました。

GitHubの最新のコードではPOSTが空になる問題は修正されているみたい。ソースからインストールしてみようかな。

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)