2

Suexecなしで正しく動作するApache2.4 + FastCgi、PHP-FPM、SuExecのセットアップを行いました。しかし、Suexecを有効にすると、ファイルが存在しないというエラーが表示されます(phpスクリプトにアクセスすると、ブラウザで404 Not Foundエラーが発生します)。

注:「FastCgiWrapper」をオフにするとPHPスクリプトはPHP-FPMを介して機能しますが、オンにすると404エラーが発生します。

Apache エラー ログ(最終行) :

[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[core:info] [pid 3906:tid 140546979436288] [client 192.168.91.132:58225] AH00128: File does not exist: /etc/apache2/fcgi-app/info.php

構成:

/etc/apache2/mods-available/fastcgi.conf

FastCgiWrapper On

/etc/apache2/suexec/www-data

/var/www/html
/cgi-bin

/etc/apache2/sites-available/example.net.conf

<VirtualHost *:80>
        ServerName example.net
        ServerAdmin example@example.net
        DocumentRoot /var/www/html/example.net/public_html
        LogLevel debug
        ErrorLog ${APACHE_LOG_DIR}/error.log

    SuexecUserGroup example examplegrp
    AddHandler php-fcgi-hand .php
    Action php-fcgi-hand /php-fcgi-uri
    Alias /php-fcgi-uri fcgi-app
    FastCgiExternalServer fcgi-app -socket /var/run/php5-fpm-example.sock -pass-header Authorization -idle-timeout 30000 -flush

    <Location /php-fcgi-uri>
            Require all granted
    </Location>

</VirtualHost>

/etc/php5/fpm/pool.d/example.conf

[example]
user  = example
group = examplegrp
listen = /var/run/php5-fpm-example.sock
listen.owner = example
listen.group = examplegrp
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

/var/www/html/example.net/cgi-bin/php.cgi

#!/bin/sh 
PHP_FCGI_CHILDREN=5
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_MAX_REQUESTS
exec /var/www/html/example.net/cgi-bin

フォルダ構造と権限

/var/www/html/example.net/cgi-bin/php.cgi
/var/www/html/example.net/public_html/info.php

drwxrwxrwx 13 www-data www-data var
    |____drwxr-xr-x 5 www-data www-data www
        |____drwxr-xr-x 6 www-data www-data html
            |____ drwxr-xr-x 4 example  examplegrp example.net
                |______ drwxr-xr-x 2 example examplegrp cgi-bin
                    |_____-r-xr-xr-x 1 example examplegrp php.cgi

                |______ drwxr-xr-x 2 example examplegrp public_html
                    |_____-rwxr-xr-x 1 example examplegrp info.php
4

2 に答える 2

1

私はずっと前にこの作業構成を書きましたが、Apache 2.4.x で動作するので、試してみることをお勧めしますhttps://gist.github.com/diemuzi/3849349。ここに回答を投稿するには大きすぎます。必要なすべての構成が見つかります。あなたがここに投稿したものと比べて、私が行ったことも違うかもしれません。

FastCgiExternalServerただし、私の例でわかるように、試しているのと同じように使用することを考えるのをやめることもお勧めします. しかし、代わりにmod_proxy_fcgi. これは現在、FPM に接続するためのはるかに簡単な方法であり、最近ではソケットをサポートしています。

mod_proxy_fcgi方法の例を次に示します。

# PHP-FPM via Socket
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/usr/local/php/etc/php-fpm/[USERNAME].sock|fcgi://localhost/vhosts/[DOMAIN]/public/
    </IfModule>
</IfModule>

もちろん、unix:パスとrootドキュメントへのパスも変更する必要があります。その部分に注意してくださいlocalhost、それは間違いではありません。localhost に何を入力しても問題ありませんが、見栄えが良いと思いました。はい、IP とドメインを介して私のドメインにアクセスできますが、だまされてはlocalhostいけません。

TCP の使用方法を使用する場合は、次のmod_proxy_fcgi方法でも実行できます。

# PHP-FPM via TCP
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        <Location ~ ^/(.*\.php(/.*)?)$>
            ProxyPass fcgi://127.0.0.1:[PORT]/vhosts/[DOMAIN]/public/
        </Location>
    </IfModule>
</IfModule>

もちろん127.0.0.1:[PORT]、FPM プール内にあるものと一致することを確認してください。それに応じて変更してください。繰り返しますが、ドキュメント ルートへのパスも必ず変更してください。

私があなたに与えた3つの答えはすべて実例です。この回答を投稿する直前にテストしました。

于 2014-09-20T12:04:37.223 に答える
0

Apache を user として実行するように要求しexampleますが、構成ファイルは user 用に設定しますwww-data。ドキュメント/etc/apache2/suexec/www-dataには、Apache ユーザーがwww-data. 私はそれを試したことはありませんが、設定ファイルを設定する必要があるかもしれません/etc/apache2/suexec/example。私が少し混乱しているのは、次の 2 つの段階です。Apache ユーザーと、ターゲット cgi の実行を許可されたターゲット ユーザーです。Suexec は、これら 2 つの段階でチェックを実行します。suexecのcustomバージョンでは、別の Apache ユーザーが別の構成ファイルを使用して実行できますが、これはSuexecUserGroupApache ディレクティブを使用したターゲット ユーザーの選択とは異なります。CGI を実行するターゲット ユーザーのみを変更する場合は、Apache ユーザーを変更する必要はありません。そのために、pristineバージョンで十分です。とにかく、これは私の理解です。誰かの役に立てば幸いです。

于 2016-02-29T00:48:25.430 に答える