web-dev-qa-db-ja.com

FastCGI:NGinxおよびPHP-FPMでプライマリスクリプトを開くことができない

この問題を抱えているのは私だけではないようですが、カップル向けに提案されたすべての解決策を試した後、何をすべきかわからないところにたどり着きました。

Ubuntu 16.04、NGinx、PHP-FPMを実行しています。

Nginx.confはデフォルトのものです。私はより情報的なログ形式のみを設定します。

ユーザー権限は問題ないようです。NGinxとPHP_FPMはユーザーwww-dataの下で実行されます。ドキュメントルートの所有者はwww-dataです。 FPM-Poolの所有者はwww-dataです。ソケットファイルがあり、書き込み可能です。

私はすでにフォルダとファイルのアクセス許可を最も弱いものに設定しようとしました(chmod 777):結果はありません。

これは私のserver.confです。コメント行からわかるように、たくさんのトリックを試しましたが、効果はありませんでした。

server {
    listen         8080;
#    listen         8080 default_server;
 #   listen         [::]:8080 default_server;
    server_name    example.com www.example.com
    root           /var/www/nginx/;
    index          index.php;
        access_log /var/log/nginx/scripts.log scripts;


    gzip             on;
    gzip_comp_level  3;
    gzip_types       text/plain text/css application/javascript image/*;

    location ~ \.php$ {
        if ($uri !~ "^/uploads/") {
            fastcgi_pass unix:/run/php/php-fpm-www.sock;

        }

    include fastcgi.conf;

#    include         snippets/fastcgi-php.conf;
    include         fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;

  }

    # Block access to .htaccess
    location ~ \.htaccess {
        deny all;
    }

}    

これがfpm-pool構成です。

[www]
listen = /run/php/php-fpm-$pool.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
php_admin_flag[allow_url_fopen] = off
php_admin_flag[allow_url_include] = off
php_admin_value[memory_limit] = 128M
pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
chroot = /var/www/nginx/
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
catch_workers_output = yes

これは、nginxのaccess.logの出力です。

/var/www/nginx/index.php > GET /index.php HTTP/1.1

そしてそれが実際のerror.logです。

2018/08/29 17:34:27 [error] 24020#24020: *47 FastCGI sent in stderr: "Unable to open primary script: /var/www/nginx/index.php (No such file or directory)" while reading response header from upstream, client: 213.61.37.18, server: example.com, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php-fpm-www.sock:", Host: "example.com:8080"
3
n.r.

@michaelのヒントを読んだ後、自分自身のエラーを見つけました-啓蒙に感謝します。

私はchrootを使用しています。なぜなら、その目標は、それ自体のすべてのWebサイトを「監獄」にすることですenvironment /フォルダー。したがって、この特定のenvironmentのルートを実際のファイルシステムの場所/ var/www/nginxに設定します。

NGinxのサーバー構成内では、先行する$ document_rootを指定してfastcgiパラメーターSCRIPT_FILENAMEを渡します。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

NGinxでは、$ document_rootはrootディレクティブを参照します。 $ document_rootはもちろん/ var/www/nginx

しかし、PHP -environmentには「変更されたルート」があります(/は/ var/www/nginxを意味します)。つまり、PHPは、フォルダ/ var/www/nginxでindex.phpを探しています。ただし、ルートフォルダは「仮想」なので、PHPの/ var/www/nginxは実際には実際のファイルシステム上のこの場所をポイントします:/ var/www/nginx/var/www/nginx。

したがって、パラメーターをこれに変更すると、エラーが修正されます。

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
2
n.r.