Help us understand the problem. What is going on with this article?

Laravel 環境構築 AWS EC2(nginx + PHP) + RDS

前提

ec2インスタンス作成済み
sshできる

パッケージアップデート

sudo yum update

PHP

2020/09/11現在
amazon-linux-extras リポジトリにPHP7.4があります

sudo amazon-linux-extras enable php7.4

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install php-cli php-pdo php-fpm php-json php-mysqlnd

有効化の後yum を使用してトピックをインストールします。
Now you can install:のコマンド突っ込めば大丈夫です

sudo yum install php-cli php-pdo php-fpm php-json php-mysqlnd -y
php -v
PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

足りない拡張追加

Laravelのサーバー要件

※Laravel 7.x
PHP >= 7.2.5
BCMath PHP拡張
Ctype PHP拡張
Fileinfo PHP extension
JSON PHP拡張
Mbstring PHP拡張
OpenSSL PHP拡張
PDO PHP拡張
Tokenizer PHP拡張
XML PHP拡張

これに従い追加します
追加済みの拡張を調べます

php -m | grep -e bcmath -e PDO -e ctype -e fileinfo -e json -e mbstring -e openssl -e pdo -e tokenizer -e ^xml$

php -mでインストール済み拡張が出力されます
コマンド | grep [オプション] 検索パターンでコマンドでの出力に対してgrep(絞り込み)
が掛かります
-e 検索パターンをたくさん使用して複数の単語に対して引っかかる検索かけています。

私の環境ですと下記の拡張がインストール済みのようでした。
なので、そのほかをインストールしていきます

ctype
fileinfo
json
openssl
PDO
pdo_mysql
pdo_sqlite
tokenizer

# 足りないもの
# bcmath
# mbstring
# xml

bcmath,mbstring,xmlが足りないので追加します

sudo yum install php-bcmath php-mbstring php-xml -y

opcache

インストール

設定ではないけど、opcacheを入れます

sudo yum install php-opcache

確認

php -v
#PHP 7.4.9 (cli) (built: Aug 21 2020 21:45:11) ( NTS )
#Copyright (c) The PHP Group
#Zend Engine v3.4.0, Copyright (c) Zend Technologies
#    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies

設定値の変更

php.iniの場所を調べます

php --ini
 php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/10-opcache.ini,
/etc/php.d/20-bcmath.ini,
/etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
#...

opcache.iniで設定を変えます

sudo vi /etc/php.d/10-opcache.ini

https://www.php.net/manual/ja/opcache.installation.php
推奨設定に合わせて編集します

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

php-fpm

FPMとは、FastCGI Process Managerの略でPHP5.4.0から公式サポートされたPHP標準のアプリケーションサーバです。名前にあるFastCGIというプロトコルで通信するよう実装されています。 FastCGIは、Webサーバとアプリケーションサーバの間で使われるプロトコルの一つで、ここでの例ではnginxとPHP-FPMの間で交わされるプロトコルとなります。

参考
https://hacknote.jp/archives/27419/
https://hackers-high.com/linux/php-fpm-config/

起動

sudo service php-fpm start

確認

 sudo systemctl status php-fpm

 php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-09-11 17:15:02 JST; 1 day 17h ago

自動起動

sudo systemctl enable php-fpm

Composer

インストール

https://getcomposer.org/download/

公式のコマンドを叩いていきます

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

移動

sudo mv composer.phar /usr/local/bin/composer

確認

composer

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.10.13 2020-09-09 11:46:34

nginx

インストール

PHPと同様にamazon-linux-extras リポジトリにあります

sudo amazon-linux-extras enable nginx1

##こんな出力があります
Now you can install:
 # yum clean metadata
 # yum install nginx

インストール

sudo yum install nginx -y
nginx -v
nginx version: nginx/1.18.0

起動

インストールしただけだと、起動していない

sudo systemctl start nginx

(上記コマンドを叩いても出力はなにもないです)

起動しているか確認します

sudo systemctl status nginx

nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since 金 2020-09-11 08:15:02 UTC; 2s ago

自動起動設定

現状EC2再起動するたび、自力で立ち上げないといけない

sudo systemctl enable nginx 

画面確認

EC2のIPをブラウザで入力

スクリーンショット 2020-09-13 1.06.04.png

Gitインストール

sudo yum install git
git --version
# >git version 2.23.3

PHP + nginx設定

両方のインストールが終わったので疎通していきます

php-fpm設定

設定変更する前にコピーとっておくと良いかもしれません

sudo vi /etc/php-fpm.d/www.conf

下記の内容に更新します
それぞれ/検索ワードとかで検索して書き換えましょう

user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

# 以下はお好み
pm = static
pm.max_children = 5
pm.max_requests = 1500

ちなみに、pm関係の設定値はデフォルトでも良いです
下記が参考になるので、チューニングしたい方はどうぞ
https://hackers-high.com/linux/php-fpm-config/

nginx設定

sudo vi /etc/nginx/nginx.conf

ドキュメントルートは自由に

 server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www;
        index  index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            root           /var/www;
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
#~中略~

確認

sudo mkdir /var/www
sudo chmod 777 /var/www
cd /var/www
echo "<?php phpinfo(); " > index.php

ドキュメントルートの内phpinfo()だけの、index.php作ってます
IPをブラウザで確認して、表示されてればPHP使えるようになりました

スクリーンショット 2020-09-13 14.33.29.png

RDS

AWSにログインしRDS on MySQLでDBを作成しておきます
(参考 -> https://noumenon-th.net/programming/2020/04/10/ec2-rds-laravel/

エンドポイントと、ユーザーとパスワードを用いるのでとっておきましょう

スクリーンショット 2020-09-14 1.41.37.png

EC2にSSH接続し、下記コマンドでmysqlをインストールします

sudo yum install mysql -y

終わったら、エンドポイントとユーザー、パスワードを用いて接続します
うまくつながらなかったら、だいたいセキュリティグループとかなので、AWSのRDS等見直してみてください

mysql -h エンドポイント -u ユーザー名 -p
Enter password:

つながればOK

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 8.0.17 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

データベースを作成していなかったら(RDS作成時に指定できる)
CREATE DATABASEで作成してください
(参考 => https://www.dbonline.jp/mysql/database/index1.html#section1)

Laravel

これまででLaravelの下準備は整っています
デプロイの場合もgitからcloneすれば良いので大丈夫です

まずはドキュメントルートに移動します
nginxで/var/wwwを指定していたのでそこに移動します

cd /var/www

ComposerからLaravelを入れます

composer create-project --prefer-dist laravel/laravel 【名前】

【名前】は自由に
今回はlaravel-appにしました
ちなみに、Laravelのバージョン指定したい場合、【名前】のあとに、5.8とか6.xとか入れたら良いです
 

メモリ足りなくて下記のようなエラー出たら、下記の記事の手順でswapを作成してください
https://qiita.com/ntm718/items/88d3fc787f4f18ad1f20

mmap() failed: [12] Cannot allocate memory

mmap() failed: [12] Cannot allocate memory

インストールしたら、指定した名前のディレクトリに移動します
私はlaravel-appにしたので、今後置き換えてお読みください

cd laravel-app
php artisan key:generate --ansi
sudo chmod -R 777 storag
sudo chmod -R 777 bootstrap/cache/

この段階でブラウザで下記のようにアクセスすると、Laravelの初期画面が出ます
ipアドレス/laravel-app/public

スクリーンショット 2020-09-14 2.47.27.png

ここまで来たら、あと少しです

vi .env

DBの接続情報を書き換えます

.env
DB_CONNECTION=mysql
DB_HOST=エンドポイント名
DB_PORT=3306
DB_DATABASE=作ったDBDB_USERNAME=ユーザー名
DB_PASSWORD=パスワード

保存し、php artisan migrateします
ちゃんと実行されたらOK

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (51.33ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (38.25ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (39.88ms)

最後にドキュメントルートを変更しましょう
現状だとipアドレス/laravel-app/publicなので、laravel-app/publicまでをドキュメントルートに設定したら良さそうですね

sudo vi /etc/nginx/nginx.conf

laravelpublicがドキュメントルートに来るように修正します

server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/laravel/public;
        index  index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            root /var/www/laravel/public;
            fastcgi_pass   unix:/run/php-fpm/www.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

~中略~

再起動

sudo systemctl restart nginx

ipアドレスにアクセスしたら、laravelの画面が出たら終了

Route53でドメイン設定して、SSLしたらそれっぽくなるはず

ドメイン設定編(事前にEC2とElastic IPを紐付けておく必要あり)
https://qiita.com/ntm718/items/c01fa4fc47d21893974e

終わりに

Docker使うならECR ECSのがいいんだろうか
そもそも、個人でやるにはAWSは料金が怖すぎて無料期間あるやつしか使う気がしない...
勉強で作ったらVPSとかのがいいんでしょうか...

ntm718
文系高卒元ニート。 SESでエビデンス取ってる人間以上エンジニア未満でしたが、なんの因果かフリーランスになりLaravelやってます。備忘録から、他の方がわかるように色々書きます。 お仕事いただける場合Twitterへ
https://blog.collapse-natsu.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした