はじめに
Nginxとphp-fpmの権限関連でハマったので、まとめることにしました。
実践
ゴール
・Nginx
・PHP 7.4
・Laravel6
・MySQL
やっていくこと
・Nginx、PHP7.4のインストール
・Laravel6のインストール
・MySQLのインストール
・Laraveのindex.phpの表示
Nginxのインストール
公式のに従いましょう。nginx: Linux packages
$ sudo yum install -y yum-utils
$ sudo vi /etc/yum.repos.d/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
うまくいっているかの確認。以下の通りになればおk。
$ yum info nginx
利用可能なパッケージ
名前 : nginx
アーキテクチャー : x86_64
エポック : 1
バージョン : 1.18.0
リリース : 1.el7.ngx
容量 : 772 k
リポジトリー : nginx-stable/7/x86_64
要約 : High performance web server
URL : http://nginx.org/
ライセンス : 2-clause BSD-like license
説明 : nginx [engine x] is an HTTP and reverse proxy server, as well as
: a mail proxy server.
そしたら、インストールして起動までの設定もやっていく。
$ sudo yum install -y nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
ここで確認したくなるけど、多分表示されない。初期の設定だと、firewallとSELinuxに捕まるからその設定をしにいく。また、この時Cloud9用のポートも開けておく。
$ sudo vi firewall.sh
#!/bin/sh
firewall-cmd --permanent --add-service=http --zone=public
firewall-cmd --permanent --add-service=https --zone=public
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload
$ sudo bash firewall.sh
これ以降、スクリプトを多用する。よくわからなかったら、全部の先頭にsudoをつけて実行してくれれば良い。
次にSELinux
の設定。
$ sudo vi /etc/selinux/config
SELINUX=permissive
今回はpermissiveを試してみます。不安であれば、disabledでも良いと思います。設定を有効化するために再起動します。
$ sudo reboot
これでアクセスできるはずです。URLは、http://localhost
または、端末のIPがわかればhttp://端末のIP
でいけるはずです。
PHP7.4のインストール
Remiリポジトリを利用していきます。dnf
はいらないかもしれません。
#!/bin/sh
yum -y install wget
yum -y install epel-release
# Remiリポジトリの追加
rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm
$ sudo bash remi.sh
上手くいったらレポジトリの確認をします。その後、php74がRemiレポジトリにあるかを確認します。確認できたら、レポジトリを対応させてインストールします。バージョン確認で、表示されたら成功です。
$ sudo yum repolist
base/7/x86_64 CentOS-7 - Base
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
extras/7/x86_64 CentOS-7 - Extras
remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64
$ sudo yum info php74
利用可能なパッケージ
名前 : php74
アーキテクチャー : x86_64
バージョン : 1.0
リリース : 3.el7.remi
容量 : 2.6 k
リポジトリー : remi-safe
要約 : Package that installs PHP 7.4
ライセンス : GPLv2+
説明 : This is the main package for php74 Software Collection,
: that install PHP 7.4 language.
$ sudo yum -y install --enablerepo=epel,remi,remi-php74 php
$ php -v
PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
そうしたら、インストール関連の要件で必要なものを調べてから、インストールします。満たさないといけない用件は以下の通りです。
・PHP >= 7.2.0
・BCMath PHP拡張
・Ctype PHP拡張
・Fileinfo PHP拡張
・JSON PHP拡張
・Mbstring PHP拡張
・OpenSSL PHP拡張
・PDO PHP拡張
・Tokenizer PHP拡張
・XML PHP拡張
# 確認のコマンド
$ php -m | grep -e bcmath -e ctype -e fileinfo -e json -e mbstring -e openssl -e PDO -e tokenizer -e ^xml$
ctype
fileinfo
json
openssl
tokenizer
自分の環境の場合、BCMathとMbstring、PDO、XMLが不足していました。また、先ほどインストールにはRemiレポジトリを利用したため、引き続き利用してインストールしていきます。
$ sudo yum -y install --enablerepo=epel,remi,remi-php74 php-bcmath php-mbstring php-pdo php-xml php-cli php-devel php-zip php-fpm php-mysqlnd
また必要なツールが足りなかったので追加でインストールしました。
phpinfoを表示させる
まず、index.php
を作っていく。
$ sudo vi /var/www/html/index.php
<?php
phpinfo();
?>
あと権限とユーザーの設定。ここら辺は不安なところがあるので、わかる人はコメントをいただけると幸いです。
# グループの確認
$ sudo cat /etc/group
nginx:x:995:
# グループ内のユーザー確認
$ groups nginx
nginx : nginx
$ sudo chown $USER:nginx -R /var/www
$ sudo chmod 755 -R /var/www
そうしたら、php-fpm
の設定。注意点としては、Apache
と違ってwww-data
はなく、nginx
のユーザーとグループを使っている。
$ sudo vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
# ここの名前はNginxのFastCGIで使うときに合わせるから気をつけて
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
# 保存したら再起動
$ sudo service php-fpm start
そうしたらドキュメントルートの設定。
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org
$ sudo vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
#error_page 404 /404.html;
# エラー確認用に敢えてコメントアウトしてます
# 動くようになったら戻してね
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root /usr/share/nginx/html;
#}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# 自分はrootの設定も必要だったので修正しました
root /var/www/html
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
そしたら諸々再起動
$ sudo systemctl enable php-fpm.service
$ sudo systemctl enable nginx.service
$ sudo service nginx restart
$ sudo service php-fpm restart
Laravel6のインストール
LaravelをインストールするためにComposerをインストールしていきます。
$ sudo wget https://getcomposer.org/installer -O composer-installer.php
$ sudo php composer-installer.php --filename=composer --install-dir=/usr/local/bin
$ composer self-update
$ composer -v
最後のコマンドが通ったら、Composerのインストールは完了です。Composerを利用して、Laravel6をインストールしていきましょう。ここまできたら、日本語訳公式のインストール手順が使えるので、それを元に進めます。
$ composer global require laravel/installer
そうしたら、ドキュメントにある通りにパスを通します。コマンドで確認してから、そのパスを通すのが良いと思います。パスのパターンは2種類あるので、どちらでも良いかもしれません。
$HOME/.config/composer/vendor/bin
$HOME/.composer/vendor/bin
# パスを通すディレクトリの確認法
$ composer global about
Changed current directory to /home/centos/.config/composer
Composer - Dependency Manager for PHP
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.
# パスを通す
$ export PATH=$PATH:$HOME/.config/composer/vendor/bin
# 確認
$ echo $PATH
# 一番後ろが以下のようになっていれば成功です
:/home/centos/.config/composer/vendor/bin
# 一応永続化
$ source ~/.bash_profile
ユーザーのホームディレクトリ以下ではlaravel new アプリ名
でアプリを作ることができます。ただ今回は、公開ディレクトリに作りにいきましょう。なのでコマンドが変わります。
$ cd /var/www/html
$ composer create-project --prefer-dist laravel/laravel blog "6.*"
今回は、blog
という名前でアプリケーションを作っていきます。
Laravelの初期設定をしていきます。.env
ファイルの設定は、MySQLの設定後にやります。
$ sudo chown $USER:nginx -R blog
$ sudo find blog -type d -exec chmod 750 {} \;
$ sudo find blog -type f -exec chmod 640 {} \;
$ sudo chmod 770 -R blog/storage blog/bootstrap/cache
Nginxの設定
Nginxのドキュメントルートを変更していきます。
$ sudo vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
# blog/public が追加されました
root /var/www/html/blog/public;
index index.php index.html index.htm;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root /usr/share/nginx/html;
#}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
# blog/public が追加されました
root /var/www/html/blog/public;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
そしたら、リスタート。
$ sudo service nginx restart
ここで、URLにアクセスしてみるとLaravel
の画面が表示されました。
MySQLのインストール
MariaDBを削除してからインストールします。MySQLのyumリポジトリからNo thanks,just start my download.
のリンクをコピーして入れます。
MySQL Community Downloads
$ rpm -qa | grep maria
$ sudo yum -y remove mariadb-libs
$ sudo rm -rf /var/lib/mysql/
$ sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
インストールできるかを確認してみましょう。
$ yum info mysql-community-server
利用可能なパッケージ
名前 : mysql-community-server
アーキテクチャー : x86_64
バージョン : 8.0.20
リリース : 1.el7
容量 : 488 M
リポジトリー : mysql80-community/x86_64
要約 : A very fast and reliable SQL database server
URL : http://www.mysql.com/
ライセンス : Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights
: reserved. Under GPLv2 license as shown in the Description field.
インストールと確認。
$ sudo yum -y install mysql-community-server
/usr/sbin/mysqld Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld
大抵は、5.7
を使っていますが、期限も近いので8.0
を使ってみることにしました。
そうしたら、データベースの設定をしていきます。
$ sudo cat /var/log/mysqld.log | grep 'temporary password'
A temporary password is generated for root@localhost: ここのパスワードを覚えておいてください
$ mysql -u root -p
Enter password: さっきのパスワードを入力します。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssw0rd';
mysql> create database laravel;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> exit
Bye
ここでlaravel
のテーブルが追加されていればOKです。
.env
ファイルの設定
さっきあえてやらなかった.env
ファイルの設定をしていきます。
$ cd /var/www/html/blog
$ cp .env.example .env
$ php artisan key:generate
$ vi .env
内容
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=さっき設定したパスワードを入力
最後にマイグレートしてエラーが出なければ成功です。
$ php artisan migrate
ここまできてうまくいかなかった時は、再起動してみてください。
参考
インストール関連
・Laravel 7 インストール(CentOS8/PHP7.4)
・CentOS7でphp7.4をインストールしようとして躓いた話
権限とユーザー関連
・Laravelのパーミッションを適切に設定
・「root→自分のユーザー名」に変更すると危険でしょうか?
・linuxのユーザー権限とグループについて教えてください
・Nginxの公開ディレクトリのパーミッションについて
設定関連
・EC2にWordPressをインストールする
・MySQL 5.7 を CentOS 7 に yum インストールする手順
・nginx サーバーに PHP, MySQL を入れる
・nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する
・nginx ディレクトリのPermissionをwww-dataに変えたい。
・nginxで403を回避するために、パブリックファイルの権限についておさらい
コマンド
・Groupを確認したり、追加したりする方法まとめ
・【 usermod 】コマンド――ユーザーアカウントの情報を変更する
ドキュメント
・Laravel 6.x インストール