HipHop VM バージョン 3.0 を fast-cgi モードで使用するようにnginxをセットアップしました。いくつかの事実:
- Ubuntu 13.10で実行しています
- nginx と hhvm は user として実行されます
www-data
。 - ユーザー www-data はグループに属しています
fooers
- nginx のサーバー ルートは
/srv/foo
、単一のindex.php
ファイルを含むディレクトリです。 - のグループ所有権は
/srv/foo
グループですfooers
/srv/foo
権限がに設定されています770
このページを表示しようとすると、404 not found が表示されますが、hhvm または nginx ログにエラーは記録されません。ただし、ページのアクセス許可を変更する775
と、期待どおりに完全にサービスが提供されます。/srv/foo
hhvm
nginx
また、www-data ユーザーのデフォルトグループを fooers グループに変更すると、770 パーミッションで動作します。ユーザーの既定のグループではない場合にのみ失敗するようです。
問題は何ですか?!?!? アクセス許可が770の場合、ディレクトリへのグループアクセスを持つユーザーwww-dataとして実行されているhhvm/nginxがアクセスできない理由を知っている人はいますか?
私の正気を確認し、グループと権限が思ったとおりであることを確認するために、サービスを開始した後、次を実行します
$> ps -aux
予想どおり、hhvm プロセスと nginx プロセスが次のように実行されていwww-data
ます。
www-data 3484 .... /usr/bin/hhvm --config /etc/hhvm/server.ini --user www-data --mode daemon -vPidFile=/var/run/hhvm/pid
www-data 3617 ... nginx: worker process
グループを確認すると、次のように表示されます。
$> groups www-data
www-data : www-data fooers
ディレクトリを確認すると、グループと所有者への 100% アクセスを確認できます。
$> ls -al
total 16
drwxr-xr-x 5 root root 4096 Mar 30 15:57 .
drwxr-xr-x 22 root root 4096 Mar 30 11:52 ..
drwxrwx--- 2 root fooers 4096 Mar 30 15:39 foo
www-data
許可されているユーザーとしてファイルの内容を確認すると、次のようになります。
$> sudo -u www-data ls -al /srv/foo
total 12
drwxrwx--- 2 root fooers 4096 Mar 30 15:39 .
drwxr-xr-x 5 root root 4096 Mar 30 15:57 ..
-rw-rw-r-- 1 root fooers 38 Mar 30 15:39 index.php
fooers グループに属していないユーザーで上記を試すと、失敗します。
これが私のもの/etc/hhvm/server.ini
です:
; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.level = Warning
hhvm.log.always_log_unhandled_exceptions = true
hhvm.log.runtime_error_reporting_level = 8191
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
hhvm.mysql.typed_results = false
これが私が見落としたばかげた明白なものではないことを本当に願っています...
Web ルートの nginx ロケーション ブロックは次のとおりです。
location ~ \.php$ {
root /srv/foo
fastcgi_keep_conn on;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/foo$fastcgi_script_name;
include fastcgi_params;
}