47
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-15

#前提
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 storage
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とかのがいいんでしょうか...

47
43
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?