目次
はじめに
「CentOS7、SCL(Software Collections)リポジトリからのLAMP環境構築について(前編)」にて、SCLリポジトリからCakePHP3に必要なパッケージをインストールしました。
後編では、CakePHP3アプリを実行するところまでの設定を行います。
PHPの実行方法は、モジュール方式(mod_php
)で構築後、差分としてFastCGI方式(mod_fcgi_proxy
、php-fpm
)を別ページでまとめます。
ソフトウェアコレクションについては「ソフトウェアコレクション(SCL:Software Collections)とは?」にまとめています。
FastCGI方式は「CakePHP3アプリをFastCGI方式で動かすための環境構築と設定」にまとめています。
検証環境
環境は前編の続きになります。
ホスト環境
- macOS 10.12.6 Sierra
- Vagrant 2.0.1
- VirtualBox 5.2.6r120293
ゲスト環境(仮想マシン)
- CentOS 7.4.1801 (CentOSが公式で維持、管理しているBOXイメージ)
概要
それぞれの手順が、前の手順が完了していることを前提に説明します。
手順全体については目次を参照してください。
実際に構築する場合は、前編をベースにしているため前編までの構築が完了した環境が必要になります。
結果は、2018年2月時点で実行して検証した結果になります。
SCLの有効化
ログイン後に常にSCLが有効化されるように、rcファイルでSCLを有効化する設定を行います。以下のようにscl_source
の行を追加します。これでログイン後にgit
、php
、mysql
、httpd
などのコマンドが利用できます。rcファイルの編集後は、ログインし直すか. ~/.bashrc
コマンドで変更を反映します。
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
# Enable software collections
. scl_source enable httpd24 rh-git29 rh-mysql57 rh-php71
サービスの有効化(自動実行)
SCLパッケージでインストールしたサービスは、自動起動しないように初期設定されています。
まず、httpd
とmysqld
を自動起動するように設定します。
[vagrant@www ~]$ sudo systemctl enable httpd24-httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd24-httpd.service to /usr/lib/systemd/system/httpd24-httpd.service.
[vagrant@www ~]$ sudo systemctl enable rh-mysql57-mysqld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rh-mysql57-mysqld.service to /usr/lib/systemd/system/rh-mysql57-mysqld.service.
こまま作業を続けるので、httpd
とmysqld
を起動します。
# 起動
[vagrant@www ~]$ sudo systemctl start httpd24-httpd.service
[vagrant@www ~]$ sudo systemctl start rh-mysql57-mysqld.service
# 起動の確認 httpd
[vagrant@www ~]$ systemctl status httpd24-httpd.service
● httpd24-httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd24-httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2018-02-11 14:23:37 UTC; 13min ago
Main PID: 3065 (httpd)
Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec: 0 B/sec"
CGroup: /system.slice/httpd24-httpd.service
├─3065 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
├─3066 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
├─3067 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
├─3068 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
├─3069 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
└─3070 /opt/rh/httpd24/root/usr/sbin/httpd -DFOREGROUND
# 起動の確認 mysqld
[vagrant@www ~]$ systemctl status rh-mysql57-mysqld.service
● rh-mysql57-mysqld.service - MySQL 5.7 database server
Loaded: loaded (/usr/lib/systemd/system/rh-mysql57-mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2018-02-11 14:24:00 UTC; 15min ago
Process: 3277 ExecStartPost=/usr/bin/scl enable $RH_MYSQL57_SCLS_ENABLED -- /opt/rh/rh-mysql57/root/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
Process: 3242 ExecStart=/opt/rh/rh-mysql57/root/usr/libexec/mysqld-scl-helper enable $RH_MYSQL57_SCLS_ENABLED -- /opt/rh/rh-mysql57/root/usr/libexec/mysqld --daemonize --basedir=/opt/rh/rh-mysql57/root/usr --pid-file=/var/run/rh-mysql57-mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
Process: 3172 ExecStartPre=/usr/bin/scl enable $RH_MYSQL57_SCLS_ENABLED -- /opt/rh/rh-mysql57/root/usr/libexec/mysql-prepare-db-dir %n (code=exited, status=0/SUCCESS)
Process: 3143 ExecStartPre=/usr/bin/scl enable $RH_MYSQL57_SCLS_ENABLED -- /opt/rh/rh-mysql57/root/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Process: 3137 ExecStartPre=/usr/bin/scl enable $RH_MYSQL57_SCLS_ENABLED -- /usr/bin/scl_enabled rh-mysql57 (code=exited, status=0/SUCCESS)
Main PID: 3248 (mysqld)
CGroup: /system.slice/rh-mysql57-mysqld.service
└─3248 /opt/rh/rh-mysql57/root/usr/libexec/mysqld --daemonize --basedir=/opt...
データベースの準備
MySQL上に、CakePHPアプリのための空データベース作成とユーザーを追加します。
SCLパッケージでインストールしたMySQLは、rootユーザーがパスワード無しに初期設定されています。なので、パス無しでMySQLにログインします。
[vagrant@www ~]$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.19 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
空データベースとユーザーの作成
CakePHPのCMSチュートリアル向けに空データベースとユーザーを作成します。
例として設定値は以下の通りにします。
- データベース名:
cake_cms
- ユーザー名:
cake_user
- パスワード:
pa$$w0rd
mysql> CREATE DATABASE cake_cms DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL ON cake_cms.* TO cake_user@localhost IDENTIFIED BY 'pa$$w0rd';
Query OK, 0 rows affected, 1 warning (0.00 sec)
CMSチュートリアルのテーブルを作成
CakePHP公式サイトのCMS チュートリアル – データベース作成にあるSQLをコピペしたファイルを作成し、mysql
コマンドで実行します。
ファイル名はdatabase.sql
として内容は以下の通りにします。
USE cake_cms;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created DATETIME,
modified DATETIME
);
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created DATETIME,
modified DATETIME,
UNIQUE KEY (slug),
FOREIGN KEY user_key (user_id) REFERENCES users(id)
) CHARSET=utf8mb4;
CREATE TABLE tags (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(191),
created DATETIME,
modified DATETIME,
UNIQUE KEY (title)
) CHARSET=utf8mb4;
CREATE TABLE articles_tags (
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
FOREIGN KEY article_key(article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified)
VALUES
('cakephp@example.com', 'sekret', NOW(), NOW());
INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', 1, now(), now());
ファイルからSQL文を実行後に、mysqlにログインして結果を確認します。
[vagrant@www ~]$ mysql -u root < database.sql
[vagrant@www ~]$ mysql -u root
...メッセージ省略
mysql> use cake_cms;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+--------------------+
| Tables_in_cake_cms |
+--------------------+
| articles |
| articles_tags |
| tags |
| users |
+--------------------+
4 rows in set (0.00 sec)
rootのパスワードを設定
最後にrootのパスワードを設定します。mysqlにrootでログインした状態で設定します。
mysql> set password=password('pa$$w0rd');
Query OK, 0 rows affected, 1 warning (0.00 sec)
これでデータベースの準備は完了です。
Composerのインストール
公式サイトgetcomposer.orgに従ってComposerをインストールします。
バージョンが変わった場合、ハッシュ値も異なるので公式サイトから最新のコマンドをコピペします。
[vagrant@www ~]$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
[vagrant@www ~]$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
[vagrant@www ~]$ php composer-setup.php
All settings correct for using Composer
Downloading...
Composer (version 1.6.3) successfully installed to: /home/vagrant/composer.phar
Use it: php composer.phar
[vagrant@www ~]$ php -r "unlink('composer-setup.php');"
composer
コマンドとして実行できるように位置と名前を変更します。
[vagrant@www ~]$ sudo mv composer.phar /usr/local/bin/composer
[vagrant@www ~]$ composer --version
Composer version 1.6.3 2018-01-31 16:28:17
高速化のプラグインのインストール
日本周辺からの利用ならば、高速化のためのプラグインをインストールします。
インストール方法はGithub – hirak/prestissimoにあります。
(詳細はHirakuさんのcomposerを速くするプラグイン・prestissimoを作ったを参照)
[vagrant@www ~]$ composer global require hirak/prestissimo
Changed current directory to /home/vagrant/.config/composer
Using version ^0.3.7 for hirak/prestissimo
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing hirak/prestissimo (0.3.7):Downloading (100%)
1/1: http://packagist.org/p/provider-latest$6f876be26050344cfed5ecfc21abec540e54a1f8afc5387e7a25a392999bae26.json
Finished: success: 1, skipped: 0, failure: 0, total: 1
Writing lock file
Generating autoload files
公開用ディレクトリの作成
CakePHPアプリを公開するためのディレクトリを/srv/www/app
として作成し、開発環境として利用するためapp
ディレクトリの所有者を変更します。
[vagrant@www ~]$ sudo mkdir -p /srv/www/app
[vagrant@www ~]$ sudo chown vagrant /srv/www/app
[vagrant@www ~]$ ll -d $(find /srv)
drwxr-xr-x. 3 root root 17 Feb 11 18:40 /srv
drwxr-xr-x. 3 root root 17 Feb 11 18:40 /srv/www
drwxr-xr-x. 2 vagrant root 6 Feb 11 18:40 /srv/www/app
CakePHP3のインストール
/srv/www/app
にカレントディレクトリを移動しcomposer
コマンドによりCakePHPをインストールします。
[vagrant@www ~]$ cd /srv/www/app
[vagrant@www app]$ composer create-project --prefer-dist cakephp/app cms
1/7: http://packagist.org/p/provider-2017$859851d9e9fe17f36f799519fe92e471034503a14b8279722fc7b14fc02a6229.json
2/7: http://packagist.org/p/provider-2018-01$3a810532634e261572496f5dc609d546542e6366e4bb0267e29d4482a41b15df.json
...省略
Created `config/app.php` file
Created `/srv/www/app/cms/tmp/cache/views` directory
Set Folder Permissions ? (Default to Y) [Y,n]? Y
Permissions set on /srv/www/app/cms/tmp/cache
Permissions set on /srv/www/app/cms/tmp/cache/models
Permissions set on /srv/www/app/cms/tmp/cache/persistent
Permissions set on /srv/www/app/cms/tmp/cache/views
Permissions set on /srv/www/app/cms/tmp/sessions
Permissions set on /srv/www/app/cms/tmp/tests
Permissions set on /srv/www/app/cms/tmp
Permissions set on /srv/www/app/cms/logs
Updated Security.salt value in config/app.php
終了間際でパーミッションの設定を行うかを聞かれるので、Y
として設定します。
これは、CakePHPが書き込みを行うディレクトリに書き込みの権限を与えます。
[vagrant@www app]$ ll -d $(find cms/{logs,tmp})
drwxrwxrwx. 2 vagrant vagrant 19 Feb 11 18:42 cms/logs
-rw-rw-r--. 1 vagrant vagrant 0 Feb 11 18:42 cms/logs/empty
drwxrwxrwx. 5 vagrant vagrant 48 Feb 11 18:42 cms/tmp
drwxrwxrwx. 5 vagrant vagrant 51 Feb 11 18:42 cms/tmp/cache
drwxrwxrwx. 2 vagrant vagrant 19 Feb 11 18:42 cms/tmp/cache/models
-rw-rw-r--. 1 vagrant vagrant 0 Feb 11 18:42 cms/tmp/cache/models/empty
drwxrwxrwx. 2 vagrant vagrant 19 Feb 11 18:42 cms/tmp/cache/persistent
-rw-rw-r--. 1 vagrant vagrant 0 Feb 11 18:42 cms/tmp/cache/persistent/empty
drwxrwxrwx. 2 vagrant vagrant 6 Feb 11 18:42 cms/tmp/cache/views
drwxrwxrwx. 2 vagrant vagrant 19 Feb 11 18:42 cms/tmp/sessions
-rw-rw-r--. 1 vagrant vagrant 0 Feb 11 18:42 cms/tmp/sessions/empty
drwxrwxrwx. 2 vagrant vagrant 19 Feb 11 18:42 cms/tmp/tests
-rw-rw-r--. 1 vagrant vagrant 0 Feb 11 18:42 cms/tmp/tests/empty
SELinuxの設定
CentOS公式で配布しているBOXイメージはSELinuxが有効です。学習や開発用途ならば無効でも問題ありません。無効にするならば以下のようにします。
SELinuxの無効化する場合
一時的ではなく恒久的に設定するには/etc/selinux/config
を編集します。
無効にする場合
SELINUX=disabled
有効にする場合
SELINUX=enforcing
OSの再起動後に変更が反映されます。
SELinuxを無効化しない場合
SELinuxの動作を簡単に説明すると「プロセスにタイプ(ドメインを定義)を付け、リソースにタイプを付け、ドメインがアクセス出来るタイプをルールとして決める。ドメインがルール外のタイプへアクセスすると拒否される」です。
(これがOSのパーミッションとは別に動作し、エラーは権限不足と返すので混乱することになります)
SELinuxを有効にしたまま構築を進める場合、/srv
以下のリソース(ディレクトリとファイル)のタイプをつけ直す必要があります。
SELinuxについての詳細な説明は避けて、設定に関連する部分だけ説明します。(SELinuxのベストプラクティス的なポケットリファレンスが欲しいです)
プロセスのタイプ確認
-Z
オプションを付けてps
コマンドを実行するとプロセスのタイプが確認できます。
LABELの:
区切りで3つ目の_t
で終わっているのがタイプです。
今回の場合のプロセスはhttpd
となりタイプはhttpd_t
です。
[vagrant@www ~]# ps -ZC httpd
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 3065 ? 00:00:00 httpd
...省略
一方、/srv/www/app
ディレクトリのタイプはvar_t
です。httpd_t
のプロセスはvat_t
のリソースへアクセスできません。このリソースのタイプを変更する必要があります。
[vagrant@www app]$ ll -dZ $(find /srv -maxdepth 3)
drwxr-xr-x. root root system_u:object_r:var_t:s0 /srv
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /srv/www
drwxr-xr-x. vagrant root unconfined_u:object_r:var_t:s0 /srv/www/app
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:var_t:s0 /srv/www/app/cms
リソースのタイプの一括修正(restorecon)
代表的なリソースのタイプは定義済みです。これを適用するためのにrestorecon
コマンドを使用します。
ファイルの種類に対して定義されているのではなく、場所によって定義されています。この定義は、コンテキストファイル(/etc/selinux/targeted/contexts/files/file_contexts
)に保存されています。
[vagrant@www ~]$ sudo restorecon -R /srv
[vagrant@www app]$ ll -dZ $(find /srv -maxdepth 4)
drwxr-xr-x. root root system_u:object_r:var_t:s0 /srv
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /srv/www
drwxr-xr-x. vagrant root unconfined_u:object_r:httpd_sys_content_t:s0 /srv/www/app
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 /srv/www/app/cms
[vagrant@www app]$ ls -Z cms
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 bin
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 composer.json
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 composer.lock
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 config
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 index.php
drwxrwxrwx. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 logs
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 phpunit.xml.dist
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 plugins
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 README.md
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 src
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 tests
drwxrwxrwx. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 tmp
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 vendor
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 webroot
/srv
以下のディレクトリのタイプがhttpd_sys_content_t
に変化したことが分かります。
CakePHPはログと一時ファイルを書き込むディレクトリ(logs
とtmp
)を、初期状態でアプリ内のディレクトリに配置しているので、このディレクトリへ書き込める必要があります。しかし、httpd_sys_content_t
タイプのリソースへは書き込みが行えません。
httpd_t
のプロセスがアクセスできるリソースのタイプは以下のようになります。
プロセスのタイプ | リソースのタイプ | 説明 |
---|---|---|
httpd_t | httpd_sys_content_t | 読み込み可 |
httpd_t | httpd_sys_rw_content_t | 書き込み可 |
httpd_t | httpd_sys_ra_content_t | 追記可 |
リソースのタイプの個別変更(chcon)
logs
とtmp
ディレクトリのタイプをhttpd_sys_content_rw_t
に変更します。
個別にタイプを付け替える場合はchcon
コマンドを使用します。-t
オプションによりタイプを指定し、-R
によりサブディレクトリも対象にします。
[vagrant@www app]$ chcon -R -t httpd_sys_rw_content_t cms/{logs,tmp}
[vagrant@www app]$ ls -Z cms
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 bin
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 composer.json
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 composer.lock
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 config
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 index.php
drwxrwxrwx. vagrant vagrant unconfined_u:object_r:httpd_sys_rw_content_t:s0 logs
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 phpunit.xml.dist
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 plugins
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 README.md
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 src
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 tests
drwxrwxrwx. vagrant vagrant unconfined_u:object_r:httpd_sys_rw_content_t:s0 tmp
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 vendor
drwxrwxr-x. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 webroot
SELinuxのリソースのタイプは上位のディレクトリから引き継がれるので、今後、新しいログや一時ファイルが作成されても問題ありません。
NOTE:新しいCakePHPプロジェクトを作成する場合
/srv/www/app
以下に新しいCakePHPのプロジェクトを作成する場合、httpd_sys_content_t
タイプは引き継がれますが、logs
とtmp
へのhttpd_sys_rw_content_t
タイプ付与は毎回行う必要があります。
CakePHPにデータベース接続情報を設定
/srv/www/app/cms
が今回のCakePHPアプリのプロジェクトのルートディレクトリになります。カレントディレクトリを/srv/www/app/cms
に移して作業を行います。
CakePHPの設定ファイルは/srv/www/app/cms/config
ディレクトリにあるapp.php
です。
app.php
を編集します。
username
をmy_app
からcake_user
に変更password
をsecret
からpa$$w0rd
に変更database
をmy_app
からcake_cms
に変更
...
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'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' => 'cake_user',
'password' => 'pa$$w0rd',
'database' => 'cake_cms',
'encoding' => 'utf8',
'timezone' => 'UTC',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
...
テーブルからスケルトンコードを生成
テーブルにアクセス出来るようになったのでスケルトン(雛形となるソース)を自動生成します。チュートリアルでは説明に従って、徐々に作成する部分ですが環境作成が目的なので一気に生成します。
インストール直後はcakeスクリプトに実行権限が付いていないので、今後のために実行権限を付与します。
[vagrant@www cms]$ chmod +x bin/cake
スケルトンはテーブル単位にbin/cake bake all [テーブル名]
で自動生成できます。
テーブルを指定しなかった場合、スケルトンを生成できるテーブルの一覧が出力されます。
[vagrant@www cms]$ bin/cake bake all
Bake All
---------------------------------------------------------------
Possible model names based on your database:
- articles
- articles_tags
- tags
- users
Run `cake bake all [name]` to generate skeleton files.
users
テーブルでスケルトンを自動生成した結果が以下になります。
[vagrant@www cms]$ bin/cake bake all users
Bake All
---------------------------------------------------------------
One moment while associations are detected.
Baking table class for Users...
Creating file /srv/www/app/cms/src/Model/Table/UsersTable.php
Wrote `/srv/www/app/cms/src/Model/Table/UsersTable.php`
...省略
Creating file /srv/www/app/cms/src/Template/Users/edit.ctp
Wrote `/srv/www/app/cms/src/Template/Users/edit.ctp`
Bake All complete.
残り3つのテーブルにも同様にスケルトンを自動生成します。
よくあるbakeがエラーとなる原因
データベース接続情報が間違っている(ユーザー名が間違っている場合)
[vagrant@www cms]$ bin/cake bake all
Bake All
---------------------------------------------------------------
Possible model names based on your database:
Exception: SQLSTATE[HY000] [1045] Access denied for user 'cake_use'@'localhost' (using password: YES) in [/srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php, line 48]
2018-02-06 13:29:24 Error: [PDOException] SQLSTATE[HY000] [1045] Access denied for user 'cake_use'@'localhost' (using password: YES) in /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php on line 48
Stack Trace:
#0 /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php(48): PDO->__construct('mysql:host=loca...', 'cake_use', 'pa$$w0rd', Array)
#1 /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php(104):
...省略
#13 /srv/www/app/cms/vendor/cakephp/cakephp/src/Console/CommandRunner.php(141): Cake\Console\Shell->runCommand(Array, true)
#14 /srv/www/app/cms/bin/cake.php(12): Cake\Console\CommandRunner->run(Array)
#15 {main}
mysqlが起動していない場合
[vagrant@www cms]$ bin/cake bake all
Bake All
---------------------------------------------------------------
Possible model names based on your database:
Exception: SQLSTATE[HY000] [2002] No such file or directory in [/srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php, line 48]
2018-02-06 13:31:19 Error: [PDOException] SQLSTATE[HY000] [2002] No such file or directory in /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php on line 48
Stack Trace:
#0 /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php(48): PDO->__construct('mysql:host=loca...', 'cake_user', 'pa$$w0rd', Array)
#1 /srv/www/app/cms/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php(104): Cake\Database\Driver\Mysql->_connect('mysql:host=loca...', Array)
...省略
#13 /srv/www/app/cms/vendor/cakephp/cakephp/src/Console/CommandRunner.php(141): Cake\Console\Shell->runCommand(Array, true)
#14 /srv/www/app/cms/bin/cake.php(12): Cake\Console\CommandRunner->run(Array)
#15 {main}
CakePHPアプリを公開するためのApache httpdの設定
/srv/www/app/cms/webroot
をドキュメントルートとして公開する設定を行います。
apache httpdの設定ファイルは/opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
です。
設定ファイルの末尾に以下の内容を記述します。
...省略
# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
#
# 追加分
#
<VirtualHost *:80>
DocumentRoot "/srv/www/app/cms/webroot"
ServerName "www.local"
DirectoryIndex disabled
<Directory "/srv/www/app/cms/webroot">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
説明
ここでは、設定で編集する範囲が最小になるように、VirtualHostディレクティブで既存の定義を上書きするようにします。全てのポート80で受け付けたリクエストを処理するようにしています。
DocumentRootの設定
CakePHPは、プロジェクトルートのwebroot
サブディレクトリがドキュメントルートになるので、DocumentRoot
に/srv/www/app/cms/webroot
を設定します。
DirectoryIndexの無効化
CakePHPでは、DirectoryIndexディレクティブは使用しません。他の定義に左右されないように明示的に無効化しています。
公開ディレクトリの設定
CakePHPは、ディレクトリに配置された.htaccess
でRewriteRuleディレクティブを使い、index.php
の呼び出しに書き換えています。
[vagrant@www ~]$ cat /srv/www/app/cms/webroot/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
シンボリックリックは利用しませんが、これを禁止した状態だと類似の処理が行えてしまうためRewriteRule
の利用が許可されないので、Options
にFollowSymLinks
を指定します。
ディレクトリに配置されて.htaccess
による設定の上書きを有効にするために、AllowOverride
にAll
を指定します。
Require all granted
は、このディレクトリへのアクセスの許可なので、公開ディレクトリには必須の設定です。
設定ファイルのチェックと反映
設定ファイルの文法的な記述ミスはhttpd -t
により確認できます。
[vagrant@www cms]$ httpd -t
Syntax OK
httpd
を再起動することで設定を反映します。
[vagrant@www cms]$ sudo systemctl restart httpd24-httpd.service
CMSチュートリアルサイトの動作確認
ホストのブラウザからhttp://www.local/
へアクセスすると、まだ、ユーザー定義のHomeページ作成していないので、Welcomeページが表示されます。ここで、エラーが出ていたら修正が必要です。
http://www.local/users
にアクセスするとCMSチュートリアルの、ユーザーリストのページが表示されます。
これで、SCL(Software Collections)リポジトリからのLAMP環境構築は完了です。
まとめ
SCLリポジトリのみでLAMP環境構築を行なった結果として、各ファイルの配置に違和感がある以外は通常のパッケージと同様に利用できることが分かりました。
最新バージョン同士ならば、共有モジュールなどの配置も始めから行われているので、組み合わせられるか分からないパッケージを調整するより手数が少なくて済みます。
ソフトウェアコレクション(SCL)は本番運用も範囲に入っているのですが、ログの配置なども違いがあるためSCL専用の運用資料が必要になることを考えると、どんな運用方法をRed Hatで提案しているのか興味がありますが、公式のQAページで見たかったところが、サブスクリプション契約が無いと見れないので残念です。
慣れてきたので暫くはSCLベースで開発環境を構築して、情報を集めていきます。