web-dev-qa-db-ja.com

Apache:php-fpm chrootのセットアップ後の「ファイルが見つかりません」

CentOS 7で動作するApache 2.4を使用してphp-fpmにchrootを実装する最後のステップで苦労しています。

私は 成功したセットアップ および テスト済み chrootなしのphp-fpm接続を使用しましたしかし、/ etc/php-fpm.d/file.confのconfファイルにchrootディレクティブを追加するとすぐに、「ファイルが見つかりません」というメッセージが表示されます 他の多くの人が経験したように

これが私のphp-fpm confファイルです:

[site1.com]
user = user1
group = user1
listen = /var/run/php-fpm/site1.com.sock
listen.owner = user1
listen.group = user1
php_admin_value[disable_functions] = exec,passthru,Shell_exec,system
php_admin_flag[allow_url_fopen] = on
php_admin_value[short_open_tag] = On
php_admin_value[doc_root] = /
php_admin_value[error_log] = /logs/php-errors
php_admin_flag[log_errors] = on
pm = ondemand
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chroot = /home/www/site1.com
chdir = /www
catch_workers_output = yes

ご覧のように、chrootを設定した後、chdirディレクティブをPHP rootに関連するように変更しました。(システムパスは/home/www/site1.com/www、そしてchdirディレクティブを有効にする前にchrootが設定されたものです)。

ここに私の関連するhttp.d/site1.confファイルがあります:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName site1.com
        ServerAlias www.site1.com
        DocumentRoot /home/www/site1.com/www
        <Directory "/home/www/site1.com/www">
                Options Includes FollowSymLinks
                DirectoryIndex index.php
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
ErrorLog /home/www/site1.com/logs/errors
CustomLog /home/www/site1.com/logs/access_log common
        <FilesMatch "\.php$">
                SetHandler "proxy:unix:///var/run/php-fpm/site1.com.sock|fcgi://site1.com"
        </FilesMatch>
LogLevel trace3
</VirtualHost>

Httpd.d/site.confファイルでLogLevelを上げました。興味深い出力の一部を以下に示します。

  [Mon Nov 02 10:42:52.665284 2015] [proxy:trace2] [pid 14286] proxy_util.c(2007): [client 74.221.189.99:16486] *: found reverse proxy worker for unix:///var/run/php-fpm/site1.com.sock|fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665292 2015] [proxy:trace2] [pid 14286] proxy_util.c(2041): [client 74.221.189.99:16486] *: rewrite of url due to UDS(/var/run/php-fpm/site1.com.sock): fcgi://site1.com/home/www/site1.com/www/index.php (proxy:fcgi://site1.com/home/www/site1.com/www/index.php)
    [Mon Nov 02 10:42:52.665295 2015] [proxy:debug] [pid 14286] mod_proxy.c(1117): [client 74.221.189.99:16486] AH01143: Running scheme unix handler (attempt 0)
    [Mon Nov 02 10:42:52.665300 2015] [proxy_ajp:debug] [pid 14286] mod_proxy_ajp.c(713): [client 74.221.189.99:16486] AH00894: declining URL fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665304 2015] [proxy_fcgi:debug] [pid 14286] mod_proxy_fcgi.c(948): [client 74.221.189.99:16486] AH01076: url: fcgi://site1.com/home/www/site1.com/www/index.php proxyname: (null) proxyport: 0
    [Mon Nov 02 10:42:52.665307 2015] [proxy_fcgi:debug] [pid 14286] mod_proxy_fcgi.c(955): [client 74.221.189.99:16486] AH01078: serving URL fcgi://site1.com/home/www/site1.com/www/index.php
    [Mon Nov 02 10:42:52.665311 2015] [proxy:debug] [pid 14286] proxy_util.c(2200): AH00942: FCGI: has acquired connection for (*)
    [Mon Nov 02 10:42:52.665316 2015] [proxy:debug] [pid 14286] proxy_util.c(2253): [client 74.221.189.99:16486] AH00944: connecting fcgi://site1.com/home/www/site1.com/www/index.php to site1.com:8000
    [Mon Nov 02 10:42:52.665320 2015] [proxy:debug] [pid 14286] proxy_util.c(2286): [client 74.221.189.99:16486] AH02545: fcgi: has determined UDS as /var/run/php-fpm/site1.com.sock
    [Mon Nov 02 10:42:52.665420 2015] [proxy:debug] [pid 14286] proxy_util.c(2419): [client 74.221.189.99:16486] AH00947: connected /home/www/site1.com/www/index.php to httpd-UDS:0
    [Mon Nov 02 10:42:52.668135 2015] [proxy_fcgi:error] [pid 14286] [client 74.221.189.99:16486] AH01071: Got error 'Primary script unknown\n'
    [Mon Nov 02 10:42:52.668179 2015] [proxy_fcgi:trace1] [pid 14286] util_script.c(599): [client 74.221.189.99:16486] Status line from script 'index.php': 404 Not Found
    [Mon Nov 02 10:42:52.668237 2015] [http:trace3] [pid 14286] http_filters.c(992): [client 74.221.189.99:16486] Response sent with status 404
    [Mon Nov 02 10:42:52.668284 2015] [proxy:debug] [pid 14286] proxy_util.c(2215): AH00943: FCGI: has released connection for (*)

phpエラーログファイルに何も表示されません

それで、結局のところ、

  • 「ファイルが見つかりません」というエラーメッセージが引き続き表示されるのはなぜですか?
  • さらに良い方法は、それをどのように修正するか、少なくとも問題のトラブルシューティングをどのように行うかです。
6
David W

これは解決されました。上記のコードには2つの問題がありました。

問題#1-Apache 2.4.10以降のみがソケットをサポートできます

ベースのCentOSリポジトリに含まれるApacheのデフォルトバージョン(Apache 2.4.6)は、TCP portsのみをサポートします。したがって、上記のコードは正しくありません。listenディレクティブphp-fpm設定ファイルで、次のように変更する必要があります。

listen = 127.0.0.1:9001

また、http.d confファイルに適切な変更を加えましたが、さらに、ProxyPassMatchディレクティブを使用する代わりに、FilesMatchディレクティブを使用するように切り替えました。だから私のコードは次のようになりました:

ProxyPassMatch "^/(.*\.php)$" "fcgi://127.0.0.1:9001/site1.com"

このコードはまだ間違っていることに注意してください...以下を参照してください

次へ...

問題#2-関連するパス

Http.d confファイル内のProxyPassMatchディレクティブのパス(または、FilesMatchディレクティブを使用している私の古いコードの場合)のパスは、相対chrootになります。これは、wwwドキュメントルート(異なる場合)とは相対的ではありません。

したがって、私のhttp.d confファイルのコードは次のようになります。

ProxyPassMatch "^/(.*\.php)$" "fcgi://127.0.0.1:9001/www/$1"

そして出来上がり!私はphp-fpm chrootを持っています。

5
David W

php-fpmには、chrootとパスに関するバグがあります。

たとえば、wwwのindex.php

chroot = /home/www/site1.com
chdir = /www

この設定php-fpmを使用して、次のパスを記述します。

/home/www/site1.com/home/www/site1.com/www

1つの解決策は、シェルでシンボリックリンクを作成することです。

cd /home/www/site1.com
mkdir -p home/www
cd home/www
ln -s /home/www/site1.com site1.com

しかし、それはきれいではありません。

https://bugs.php.net/bug.php?id=55322

https://bugs.php.net/bug.php?id=62279

4
Benjish

2つの理由でこのエラーを受け取る人もいます。

  • Php.iniの間違った相対パス
    PHP-FPM.confでopen_basedir、doc_root、user_dir、session.save_path、upload_tmp_dir(およびその他)を指定する場合、これらのパスはchrootからの相対パスである必要があります。
    例えば:

chroot =/var/www
php_admin_value [doc_root] =/htdocs
; chroot後はすべてのパスがchrootからの相対パスでなければなりませんPHPは絶対パスを認識していません

  • php.iniのcgi.fix_pathinfo = 1
    TL; DRは0に変更するだけです。
    このパラメーターはCGI専用であることを示していますが、何らかの理由でこの値はPHP-FPMに影響します。
    このパラメータについては、他の問題も引き起こす可能性があるため、詳細を読む必要があります。詳細 ここ
3
regdude

SElinuxを有効にしていますか? getenforceがこれを通知できるはずです。その場合は、setenforce 0で無効にしてから、/ etc/sysconfig/selinuxを編集してSELINUXを無効に設定し、再起動後も持続するようにする必要があります。

1
Mugurel