CentOS7、SCL(Software Collections)リポジトリからのLAMP環境構築について(後編)

投稿者: | ↻ : 2019年1月28日

はじめに

CentOS7、SCL(Software Collections)リポジトリからのLAMP環境構築について(前編)」にて、SCLリポジトリからCakePHP3に必要なパッケージをインストールしました。

後編では、CakePHP3アプリを実行するところまでの設定を行います。

PHPの実行方法は、モジュール方式(mod_php)で構築後、差分としてFastCGI方式(mod_fcgi_proxyphp-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の行を追加します。これでログイン後にgitphpmysqlhttpdなどのコマンドが利用できます。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パッケージでインストールしたサービスは、自動起動しないように初期設定されています。

まず、httpdmysqldを自動起動するように設定します。

[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.

こまま作業を続けるので、httpdmysqldを起動します。

# 起動
[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はログと一時ファイルを書き込むディレクトリ(logstmp)を、初期状態でアプリ内のディレクトリに配置しているので、このディレクトリへ書き込める必要があります。しかし、httpd_sys_content_tタイプのリソースへは書き込みが行えません。

httpd_tのプロセスがアクセスできるリソースのタイプは以下のようになります。

プロセスのタイプリソースのタイプ説明
httpd_thttpd_sys_content_t読み込み可
httpd_thttpd_sys_rw_content_t書き込み可
httpd_thttpd_sys_ra_content_t追記可

リソースのタイプの個別変更(chcon)

logstmpディレクトリのタイプを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タイプは引き継がれますが、logstmpへの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を編集します。

  • usernamemy_appからcake_userに変更
  • passwordsecretからpa$$w0rdに変更
  • databasemy_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の利用が許可されないので、OptionsFollowSymLinksを指定します。

ディレクトリに配置されて.htaccessによる設定の上書きを有効にするために、AllowOverrideAllを指定します。

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ベースで開発環境を構築して、情報を集めていきます。