CentOS8にNginxとPHP、Laravel、MySQLを導入する方法

投稿者: | 2020-09-27

前回はCentOS8にNginxとRails、Unicornを導入するRuby環境について説明しました。今回はNginxにPHPとLaravelを導入する方法について説明します。

実施環境

OS CentOS8 最小のインストール
Nginx 1.18.0
PHP 7.4.10
MySQL 8.0.21
Composer 1.10.13
Laravel 8.6.0

事前準備

初めに今回の作業を行うために必要なコマンドをインストールします。

・作業に必要なコマンドをインストールする
# dnf -y install wget tar unzip

インストール後、Storage配下のlaravel.logのPermission denyを回避するため、SELinuxを無効にします。

・SELinuxを無効にする
# vi /etc/selinux/config

■config
-----------------------------------------------------------
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled   # enforcingをdisabledにする
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
-----------------------------------------------------------

・SELinux反映のため、端末を再起動する
# reboot

Nginxのインストール

コマンドのインストール、SELinuxの無効後、Nginxをインストールします。今回はリポジトリから安定版をインストールします。

・yum.repo.d配下にNginx用のリポジトリファイルを作成する
# vi /etc/yum.repos.d/nginx.repo

■nginx.repo
-----------------------------------------------------------
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
-----------------------------------------------------------

・Nginxをインストールする
# dnf -y install nginx

・Nginxのバージョンを確認する
# nginx -v
nginx version: nginx/1.18.0

Nginxのインストール後、Nginxの起動・自動起動の設定をします。

・Nginxの起動・自動起動の設定をする
# systemctl start nginx
# systemctl enable nginx

Nginxの起動・自動起動の設定後、FirewallでHTTPを許可します。

・FirewallのHTTPサービスを許可する
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

PHP、PHP-FPMのインストール

Nginxのインストール後、PHPとPHP-FPMをインストールします。今回のPHP関連はremiリポジトリからインストールをします。

・epel-release、remiリポジトリをインストールする
# dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm 
# dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

・remiリポジトリのPHP7.4を有効にし、PHP-FPMをインストールする
# dnf module install -y php:remi-7.4

・PHP7.4をインストールする
# dnf -y install php

・PHPのバージョンを確認する
# php -v
PHP 7.4.10 (cli) (built: Sep  1 2020 13:58:08) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.10, Copyright (c), by Zend Technologies

PHP、PHP-FPMのインストール後、PHP-FPMの設定をします。

・PHP-FPMの設定ファイルを編集する
# vi /etc/php-fpm.d/www.conf

■www.conf
------------------------------------------------------------
; PHP-FPMのユーザーを設定する
user = nginx
group = nginx

; プロセスの制御方法を設定する
pm = dynamic

; 子プロセスの最大数を設定する
pm.max_children = 8

; 起動時に作成される子プロセスを設定する
pm.start_servers = 4

: 待機子プロセスの最小値を設定する
pm.min_spare_servers = 2

; 待機子プロセスの最大値を設定する
pm.max_spare_servers = 4

; 再起動するまでの最大リクエスト数を設定する
pm.max_requests = 500

; listenするソケットファイルを設定する
listen = /var/run/php-fpm/php-fpm.sock

; listenオーナー、グループを設定する
listen.owner = nginx
listen.group = nginx
------------------------------------------------------------

PHP-FPMの設定ファイルの編集後、PHP-FPMを起動・自動起動の設定をします。

・PHP-FPMを起動・自動起動の設定をする
# systemctl start php-fpm
# systemctl enable php-fpm

MySQLのインストール、設定

PHP、PHP-FPMのインストール後、MySQLをインストールします。

・MySQLをインストールする
# cd /usr/local/src
# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-1.el8.x86_64.rpm-bundle.tar 

・MySQLのbundleを展開する
# tar xf mysql-8.0.21-1.el8.x86_64.rpm-bundle.tar

・MySQLをインストールする
# dnf localinstall mysql-community-*

・ダウンロードしたMySQL関連のファイルを削除する
# rm -rf mysql*

・MySQLの拡張機能をインストールする
# dnf -y install php-mysql

MySQLのインストール後、MySQLの起動・自動起動の設定をします。

・MySQLを起動・自動起動の設定をする
# systemctl start mysqld
# systemctl enable mysqld

MySQLの起動後、rootユーザーのパスワードの変更、Laravelの環境で使用するデータベースの作成、データベースユーザーの作成をします。

・rootユーザーのパスワードを検索する
# grep 'temporary password' /var/log/mysqld.log
2020-09-25T14:48:18.483768Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 0po:UQexoqR? 

・MySQLにログインする
# mysql -u root -p

・rootユーザーに「5e#Ej8n!o」というパスワードを設定する
mysql> alter user 'root'@'localhost' identified by '5e#Ej8n!o';

・Laravel用のデータベースを作成する
mysql > create database laravel;

・Laravel用のユーザーを作成する
mysql > create user 'laravel'@'localhost' identified by 'P@ssW0rd';

・Laravel用のユーザーにデータベースの権限を付与する
mysql > grant all on laravel.* to 'laravel'@'localhost';

Laravel用のデータベースの設定後、php.iniでMySQLのソケットファイルのパスを設定します。

・php.iniにMySQLのソケットファイルを設定する
# vi /etc/php.ini

■php.ini
------------------------------------------------------------
 --- 省略 ---
pdo_mysql.default_socket=/var/lib/mysql/mysql.sock
------------------------------------------------------------

・Nginxを再起動する
# systemctl restart nginx

Composerのインストール

MySQLのインストール後、パッケージ管理ツールのComposerをインストールします。

・Composerのインストーラーをダウンロードする
# cd /usr/local/src
# wget https://getcomposer.org/installer -O composer-installer.php

・Composerを/usr/local/binにインストールする
# php composer-installer.php --filename=composer --install-dir=/usr/local/bin 

・Composerをアップデートする
# composer self-update

・Composerのバージョンを確認する
# composer -V
Composer version 1.10.13 2020-09-09 11:46:34

Laravelのプロジェクト作成

Composerのインストール後、Laravelのプロジェクトを作成します。今回は/var/www/html/sample配下にプロジェクトを作成します。

・Laravelアプリケーション用のディレクトリを作成
# mkdir -p /var/www/html/sample && cd /var/www/html/sample

・Laravelのプロジェクトを作成する
# composer create-project laravel/laravel /var/www/html/sample --prefer-dist 

・Laravelのバージョンを確認する
# php artisan -V
Laravel Framework 8.6.0

Laravelの権限設定、動作確認

Laravelのプロジェクト作成後、各種アクセス権限の設定、Laravel用のユーザー・グループの作成をします。

・Laravelプロジェクト配下のアクセス権を変更する
# find ./ -type d -exec chmod 755 {} \;
# find ./ -type f -exec chmod 644 {} \;

・Laravel用のグループの作成、ユーザー・nginxを追加する
# groupadd laravel
# gpasswd -a nginx laravel

・storageとbootstrap/cacheの所有グループを変更する
# chown -R :laravel ./storage
# chown -R :laravel ./bootstrap/cache

・storageとbootstrap/cacheのファイル作成時の権限を設定する
# find ./storage -type d -exec chmod 775 {} \;
# find ./storage -type f -exec chmod 664 {} \;
 
# find ./bootstrap/cache -type d -exec chmod 775 {} \;
# find ./bootstrap/cache -type f -exec chmod 664 {} \;

・ディレクトリ内で作成されたファイルを指定したSGIDになるように設定する
# find ./storage -type d -exec chmod g+s {} \;
# find ./bootstrap/cache -type d -exec chmod g+s {} \;

・ACLを設定し、ディレクトリやファイル作成時のアクセス権を設定する
# setfacl -R -d -m g::rwx ./storage
# setfacl -R -d -m g::rwx ./bootstrap/cache

Laravelプロジェクトの設定後、Laravelの動作確認を行うため一時的にFirewallの8000ポートを開放します。

・Firewallの8000ポートを許可する
# firewall-cmd --add-port=8000/tcp --zone=public --permanent
# firewall-cmd --reload

Firewallの設定後、Larvelを起動します。

・Laravelを起動する
# php artisan serve --host <サーバのIPアドレス>

Laravelの起動後、ブラウザを開き「http://<サーバのIPアドレス>:8000」にアクセスし、Laravelのトップページが表示されれば成功です。

Laravelの動作確認後、Firewallのポートを閉じます。

・Firewallの8000ポートを閉じる
# firewall-cmd --remove-port=8000/tcp --zone=public --permanent
# firewall-cmd --reload

Laravelのデータベースの設定

Laravelの動作確認後、Laravelプロジェクトで使用するデータベースの設定をします。

・Laravelプロジェクトの環境設定ファイルを編集する
# vi /var/www/html/sample/.env

■.env
------------------------------------------------------------
 --- 省略 ---
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=P@ssW0rd
 --- 省略 ---
------------------------------------------------------------

.envファイルの設定後、データベースの接続確認を行います。

・データベースにLaravel関連のテーブルを作成する
# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (32.62ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (22.53ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (24.98ms)
Migrating: 2020_09_26_151701_create_posts_table
Migrated:  2020_09_26_151701_create_posts_table (14.14ms)

・データベースにテーブルが作成されたか確認する
mysql > use laravel
mysql > show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs       |
| migrations        |
| password_resets   |
| posts             |
| users             |
+-------------------+

Nginxの設定

データベースの設定後、NginxでLaravelを起動するための設定をします。今回はNginxのdefault.confファイルからlaravel用のconfファイルを作成し編集します。

・default.confからlaravel.confを作成する
# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/laravel.conf
# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak 

・Nginxのログ格納用ディレクトリを作成する
# mkdir /var/log/nginx/laravel

・laravel.confを編集する
# vi /etc/nginx/conf.d/laravel.conf

■laravel.conf
------------------------------------------------------------
server {
    # Listenポート、ドメイン名の設定(今回はlocalhostとします)
    listen       80;
    server_name  localhost;

    # rootディレクトリを設定する
    root /var/www/html/sample/public;

    # Nginxの拡張子の優先度を設定する
    index index.php index.html index.htm;

    # Nginxのログファイルの場所を設定する
    access_log /var/log/nginx/laravel/access.log;
    error_log /var/log/nginx/laravel/error.log;

    # URLの振り分けを設定する
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # エラーページの設定をする
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # PHP関連の設定をする
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root/index.php;

        include        fastcgi_params;
    }
}
------------------------------------------------------------

laravel.confの設定後、rootディレクトリの所有者をnginxに変更します。

・rootディレクトリの所有者を変更する
# chown -R nginx. /var/www

全ての設定完了後、Nginxを再起動します。

・Nginxを再起動する
# systemctl restart nginx

動作確認

Nginxの再起動後、ブラウザを開きURLに「http://<サーバのIPアドレス>」にアクセスし、トップページが表示されれば成功です。