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の初期画面が表示されることが確認できました。
ドキュメントルートの権限を設定
ドキュメントルートは、デフォルトでは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」でアクセスし、以下のように表示されることが確認できました。
表示が確認できたら、作成したファイルは削除しておきます。
$ 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のプロジェクトで使用するデータベースの設定を行います。
$ 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' => '[データベース名]',
ブラウザで表示を確認すると、左下のデータベース欄のエラーがなくなりました。
これでひとまずLEMP環境にて、CakePHPのインストールができました。