Nginx + php-fpm設定

ここでは、Nginxとphp-fpmの組み合わせで、
PHPを各ユーザー権限で動作させる設定を説明する。

なお、PHPのバージョンは7.Xとする。
また、各ユーザーのHTMLコンテンツは、「public_html」に入れるものとする。
この記事の例では「test-user」という名のユーザーを例とするため、
「/home/test-user/public_html」が、HTML領域となる。

php-fpmのインストール

$ yum install php70-fpm

次に、php-fpmの設定ディレクトリに移動。

$ cd /etc/php-fpm-7.0.d

今回の運営方法は、このディレクトリに各ユーザーの情報、
「users.conf」ファイルを作成し、
このファイルで各ユーザーを一元管理する方法で行う。

「vi users.conf」で、以下の中身のconfファイルを作成する。

[test-user]
listen = /var/run/php-fpm/php-fpm_test-user.sock
listen.mode = 0666
user = test-user
group = test-user
pm = ondemand
pm.max_children = 3
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200

ここでphp-fpmを再起動すると、
「/var/run/php-fpm/」領域に「php-fpm_test-user.sock」ファイルが作成される。
このファイル自体は空ファイルだが、何も触る必要はない。

Nginxのバーチャルホスト設定

次に、Nginxのバーチャルホストを設定する。
バーチャルホストとは、サーバーにアクセスした際のURLに応じて、
訪問者にアクセスさせる領域を分けるというものである。

「/etc/nginx/conf.d/virtual.conf」を編集する。

$ cd /etc/nginx/conf.d/
$ vi virtual.conf

「virtual.conf」は、最初から存在するサンプルファイルだが、
全行コメントアウトされているサンプルコードが記載されているだけである。
このファイルの中身を空にして編集するもよし、
「.conf」拡張子なら全て読み込むため、
別途好きな名前の「.conf」ファイルを作成してもよい。

「virtual.conf」の中身

server {
    listen       80;
    server_name  www.test-user.com;
    access_log  /var/log/nginx/test-user.access.log  main;

    client_max_body_size 5M;
    try_files $uri $uri/ /index.php?q=$uri&$args;

    location / {
        root /home/test-user/public_html;
        index index.php index.html index.htm;

        if (!-e $request_filename) {
            rewrite ^.+?(/wp-.*) $1 last;
            rewrite ^.+?(/.*\.php)$ $1 last;
            rewrite ^ /index.php last;
        }
    }
    location ~* \.php$ {
        root /home/blog-tos04340/public_html;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm_test-user.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

「server_name」に、アクセスするURLを記載する。
「access_log」は、ログの場所である。ここに記載すれば自動的に保存される。

「try_files」は、アクセスしたURLが実ファイルではなく、
ディレクトリパスがパラメータであった場合に、「index.php」に処理を行わせるというもの。

「location /」内の以下の要素は、WordPressを使用する際に必要になる。

        if (!-e $request_filename) {
            rewrite ^.+?(/wp-.*) $1 last;
            rewrite ^.+?(/.*\.php)$ $1 last;
            rewrite ^ /index.php last;
        }

これらは、WordPressのパーマリンク設定を利用可能にする。

「location ~* \.php$」は、PHPファイルにアクセスした際の動作である。
とくにこの中の「fastcgi_pass」は、要注意。
先に設定した、php-fpmの「listen」項目で指定した
「.sock」ファイルと同じファイルを、フルパス指定する

これで、Nginxを再起動しよう。

$ service nginx restart

再起動が終わったら「public_html」に、
以下の中身を記述した「index.php」を置いてみよう。

<?;php

echo posix_getpwuid(posix_geteuid())['name'];

これで対象のユーザー名、
この例の場合なら「test-user」と表示されれば成功である。

以降、ユーザーを追加する場合、
「/etc/php-fpm-7.0.d/users.conf」と「/etc/nginx/conf.d/virtual.conf」に対し、
同じようにユーザー情報を追加していくとよい。

ユーザーディレクトリのパーミッション

このままアクセスしても、パーミッションエラーになる。
最後の仕上げとして、各ユーザーディレクトリのパーミッションを、
「755」に設定するとよい。

$ cd /home
$ chmod 755 test-user

参考

CentOS7 + Nginx + PHP-FPM でPHPを実行する環境を整える

【nginx】WordPress 用のパーマリンク設定を修正しました♪