nginxとPHP-FPMの設定 – 専用版

さくらのVPSにCentOS 8をインストールした覚書です。

今回は、NginxとPHPの設定を行っていきます。

色んなバージョンのPHPが使える共存版で行く場合は「nginxとPHP-FPMの設定 - PHP共存版」をご覧ください。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2020-05-29
サーバさくらのVPS 2G
OSCentOS 8.1
cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

事前準備

本記事は、下記の2記事の作業が終わってNginxとPHP7.4が既にインストールしているところから始めます。

CentOS 8 にNginxを公式からインストール

CentOS 8 にPHP7.4をインストール

まだの場合は▲を先にご覧ください。

いろいろ確認

# PHP-FPM
vi /etc/php-fpm.conf
# この中で include=/etc/php-fpm.d/*.conf がある

# php-fpm.d
ls -la /etc/php-fpm.d/

# PHP-FPMの設定
vi /etc/php-fpm.d/www.conf

# nginx
vi /etc/nginx/nginx.conf
# この中で include /etc/nginx/conf.d/*.conf; がある

# nginx/conf.d
ls -la /etc/nginx/conf.d/

# default.conf
vi /etc/nginx/conf.d/default.conf

# php-fpm.conf
vi /etc/nginx/conf.d/php-fpm.conf

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

ここでは例として、example.com というドメインで行っていきます。
またこのドメインには専用のユーザーを割り当てます。
ユーザー名は example とします。

こちらはDNFインストール版です。
PHP共存版の設定は微妙に異なりますのでこちらをご覧ください

変数の設定

VHOST_DOMAIN=example.com
VHOST_USER=example

ユーザーを作成

useradd $VHOST_USER

ユーザーに切り替えて色々準備

# 切り替え
su $VHOST_USER

# 移動
cd

# 公開鍵認証
mkdir .ssh
chmod 0755 ./.ssh
vi ./.ssh/authorized_keys
chmod 0644 ./.ssh/authorized_keys

# www 以下にweb関連を置く
mkdir -p ./www/{log,public_html}
chmod -R 0770 ./www

# rootに戻る
exit

PHP-FPM のユーザーの設定

エディタで開いて

vi /etc/php-fpm.d/user-$VHOST_USER.conf

次の内容をそのままコピーして保存

[{VHOST_USER}]
listen = /run/php-fpm/user-{VHOST_USER}.sock
listen.owner = nginx
listen.group = nginx
user = {VHOST_USER}
group = {VHOST_USER}
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/{VHOST_USER}-slow.log
php_admin_value[error_log] = /var/log/php-fpm/{VHOST_USER}-error.log

{VHOST_USER} の個所をまとめて置換

sed -i -e "s:{VHOST_USER}:$VHOST_USER:g" /etc/php-fpm.d/user-$VHOST_USER.conf

再起動

systemctl restart php-fpm

ソケット

エディタで開いて

vi /etc/nginx/conf.d/php-fpm-$VHOST_USER.conf

次の内容をそのままコピーして保存

upstream php-fpm-{VHOST_USER} {
    ip_hash;
    server unix:/run/php-fpm/user-{VHOST_USER}.sock;
}

{VHOST_USER} の個所をまとめて置換

sed -i -e "s:{VHOST_USER}:$VHOST_USER:g" /etc/nginx/conf.d/php-fpm-$VHOST_USER.conf

バーチャルホストの設定

ファイル名はなんでも良いですが、ここでは「vhost-ドメイン.conf」

エディタで開いて

vi /etc/nginx/conf.d/vhost-$VHOST_DOMAIN.conf

次の内容をそのままコピーして保存

# https オンリーのとき、http に来たら https に301
# server {
#     listen 80;
#     listen [::]:80;
#     server_name {VHOST_DOMAIN};
#     return 301 https://$host$request_uri;
# }

server {

    # http  --------------------------------------------
    listen 80;
    listen [::]:80;

    # 証明書をセットしたら▲(http)をコメントにして▼(https)を有効にする
    # https --------------------------------------------
    # listen 443 ssl; # default_server;
    # listen [::]:443; # default_server;    # ipv6only=on;
    # ssl_certificate            /etc/letsencrypt/live/{VHOST_DOMAIN}/fullchain.pem;
    # ssl_certificate_key        /etc/letsencrypt/live/{VHOST_DOMAIN}/privkey.pem;
    # ssl_prefer_server_ciphers  on;

    # --------------------------------------------------

    server_name  {VHOST_DOMAIN};

    charset UTF-8;

    access_log /home/{VHOST_USER}/www/log/access.log  main;
    error_log  /home/{VHOST_USER}/www/log/error.log warn;

    root   /home/{VHOST_USER}/www/public_html;
    index  main.php index.php index.html index.htm;

    client_max_body_size 16M;

    # Basic認証をかけないIPアドレス
    # satisfy any;
    # allow 0.0.0.1;
    # allow 0.0.0.2;
    # deny all;

    # Basic認証用の設定を追加
    # auth_basic "Restricted";
    # auth_basic_user_file /home/{VHOST_USER}/www/.htpasswd;

    location / {
        set $redirect_url $uri;
        try_files $uri $uri/ /main.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass  php-fpm-{VHOST_USER};
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param REDIRECT_URL $redirect_url;
        fastcgi_buffer_size  128k;
        fastcgi_buffers  256 16k;
        fastcgi_busy_buffers_size  256k;
        fastcgi_temp_file_write_size  256k;
        include  fastcgi_params;
    }

    # ---------------------------------------------------------------------
    # Aulta CMS
    # ---------------------------------------------------------------------
    # location ~ ^/manager/ {
    #     set $redirect_url $uri;
    #     try_files $uri $uri/ /manager/main.php?$args;

    #     location ~* \.(jpg|jpeg|gif|png|css|js|swf|ico|pdf|svg|eot|ttf|woff)$ {
    #         expires 60d;
    #         access_log off;

    #         location ~ ^/manager/compress/.*\.(css|js)$ {
    #             set $redirect_url $uri;
    #             try_files $uri $uri/ /manager/compress/_min.php?$args;
    #         }

    #         location ~ ^/manager/uploads/ {
    #             set $redirect_url $uri;
    #             try_files $uri $uri/ /manager/uploads/_execute.php?$args;
    #         }
    #     }
    # }

    # location ~* \.(jpg|jpeg|gif|png|css|js|swf|ico|pdf|svg|eot|ttf|woff)$ {
    #     expires 60d;
    #     access_log off;

    #     location ~ ^/compress/.*\.(css|js)$ {
    #         set $redirect_url $uri;
    #         try_files $uri $uri/ /compress/_min.php?$uri&$args /compress/_min.php?$args;
    #     }

    #     location ~ ^/uploads/ {
    #         set $redirect_url $uri;
    #         try_files $uri $uri/ /uploads/_execute.php?$uri&$args /uploads/_execute.php?$args;
    #     }
    # }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ /\.ht {
        deny  all;
    }
}

{VHOST_DOMAIN} と {VHOST_USER} の個所をまとめて置換

sed -i -e "s:{VHOST_DOMAIN}:$VHOST_DOMAIN:g" /etc/nginx/conf.d/vhost-$VHOST_DOMAIN.conf
sed -i -e "s:{VHOST_USER}:$VHOST_USER:g" /etc/nginx/conf.d/vhost-$VHOST_DOMAIN.conf

Basic認証のパスワードファイル

Basic認証の設定を入れたのでパスワードファイルを作成
不要な場合は、auth_basic のところをコメントか削除

# htpasswd が使えるなら
htpasswd -c /home/$VHOST_USER/www/.htpasswd sample_user

# htpasswd が無い場合
vi /home/$VHOST_USER/www/.htpasswd

chown $VHOST_USER:$VHOST_USER /home/$VHOST_USER/www/.htpasswd

ユーザーグループの設定

バーチャルホストで、PHPの実行ユーザーは変えれるけど、通常ファイルのアクセスユーザーは変えれんっぽいので。 (このあたりもう少し調査は必要)

# 現在の状態を確認
cat /etc/group | grep nginx
cat /etc/group | grep $VHOST_USER

# nginxグループに加える
usermod -aG $VHOST_USER nginx

# ▼は無くても良い
# usermod -aG nginx $VHOST_USER

# 確認
cat /etc/group | grep nginx
cat /etc/group | grep $VHOST_USER

# 外す場合
usermod -G "" $VHOST_USER
usermod -G "" nginx

# グループに x を加える
chmod 0710 /home/$VHOST_USER

設定を反映

# エラーチェック
nginx -t

# 再起動
systemctl restart nginx

SSLを設定する

SSLを設定する場合は▼の手順で行います。

CentOS8に無料SSL「Let’s Encrypt」を設定する

# 証明書の確認
ls -la /etc/letsencrypt/live
# 証明書の発行
certbot certonly --webroot -w /home/★/www/public_html --email letsencrypt-★@example.com --debug -d $VHOST_DOMAIN

証明書を作ったら▼から http と https の設定をする

vi /etc/nginx/conf.d/vhost-$VHOST_DOMAIN.conf

再起動

# エラーチェック
nginx -t

# 再起動
systemctl restart nginx