AWSのEC2にLEMP環境(Linux、Nginx、MariaDB、PHP)を作成し、CakePHPをインストールする

2021年7月28日

AWSのEC2にCakePHP環境を作成することがあったので、手順をまとめたいと思います。
LAMP環境(Linux、Apache、MariaDB、PHP)で作成しようとも思ったのですが、Nginxを使用した経験があまりなく、使ってみたかったので、Nginxを使用するようにしました。

※ちなみに、Nginxだったら、LNMPでは?と思いましたが、エンジンエックスの発音から、LEMPのようですね。

作成する環境

以下の環境を作成します。
2021年6月末に作成した時点の情報になります。

  • Linux:Amazon Linux 2
  • Nginx:1.20.0
  • MariaDB:10.5.10
  • PHP:7.4.19
  • CakePHP:4.2.7

Nginxのインストール

Amazon Linux 2 には、yumでNginxのパッケージがありませんでした。

$ yum search nginx
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
====================================================================== N/S matched: nginx ======================================================================
pcp-pmda-nginx.x86_64 : Performance Co-Pilot (PCP) metrics for the Nginx Webserver

  Name and summary matches only, use "search all" for everything.

そのため、Amazon Linux 2 に用意されている「Extrasレポジトリ」からNginxをインストールします。

$ amazon-linux-extras
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  ・
  ・
  ・
  (中略)
 38  nginx1                   available    [ =stable ]
$ sudo amazon-linux-extras install nginx1
Installing nginx

インストールが完了すると、ステータスが「enabled」に変わりました。

38  nginx1=latest            enabled      [ =stable ]

バージョンを確認します。

$ nginx -v
nginx version: nginx/1.20.0

Nginxを起動する

インストールが完了したら、起動します。

$ sudo systemctl start nginx.service

起動できたかを確認します。

$ sudo systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2021-06-24 06:48:40 UTC; 46s ago

EC2を起動した時にNginxも自動で起動するように設定しておきます。

$ systemctl is-enabled nginx.service
disabled

$ sudo systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

$ systemctl is-enabled nginx.service
enabled

実際にアクセスしてみると、Nginxの初期画面が表示されることが確認できました。

Nginxの初期画面

ドキュメントルートの権限を設定

ドキュメントルートは、デフォルトではroot権限になっているため、ec2-userで使用できるように設定します。
nginxグループにec2-userを追加します。

$ sudo usermod -a -G nginx ec2-user

一度ログアウトして、再ログインします。

$ exit

nginxグループが設定されているかを確認します。

$ groups
ec2-user adm wheel systemd-journal nginx

「/usr/share/nginx」のグループ所有権をnginxグループに変更します。
サブディレクトリに対しても再帰的に反映させます。

$ sudo chown -R ec2-user:nginx /usr/share/nginx

PHPのインストール

続いて、PHPをインストールします。
yumのパッケージではバージョンが古いため、Nginxと同様に、「Extrasレポジトリ」からインストールします。

$ yum list | grep php
graphviz-php.x86_64                    2.30.1-21.amzn2.0.1            amzn2-core
php.x86_64                             5.4.16-46.amzn2.0.2            amzn2-core
・
・
・
(略)
$ amazon-linux-extras
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  ・
  ・
  ・
  (中略)
 42  php7.4                   available    [ =stable ]
$ sudo amazon-linux-extras install php7.4
Installing php-pdo, php-fpm, php-mysqlnd, php-cli, php-json

インストールが完了すると、ステータスが「enabled」に変わりました。

42  php7.4=latest            enabled      [ =stable ]

バージョンを確認します。

$ php -v
PHP 7.4.19 (cli) (built: May 13 2021 22:36:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

$ php-fpm -v
PHP 7.4.19 (fpm-fcgi) (built: May 13 2021 22:37:56)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

php-fpmを起動する

インストールが完了したら、起動します。

$ sudo systemctl start php-fpm.service

起動できたかを確認します。

$ sudo systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2021-06-24 07:59:52 UTC; 6s ago

EC2を起動した時にphp-fpmも自動で起動するように設定しておきます。

$ systemctl is-enabled php-fpm.service
disabled

$ sudo systemctl enable php-fpm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

$ systemctl is-enabled php-fpm.service
enabled

nginxとphp-fpmを連携する

php-fpmの設定ファイルを編集します。

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

nginxユーザ、nginxグループで実行されるようにします。

; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

UNIXドメインソケットがnginxユーザ、nginxグループで作成されるようにします。

;listen.owner = nobody
listen.owner = nginx
;listen.group = nobody
listen.group = nginx

php-fpmを再起動します。

$ sudo systemctl restart php-fpm.service

nginxとphp-fpmのUNIXドメインソケット接続確認をします。

$ netstat -al --protocol=unix |egrep "Proto|fpm"
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     57172    /run/php-fpm/www.sock

表示を確認

「phpinfo()」を実行するファイルを作成します。

$ sudo -i
$ echo '<?php phpinfo();' > /usr/share/nginx/html/phpinfo.php

「/phpinfo.php」でアクセスし、以下のように表示されることが確認できました。

phpinfo()の実行結果

表示が確認できたら、作成したファイルは削除しておきます。

$ rm -f /usr/share/nginx/html/phpinfo.php

MariaDBのインストール

続いて、MariaDBをインストールします。
PHP同様、yumのパッケージではバージョンが古いため、「Extrasレポジトリ」からインストールします。

$ yum list | grep maria
mariadb-libs.x86_64                    1:5.5.68-1.amzn2               installed 
mariadb.x86_64                         1:5.5.68-1.amzn2               amzn2-core
mariadb-bench.x86_64                   1:5.5.68-1.amzn2               amzn2-core
mariadb-devel.x86_64                   1:5.5.68-1.amzn2               amzn2-core
mariadb-embedded.x86_64                1:5.5.68-1.amzn2               amzn2-core
mariadb-embedded-devel.x86_64          1:5.5.68-1.amzn2               amzn2-core
mariadb-libs.i686                      1:5.5.68-1.amzn2               amzn2-core
mariadb-server.x86_64                  1:5.5.68-1.amzn2               amzn2-core
mariadb-test.x86_64                    1:5.5.68-1.amzn2               amzn2-core

MariaDBのクライアントがデフォルトでインストールされているため、予めアンインストールしておきます。

$ sudo yum remove mariadb-libs
$ amazon-linux-extras
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  ・
  ・
  ・
  (中略)
 54  mariadb10.5              available    [ =stable ]
$ sudo amazon-linux-extras install mariadb10.5
Installing mariadb

インストールが完了すると、ステータスが「enabled」に変わりました。

54  mariadb10.5=latest       enabled      [ =stable ]

バージョンを確認します。

$ mysql --version
mysql  Ver 15.1 Distrib 10.5.10-MariaDB, for Linux (x86_64) using  EditLine wrapper

$ mysqld --version
mysqld  Ver 10.5.10-MariaDB for Linux on x86_64 (MariaDB Server)

MariaDBを起動する

インストールが完了したら、起動します。

$ sudo systemctl start mariadb.service

起動できたかを確認します。

$ sudo systemctl status mariadb.service
● mariadb.service - MariaDB 10.5 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running) since 金 2021-06-25 07:10:17 UTC; 4s ago

EC2を起動した時にMariaDBも自動で起動するように設定しておきます。

$ systemctl is-enabled mariadb.service
disabled

$ sudo systemctl enable mariadb.service
Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

$ systemctl is-enabled mariadb.service
enabled

セキュリティの初期設定を行う

初期設定を行います。
対話モードになるので、回答して設定します。

$ sudo mysql_secure_installation

# ルートのパスワードを入力、初期状態では設定されていないので、何も入力せずエンター
Enter current password for root (enter for none): 

# unix_socket認証を使用するか
Switch to unix_socket authentication [Y/n] n

# ルートのパスワードを変更するか
Change the root password? [Y/n] y

# 匿名ユーザーを削除するか
Remove anonymous users? [Y/n] y

# リモートでのrootログインを許可しないか
Disallow root login remotely? [Y/n] y

# テストデータベースを削除するか
Remove test database and access to it? [Y/n] y

# 特権テーブルをリロードするか
Reload privilege tables now? [Y/n] y

データベースへの接続を確認

データベースへ接続できるかを確認します。

$ sudo mysql -u root -p
Enter password: 

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)

CakePHPのインストール

続いて、CakePHPをインストールします。

まず、CakePHPに必要なパッケージをインストールします。

$ yum list installed | grep php
php-cli.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4     
php-common.x86_64              7.4.19-1.amzn2            @amzn2extra-php7.4     
php-fpm.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4     
php-json.x86_64                7.4.19-1.amzn2            @amzn2extra-php7.4     
php-mysqlnd.x86_64             7.4.19-1.amzn2            @amzn2extra-php7.4     
php-pdo.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4 

$ yum list | grep php
php-cli.x86_64                         7.4.19-1.amzn2                 @amzn2extra-php7.4
php-common.x86_64                      7.4.19-1.amzn2                 @amzn2extra-php7.4
(中略)
php-intl.x86_64                        7.4.19-1.amzn2                 amzn2extra-php7.4
php-ldap.x86_64                        7.4.19-1.amzn2                 amzn2extra-php7.4
php-mbstring.x86_64                    7.4.19-1.amzn2                 amzn2extra-php7.4
(中略)
php-xml.x86_64                         7.4.19-1.amzn2                 amzn2extra-php7.4

$ sudo yum install -y php-mbstring php-intl php-xml

$ yum list installed | grep php
php-cli.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4     
php-common.x86_64              7.4.19-1.amzn2            @amzn2extra-php7.4     
php-fpm.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4     
php-intl.x86_64                7.4.19-1.amzn2            @amzn2extra-php7.4     
php-json.x86_64                7.4.19-1.amzn2            @amzn2extra-php7.4     
php-mbstring.x86_64            7.4.19-1.amzn2            @amzn2extra-php7.4     
php-mysqlnd.x86_64             7.4.19-1.amzn2            @amzn2extra-php7.4     
php-pdo.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4     
php-xml.x86_64                 7.4.19-1.amzn2            @amzn2extra-php7.4  

CakePHPはComposerを利用してインストールするので、Composerをインストールします。

$ curl -sS https://getcomposer.org/installer | sudo php
All settings correct for using Composer
Downloading...

Composer (version 2.1.3) successfully installed to: /home/ec2-user/composer.phar
Use it: php composer.phar

$ ll
合計 2204
-rwxr-xr-x 1 root root 2253070  6月 25 07:45 composer.phar

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

Composerのインストールが正常に完了したかを確認します。
下記のようにバージョンが表示されれば、インストール完了です。

$ composer -V
Composer version 2.1.3 2021-06-09 16:31:20

CakePHPのプロジェクトを作成します。

$ cd /usr/share/nginx/html
$ composer create-project --prefer-dist cakephp/app:4.* [ここにプロジェクト名を入れる]
Creating a "cakephp/app:4.*" project at "./[プロジェクト名]"
Installing cakephp/app (4.2.2)

Nginxのドキュメントルートを作成したプロジェクトに変更します。

$ sudo vi /etc/nginx/nginx.conf

以下のようにドキュメントルートを変更します。

server {
    listen       80;
    listen       [::]:80;
    server_name  _;
    root         /usr/share/nginx/html/[プロジェクト名]/webroot;

また、URLを指定して、各コントローラーにアクセスするために、URLリライトの設定を行い、index.phpに飛ばす設定をします。
上記のドキュメントルート設定の下に追記します。

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

Nginxを再起動します。

$ sudo systemctl restart nginx.service

ブラウザで表示を確認します。

CakePHP

CakePHPのデータベースの設定

CakePHPのプロジェクトで使用するデータベースの設定を行います。

$ sudo mysql -u root -p

MariaDB [(none)]> create database [データベース名];
create user [ユーザー名] identified by '[パスワード]';
grant all privileges on [データベース名].* to [ユーザー名];

CakePHPの設定ファイルを変更します。

$ vi /usr/share/nginx/html/[プロジェクト名]/config/app_local.php

データソースの設定を変更します。

'Datasources' => [
    'default' => [
        'host' => 'localhost',
        /*
         * CakePHP will use the default DB port based on the driver selected
         * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
         * the following line and set the port accordingly
         */
        //'port' => 'non_standard_port_number',

        'username' => '[ユーザー名]',
        'password' => '[パスワード]',

        'database' => '[データベース名]',

ブラウザで表示を確認すると、左下のデータベース欄のエラーがなくなりました。

CakePHPのデータベース設定済み

これでひとまずLEMP環境にて、CakePHPのインストールができました。