Nginx Unitが公開!
一昨日くらいにNGINXがアプリケーションサーバーUnitを公開しました。
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を有効にしましょう。
$ 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()を実行するファイルを置いてみました。正常表示されています。
次にWordPressを設置してみました。アプリケーションサーバーなので静的ファイルは表示されませんが、問題なくPHPが実行され初期画面が出てきています。
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なども含めて連携に成功し、正常に初期画面が表示されました。
$_POSTが空っぽ
しかし、ここからが鬼門…。WordPressのインストールウィザードに沿って項目を入力していきましたが、ERROR: “Table Prefix” must not be empty.のエラーが出てインストールできませんでした。
もちろんテーブルプレフィックスは入力しています。色々トライしたのですが、いずれも失敗…。検索していたら、つい3時間前に私と同じことに挑戦して同じ箇所で失敗している方の記事が見つかりました。
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が空になる問題は修正されているみたい。ソースからインストールしてみようかな。