nginxとPHP-FPMの設定 – 専用版
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
さくらのVPSにCentOS 8をインストールした覚書です。
今回は、NginxとPHPの設定を行っていきます。
色んなバージョンのPHPが使える共存版で行く場合は「nginxとPHP-FPMの設定 - PHP共存版」をご覧ください。
なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。
環境
実施日 | 2020-05-29 |
サーバ | さくらのVPS 2G |
OS | CentOS 8.1 |
cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
事前準備
本記事は、下記の2記事の作業が終わってNginxと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