Vagrant上に Cakephp 4 をインストール


Windowsに以下のソフトウェアがインストールされてあることが前提

- https://www.virtualbox.org/
- https://www.vagrantup.com/
- https://git-scm.com/downloads

Windowsでの作業
$ cd /c/iWork/01_vagrants/
$ mkdir cakephp4_test
$ cd cakephp4_test/
$ vagrant init centos/7
$ vi Vagrantfile
-#config.vm.network "private_network", ip: "192.168.33.10"
+config.vm.network "private_network", ip: "192.168.56.20"
$ vagrant up
$ vagrant ssh

VMにログインしての作業

PHP7 のインストール
$ sudo yum install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install unzip
$ sudo yum install --enablerepo=remi,remi-php74 php php-mbstring php-intl php-xml php-pdo php-mysql

Composer インストール
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { 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 -V

Cakephp4 インストール
$ composer self-update && composer create-project --prefer-dist cakephp/app:4.* my_app_name

tokenが聞かれた時の対処法

tokenが聞かれた時の対処法

$ cd my_app_name/
$ bin/cake server -H 192.168.56.20

ブラウザで以下のURLにアクセス
http://192.168.56.20:8765/
⇒OK

Vagrant + CentOS 7.6 + nginx 1.14 + MySQL 8.0 + php 7.1 + Redis 5.0.3 + cakephp 3.7.4

2つのWebアプリと1つのDB(使っていない旧DB)をvagrantに押し込める。

– CentOS 7.6
– nginx 1.14
– MySQL 8.0
– php ~~7.3~~ 7.1
– Redis 5.0.3
– cakephp 3.7.4

Windowsに以下のソフトウェアがインストールされてあることが前提

– https://www.vagrantup.com/
– https://www.virtualbox.org/
– https://git-scm.com/downloads

基本的にGit Bashで操作します。(TeraTaerm等でも可)

※ワークディレクトリは各自で読み替えてください

**CentOSの準備**

“`
作業ディレクトリを移動
$ cd /c/iWork/vagrants/
ディレクトリを作成
$ mkdir aaasub-xxxdomain.local
ディレクトリに移動
$ cd aaasub-xxxdomain.local/
BOXリストを確認
$ vagrant box list
OSイメージをダウンロード(イメージファイルはここで検索 https://www.vagrantbox.es/)
$ vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
BOXリストを確認
$ vagrant box list
centos7 (virtualbox, 0)
初期化
$ vagrant init centos7
設定ファイルを編集
$ vi Vagrantfile
—————-
config.vm.network “private_network”, ip: “192.168.33.10” # 各自WindowsPCのネットワーク設定と合わせる必要あり
config.vm.hostname = “aaasub-xxxdomain.local”
config.hostsupdater.aliases = [“bbbsub-xxxdomain.local”, “phpmyadmin-xxxdomain.local”, “phpredisadmin-xxxdomain.local”]
—————-
host名を自動で起動時に追加・停止時に削除をしてくれるプラグインをインストール
$ vagrant plugin install vagrant-hostsupdater
VM起動
$ vagrant up
ログイン確認
$ vagrant ssh
OSバージョン確認
[vagrant@aaasub-xxxdomain ~]$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
OSバージョンアップ(7.1 ⇒ 7.6)
[vagrant@aaasub-xxxdomain ~]$ sudo yum update
[vagrant@aaasub-xxxdomain ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

時刻を日本時刻に
[vagrant@aaasub-xxxdomain ~]$ timedatectl
[vagrant@aaasub-xxxdomain ~]$ sudo timedatectl set-timezone Asia/Tokyo
[vagrant@aaasub-xxxdomain ~]$ timedatectl

ファイアウォールを無効
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl status firewalld
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl stop firewalld
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl disable firewalld
[vagrant@aaasub-xxxdomain ~]$ exit
VM再起動
$ vagrant reload
ログイン
$ vagrant ssh

SELinuxの設定を確認
[vagrant@aaasub-xxxdomain ~]$ sudo getenforce
Disabled

もしDisabledでなかったら変更が必要
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/selinux/config
———————-
#SELINUX=enforcing
SELINUX=disabled
———————-
設定を変更したらVM自体の再起動が必要
[vagrant@aaasub-xxxdomain ~]$ exit
$ vagrant reload
$ vagrant ssh
“`

**php~~7.3~~ 7.1インストール**

“`
[vagrant@aaasub-xxxdomain ~]$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[vagrant@aaasub-xxxdomain ~]$ sudo yum install yum-utils
[vagrant@aaasub-xxxdomain ~]$ sudo yum-config-manager –enable remi-php73 ←php7.3のini_set()関数でbbbsubアプリでエラー
[vagrant@aaasub-xxxdomain ~]$ sudo yum-config-manager –disable remi-php73
[vagrant@aaasub-xxxdomain ~]$ sudo yum-config-manager –enable remi-php71
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php
[vagrant@aaasub-xxxdomain ~]$ php -v
PHP 7.1.26 (cli) (built: Jan 9 2019 08:02:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.1.26, Copyright (c) 1999-2018, by Zend Technologies
“`

**nginxインストール**

“`
リポジトリ登録
[vagrant@aaasub-xxxdomain ~]$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
インストール
[vagrant@aaasub-xxxdomain ~]$ sudo yum install nginx
バージョン確認
[vagrant@aaasub-xxxdomain ~]$ nginx -v
nginx version: nginx/1.14.2
起動テスト
[vagrant@aaasub-xxxdomain ~]$ sudo nginx -t
ステータス確認
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl status nginx
起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl start nginx
ステータス確認
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl status nginx
自動起動設定
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl enable nginx
ログアウト
[vagrant@aaasub-xxxdomain ~]$ exit

ブラウザで以下のURLにアクセスしnginxのデフォルトページが表示されることを確認する
http://192.168.33.10/
http://aaasub-xxxdomain.local/ # これでもnginxのデフォルトページが表示されるはず。/etc/hostsファイルの設定が効いているため
“`

**nginxでphpinfoを出すまで設定**

“`
サーバ設定ファイルを編集
[vagrant@localhost ~]$ sudo vi /etc/nginx/conf.d/aaasub-xxxdomain.local.conf
—————-
server {
listen 80;
server_name aaasub-xxxdomain.local;
root /var/www/aaasub-xxxdomain.local;
index index.php;
access_log /var/log/nginx/aaasub-access.log;
error_log /var/log/nginx/aaasub-error.log;

location ~ \.php$ {
root /var/www/aaasub-xxxdomain.local;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
—————-

htmlを配置するディレクトリを用意する
[vagrant@aaasub-xxxdomain ~]$ sudo mkdir /var/www/aaasub-xxxdomain.local

phpinfoファイルを用意
ファイル作成
[vagrant@aaasub-xxxdomain ~]$ sudo vi /var/www/aaasub-xxxdomain.local/phpinfo.php
—————-

mysql> exit

MySQLmysql 8.0 のセキュリティ設定
[vagrant@aaasub-xxxdomain ~]$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: <前出の初期パスワード>

Error: Access denied for user ‘root’@’localhost’ (using password: YES)
[vagrant@aaasub-xxxdomain ~]$ sudo mysql_secure_installation
———————————-
Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password: を入力 ←適当パスワード

Re-enter new password: を入力

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

All done!
———————————-

開発環境ではパスワード難易度を下げます
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl stop mysqld
設定ファイルの[mysqld]の下に追記する
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/my.cnf
———————————-
[mysqld]
# passwd strong level
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0
———————————-
再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl start mysqld

ログイン確認
[vagrant@aaasub-xxxdomain ~]$ mysql -uroot -p
Enter password: を入力

パスワード難易度を下げたので簡単なパスワードに変更可能
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘password’;

ログインしたらutf8mb4でデータベース作成する
基幹システム用DB
mysql> CREATE DATABASE cccdb DEFAULT CHARACTER SET utf8mb4;
業務システム用DB
mysql> CREATE DATABASE eeedb DEFAULT CHARACTER SET utf8mb4;

db_userユーザーを作成する
mysql> CREATE USER ‘db_user’@’localhost’ IDENTIFIED BY ‘password’;
mysql> exit

ログイン確認
[vagrant@aaasub-xxxdomain ~]$ mysql -udb_user -p
Enter password: を入力
⇒ログイン可能であること

DB選択
mysql> USE cccdb
⇒ERROR 1044 (42000): Access denied for user ‘db_user’@’localhost’ to database ‘cccdb’
 cccdbに対してのアクセス権が無いので設定する

rootでログインしなおしたらdb_userに特定のデータベースにアクセスできる権限を付与
mysql> GRANT ALL ON cccdb.* TO ‘db_user’@’localhost’;
mysql> GRANT ALL ON eeedb.* TO ‘db_user’@’localhost’;

db_userでログインし直してDB選択
mysql> USE cccdb
Database changed
⇒OK

mysql> exit
“`

**redis 5.0.3 のインストール**

“`
インストール
[vagrant@aaasub-xxxdomain ~]$ sudo yum install redis –enablerepo=remi
バージョン確認
[vagrant@aaasub-xxxdomain ~]$ redis-server -v
⇒Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=5194991bde1f5722
バージョン確認
[vagrant@aaasub-xxxdomain ~]$ redis-cli -v
⇒redis-cli 5.0.3
ステータス
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl status redis
起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl start redis
ステータス
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl status redis
自動起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl enable redis
RedisのPHPライブラリをインストール
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php-redis

設定ファイルの確認
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/redis.conf
—————-
bind 127.0.0.1
—————-

再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart redis
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart php-fpm
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart nginx

ファイル作成
[vagrant@aaasub-xxxdomain ~]$ sudo vi /var/www/aaasub-xxxdomain.local/aaasubapp/webroot/phpredis.php
—————-
pconnect(‘127.0.0.1’);
$redis->set(‘dog’, ‘baw’);
var_dump($redis->get(‘dog’));
—————-

ブラウザからアクセスしページが表示されることを確認する
http://aaasub-xxxdomain.local/phpredis.php
⇒bawが出たらOK
“`

**phpMyAdminのインストール**

“`
[vagrant@aaasub-xxxdomain ~]$ sudo yum install phpMyAdmin
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/nginx/conf.d/phpmyadmin.conf
—————-
server {
listen 80;
server_name phpmyadmin-xxxdomain.local;
root /usr/share/phpMyAdmin;
index index.php;
access_log /var/log/nginx/phpmyadmin-access.log;
error_log /var/log/nginx/phpmyadmin-error.log;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
—————-

再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart nginx && sudo systemctl restart php-fpm

アクセス確認
http://phpmyadmin-xxxdomain.local/

⇒エラーが出る。
 セッションディレクトリのパーミッションがapacheになっている…

確認
[vagrant@aaasub-xxxdomain ~]$ sudo ls -la /var/lib/php/
所有グループを変更
[vagrant@aaasub-xxxdomain ~]$ sudo chgrp nginx /var/lib/php/*
確認
[vagrant@aaasub-xxxdomain ~]$ sudo ls -la /var/lib/php/

アクセス確認
http://phpmyadmin-xxxdomain.local/

ログインできない場合はconfigファイルを適宜書き換える

sockファイルの場所を確認する
[vagrant@aaasub-xxxdomain ~]$ grep socket /etc/my.cnf
socket = /var/lib/mysql/mysql.sock

設定ファイル書き換える
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/php.ini
—————-
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock
—————-

再起動
$ sudo systemctl restart php-fpm && sudo systemctl restart nginx

※ここまでできればよいのだが、MySQL8.0系になったことで挙動が変わったようだ。
 パスワードをmysql_native_password方式で保存しておかないと現状phpMyAdminからはアクセス不可。
 本番は通常の作成方法でよいと思われる。

[vagrant@aaasub-xxxdomain ~]$ mysql -uroot -p
mysql> USE mysql;
mysql> ALTER USER ‘root’@’localhost’ identified with mysql_native_password by ‘password’;
mysql> ALTER USER ‘db_user’@’localhost’ identified with mysql_native_password by ‘password’;

⇒これでブラウザでrootユーザとdb_userとでpasswordを入力してログインOKだった。

phpMyAdminにログインすると警告が出ているのを調査したら、実はパーミッションが問題だった。
[vagrant@aaasub-xxxdomain ~]$ sudo ls -la /etc/phpMyAdmin/
[vagrant@aaasub-xxxdomain ~]$ sudo chgrp nginx /etc/phpMyAdmin/
[vagrant@aaasub-xxxdomain ~]$ sudo chgrp nginx /etc/phpMyAdmin/config.inc.php
“`

**phpRedisAdminのインストール**

“`
[vagrant@aaasub-xxxdomain ~]$ cd
[vagrant@aaasub-xxxdomain ~]$ git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git
[vagrant@aaasub-xxxdomain ~]$ cd phpRedisAdmin
[vagrant@aaasub-xxxdomain ~]$ git clone https://github.com/nrk/predis.git vendor
[vagrant@aaasub-xxxdomain ~]$ cd ../
[vagrant@aaasub-xxxdomain ~]$ sudo mv phpRedisAdmin/ /usr/share/

[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/nginx/conf.d/phpredisadmin.conf
——————————–
server {
listen 80;
server_name phpredisadmin-xxxdomain.local;
root /usr/share/phpRedisAdmin;
index index.php;
access_log /var/log/nginx/phpredisadmin-access.log;
error_log /var/log/nginx/phpredisadmin-error.log;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
——————————–

再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart php-fpm && sudo systemctl restart nginx

アクセス確認
http://phpredisadmin-xxxdomain.local/
“`

**cakephp3のインストール**

“`
インストール
[vagrant@aaasub-xxxdomain ~]$ sudo yum install unzip
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php-intl
再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart php-fpm

composerコマンドの設置
[vagrant@aaasub-xxxdomain ~]$ cd
[vagrant@aaasub-xxxdomain ~]$ curl -sS https://getcomposer.org/installer | php
[vagrant@aaasub-xxxdomain ~]$ sudo mv composer.phar /usr/local/bin/composer.phar
[vagrant@aaasub-xxxdomain ~]$ alias composer=’/usr/local/bin/composer.phar’
[vagrant@aaasub-xxxdomain ~]$ composer –version
[vagrant@aaasub-xxxdomain ~]$ composer self-update
[vagrant@aaasub-xxxdomain ~]$ composer create-project –prefer-dist cakephp/app aaasubapp
[vagrant@aaasub-xxxdomain ~]$ sudo mv aaasubapp /var/www/aaasub-xxxdomain.local

nginxの設定ファイル
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/nginx/conf.d/aaasub-xxxdomain.local.conf
————————————————————-
server {
listen 80;
server_name aaasub-xxxdomain.local;
root /var/www/aaasub-xxxdomain.local/aaasubapp/webroot;
index index.php;
access_log /var/log/nginx/aaasub-access.log;
error_log /var/log/nginx/aaasub-error.log;

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

location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
————————————————————-

再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart nginx

ブラウザで確認する
http://aaasub-xxxdomain.local/
⇒OK

あとはデータベース接続設定が不足している
[vagrant@aaasub-xxxdomain ~]$ sudo vi /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.php
————————————————————-
‘username’ => ‘db_user’,
‘password’ => ‘password’,
‘database’ => ‘cccdb’,
————————————————————-

ブラウザで確認する
http://aaasub-xxxdomain.local/
⇒OK

高速化を試しておく
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php-pecl-apcu
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php-opcache
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart php-fpm
⇒ブラウザで確認したところ、115ms ⇒ 35msとなった。
“`

**git cloneしたものがvagrant内とsyncするまで**

“`
$ cd /c/iWork/vagrants/aaasub-xxxdomain.local
$ mkdir src
$ cd src
$ git clone http://my-gitlab-address/xxxdomain/aaasub.git
$ cd /c/iWork/vagrants/aaasub-xxxdomain.local
$ vagrant ssh
[vagrant@aaasub-xxxdomain ~]$ sudo ls -la /vagrant/src/
⇒ aaasubディレクトリがsyncされています。

最後にシンボリックリンクを張ります
現状のディレクトリをリネームして寄せます
[vagrant@aaasub-xxxdomain ~]$ sudo mv /var/www/aaasub-xxxdomain.local/aaasubapp /var/www/aaasub-xxxdomain.local/__aaasubapp
シンボリックを作成
[vagrant@aaasub-xxxdomain ~]$ sudo ln -s /vagrant/src/aaasub/aaasubapp /var/www/aaasub-xxxdomain.local/aaasubapp
シンボリックリンクの確認
[vagrant@aaasub-xxxdomain ~]$ ls -la /var/www/aaasub-xxxdomain.local/
⇒ lrwxrwxrwx 1 root root 35 Feb 22 16:35 aaasubapp -> /vagrant/src/aaasub/aaasubapp

[開発TIPS]
gitlab の aaasubapp リポジトリにはvendor、tmp、logsディレクトリを保存しないようになっているので、
ソースを新たに git clone した際には composer update をする必要があります。
もし、Windows 側で aaasubディレクトリを消したとします。
改めてgit clone した場合は、sync先のaaasub/aaasubapp内でcomposer updateする必要があります。
composer update するとaaasubappの下のvendorディレクトリにドカドカとプラグインがダウンロードされます。
また、tmp、logsディレクトリは自動的に作られるようです。
[vagrant@aaasub-xxxdomain ~]$ cd /vagrant/src/aaasub/aaasubapp
[vagrant@aaasub-xxxdomain ~]$ alias composer=’/usr/local/bin/composer.phar’
[vagrant@aaasub-xxxdomain ~]$ composer –version
[vagrant@aaasub-xxxdomain ~]$ composer update

この場合、config/.app.php ファイルの編集が必要です。
$ sudo cp /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.default.php /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.php
$ sudo vi /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.php
————————————————————————
//’salt’ => env(‘SECURITY_SALT’, ‘__SALT__’),
‘salt’ => env(‘SECURITY_SALT’, ‘適当な文字列’),

‘username’ => ‘db_user’,
‘password’ => ‘password’,
‘database’ => ‘cccdb’,
————————————————————————

ブラウザで確認する
http://aaasub-xxxdomain.local/
⇒OK。復旧しました。
“`

**git cloneしたbbbsubディレクトリがvagrant内とsyncするまで**

“`
$ cd /c/iWork/vagrants/aaasub-xxxdomain.local/
$ cd src
$ git clone http://my-gitlab-address/xxxdomain/bbbsub.git
$ cd ..
$ vagrant ssh
[vagrant@aaasub-xxxdomain ~]$ sudo ls -la /vagrant/src/
⇒ bbbsubディレクトリがsyncされています。

nginxの設定ファイル
[vagrant@aaasub-xxxdomain ~]$ sudo vi /etc/nginx/conf.d/bbbsub-xxxdomain.local.conf
————————————————————-
server {
listen 80;
server_name bbbsub-xxxdomain.local;
root /var/www/bbbsub-xxxdomain.local/bbbsub/app/webroot;
index index.php;
access_log /var/log/nginx/bbbsub-access.log;
error_log /var/log/nginx/bbbsub-error.log;

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

location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
————————————————————-

再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart nginx

ディレクトリ作成
[vagrant@aaasub-xxxdomain ~]$ sudo mkdir /var/www/bbbsub-xxxdomain.local
シンボリック作成
[vagrant@aaasub-xxxdomain ~]$ sudo ln -s /vagrant/src/bbbsub /var/www/bbbsub-xxxdomain.local/bbbsub
シンボリックリンク確認
[vagrant@aaasub-xxxdomain ~]$ ls -la /var/www/bbbsub-xxxdomain.local/
⇒lrwxrwxrwx 1 root root 18 Feb 28 15:37 bbbsub -> /vagrant/src/bbbsub

ブラウザでアクセスして確認
http://bbbsub-xxxdomain.local/
⇒NG。真っ白なのでエラーログを見つつ修正する
[vagrant@aaasub-xxxdomain ~]$ sudo tail -f /var/log/nginx/bbbsub-error.log
ディレクトリ作成
[vagrant@aaasub-xxxdomain ~]$ sudo mkdir /vagrant/src/bbbsub/app/tmp/cache/persistent
[vagrant@aaasub-xxxdomain ~]$ sudo mkdir /vagrant/src/bbbsub/app/tmp/logs

CakePHP2のエラーログ
[vagrant@aaasub-xxxdomain ~]$ sudo tail -f /vagrant/src/bbbsub/app/tmp/logs/error.log
⇒DBにデータがないのでエラーになっている風。

別途取ってあったcccdb__20190220.dmp.gz、eeedb__20190220.dmp.gzのバックアップファイルをWinSCPや、TeraTermなどでVM上に転送します。

[vagrant@aaasub-xxxdomain ~]$ sudo yum remove php*
[vagrant@aaasub-xxxdomain ~]$ sudo yum-config-manager –disable remi-php73
[vagrant@aaasub-xxxdomain ~]$ sudo yum-config-manager –enable remi-php71
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php
[vagrant@aaasub-xxxdomain ~]$ php -v
PHP 7.1.26 (cli) (built: Jan 9 2019 08:02:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

インストール
[vagrant@aaasub-xxxdomain ~]$ sudo yum install php-fpm php-redis phpMyAdmin php-intl php-pecl-apcu php-opcache
再起動
[vagrant@aaasub-xxxdomain ~]$ sudo systemctl restart php-fpm && sudo systemctl restart nginx

gitlab の aaasubapp リポジトリにはvendor、tmp、logsディレクトリを保存しないようになっているので、
ソースを新たに git clone した際には composer update をする必要があります。
もし、Windows 側で aaasubディレクトリを消したとします。
改めてgit clone した場合は、sync先のaaasub/aaasubapp内でcomposer updateする必要があります。
composer update するとaaasubappの下のvendorディレクトリにドカドカとプラグインがダウンロードされます。
また、tmp、logsディレクトリは自動的に作られるようです。
[vagrant@aaasub-xxxdomain ~]$ cd /vagrant/src/aaasub/aaasubapp
[vagrant@aaasub-xxxdomain ~]$ alias composer=’/usr/local/bin/composer.phar’
[vagrant@aaasub-xxxdomain ~]$ composer –version
[vagrant@aaasub-xxxdomain ~]$ composer update

この場合、config/.app.php ファイルの編集が必要です。
$ sudo cp /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.default.php /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.php
$ sudo vi /var/www/aaasub-xxxdomain.local/aaasubapp/config/app.php
————————————————————————
//’salt’ => env(‘SECURITY_SALT’, ‘__SALT__’),
‘salt’ => env(‘SECURITY_SALT’, ‘適当な文字列’),

‘username’ => ‘db_user’,
‘password’ => ‘password’,
‘database’ => ‘cccdb’,
————————————————————————

ブラウザで確認する
http://aaasub-xxxdomain.local/
⇒OK。復旧しました。

[vagrant@aaasub-xxxdomain ~]$ vmstat 1
⇒swapのsiに数字が出てるswapは基本なしが望ましい。

$ cd /c/iWork/vagrants/aaasub-xxxdomain.local
$ vi Vagrantfile
—————————-
#vb.memory = “1024”
vb.memory = “4096”
—————————-
VM再起動
$ vagrant reload

[vagrant@aaasub-xxxdomain ~]$ vmstat 1
⇒cakphp3デフォルトページにアクセスするだけでswapのsiが発生するとかはなくなりました。メモリ重要。
“`

Cakephp3本番環境ではエラー表示をさせたくない

前回まで

Cakephp3を使っていると、本番環境ではCakephpテンプレートエラーを出したくない場合もある。

いろんな方法があるが、ここでは Configure::read(‘debug’) の値をif判定する。
※本番環境: 0 開発環境: 1

URLの打ち間違いの40x系ページと、phpエラー等の50x系のページに判定分を追加する

$ vi Template/Error/error400.ctp
$ vi Template/Error/error500.ctp
-$this->layout = 'error';
+// 本番環境ではエラーは表示しない
+if (Configure::read('debug') === 0) {
+    $this->layout = 'error_prod';
+} else {
+    $this->layout = 'error';
+}

本番用レイアウトページを複製して修正

$ cp Template/Layout/error.ctp Template/Layout/error_prod.ctp
$ vi Template/Layout/error_prod.ctp // 適宜修正

cakephp3でデプロイ環境先毎にDB接続先を切り替えたい場合

cakephp3でデプロイ環境先毎にDB接続先を切り替えたい場合

環境毎にWebサーバに記述して再起動しておく
apache の場合

$ vi /etc/httpd/conf/httpd.conf
SetEnv CAKEPHP_ENV app_prod
#SetEnv CAKEPHP_ENV app_stg
#SetEnv CAKEPHP_ENV app_dev

nginxの場合

#fastcgi_param EXTRA_PARAMETER app_prod;
#fastcgi_param EXTRA_PARAMETER app_stg;
fastcgi_param EXTRA_PARAMETER app_dev;

bootstrapファイルを編集する

$ vi config/bootstrap.php
try {
    Configure::config('default', new PhpConfig());
    //Configure::load('app', 'default', false);
    switch (env('CAKEPHP_ENV')) {
        case 'prod':
            Configure::load('env/app_prod', 'default', false);
            break;
        case 'stg':
            Configure::load('env/app_srg', 'default', false);
            break;
        case 'dev':
            Configure::load('env/app_dev', 'default', false);
            break;
        default:
            Configure::load('app', 'default', false); // local
    }
} catch (\Exception $e) {
    exit($e->getMessage() . "\n");
}

設定ファイルをapp.phpからコピーする

$ mkdir config/env
$ cp config/app.php config/env/app_prod.php
$ cp config/app.php config/env/app_stg.php
$ cp config/app.php config/env/app_dev.php

接続先等を適宜編集する

$ vi config/env/app_prod.php
$ vi config/env/app_stg.php
$ vi config/env/app_dev.php

参考
http://easyramble.com/switch-environment-with-cakephp.html
http://easyramble.com/switch-cakephp-env.html
ありがとうございました

phpのデプロイツールdeployerでcakephp3のデプロイを試してみる

phpのデプロイツールdeployerを試してみる。
今回はcakephp3をデプロイしてみるイメージ。
リポジトリはsvnで。

vagrant で、3台のゲストサーバを用意する。

踏み台用 192.168.33.10
デプロイ先用1台目 192.168.33.11
デプロイ先用2台目 192.168.33.12
踏み台にログインして任意の場所にディレクトリを作成する
$ mkdir deploy
$ cd deploy
最新のdeployer.pharファイルをダウンロードしコマンド化する
$ wget https://deployer.org/releases/v4.0.2/deployer.phar
$ sudo mv deployer.phar /usr/local/bin/dep
$ sudo chmod +x /usr/local/bin/dep
設定ファイルを用意する
$ vi deploy.php

----
user('vagrant')
    ->password('vagrant');

// サーバログイン設定2
server('web2', '192.168.33.12', 22)
    ->user('vagrant')
    ->password('vagrant');

// 変数にデプロイ時刻を保存
set('dateYmdHis', date('Ymd_His'));

// httpd.confの環境変数からシンボリックリンクのパスを決定する
switch (getenv('CAKEPHP_ENV')) {
    case 'prod':
        set('linkPath', '/var/www/html/prod');
        break;
    case 'stg':
        set('linkPath', '/var/www/html/stg');
        break;
    default:
        set('linkPath', '/var/www/html/dev');
}

// デプロイ($ dep deploy)
task('deploy', function() {
        writeln('deploy: start');

        $svn_path = '';
        $dir_create_date = get('dateYmdHis');
        $dep_path = '/var/www/release/' . $dir_create_date;
        $link_path = get('linkPath');
        $result = run("sudo svn export {$svn_path} {$dep_path}");
        $result = run("sudo chmod -R 777 {$dep_path}/tmp");
        $result = run("sudo chmod -R 777 {$dep_path}/logs");
        run('sudo systemctl stop httpd.service');
        $result = run("sudo ln -nfs {$dep_path} {$link_path}");
        run('sudo systemctl start httpd.service');

        writeln('deploy: finish');
});

// ロールバック($dep rollback)
task('rollback', function() {
        writeln('rollback: start');
        $old_dir_create_date = run("sudo ls /var/www/release | tail -2 | head -1");
        $dep_path = '/var/www/release/' . $old_dir_create_date;
        $link_path = get('linkPath');
        run('sudo systemctl stop httpd.service');
        $result = run("sudo ln -nfs {$dep_path} {$link_path}");
        run('sudo systemctl start httpd.service');
        writeln('rollback: finish');
});
----

デプロイを実行
$ dep deploy

ロールバックを実行
$ dep rollback

なお、デプロイ先のサーバで svn(とかgit) コマンドがインストール済みで、かつ一度svnコマンドを実行して(p)とかを押している必要あり。

参考
https://deployer.org/

nginx1.10 + cakephp3.2 を試してみる

前回からの続き

インストール

$ cd /tmp
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer.phar
$ alias composer='/usr/local/bin/composer.phar'
$ composer --version
$ composer self-update && composer create-project --prefer-dist cakephp/app my_cakephp_app_name
$ cd /tmp/my_cakephp_app_name
$ mv /tmp/my_cakephp_app_name /var/www/my_cakephp_app_name

nginxの設定ファイル

$ vi /etc/nginx/conf.d/my_cakephp_app_name.conf
server {
        listen 80;
        server_name 192.168.33.10;
        root /var/www/my_cakephp_app_name;
        index index.php;
        #access_log /var/log/nginx/my_cakephp_app_name-access.log;
        #error_log /var/log/nginx/my_cakephp_app_name-error.log;

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

        location ~ \.php$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            #fastcgi_pass 127.0.0.1:9000;
            fastcgi_pass unix:/var/run/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        # 無いとcss等が表示されない
        location ~ ^/(img|css|js|files)/(.+)$ {
            root /var/www/cakephp/webroot;
            try_files /$1/$2 =404;
        }
}

参考


多謝

cakephp 2.2.2 で Json view

<?php // app/Controller/AbcController.php class AbcController extends AppController {  public function index()  {   $this->viewClass = ‘Json’;
  $this->set(‘aaa’, 1);
  $this->set(‘bbb’, “b”);
  $this->set(‘ccc’, array(‘c’=>3));
  $this->set(‘_serialize’, array(‘aaa’,’bbb’,’ccc’));
 }
}

実行結果
{
 ”aaa”: 1,
 ”bbb”: “b”,
 ”ccc”: {“c”: 3}
}

cakephp 1.3 テーブル連結

自分用メモ

cakephp 1.3 テーブルの連結

■テーブルを連結 $hasOne してデータ取得するまで
————————————————————
データベースにmembersテーブルと連結するProfilesテーブルを作成
————————————————————
mysql>
CREATE TABLE profiles (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, member_id INT UNSIGNED UNIQUE, freetext VARCHAR(200));
INSERT INTO profiles (id, member_id, freetext) VALUES (0,’4′,’FREEEEEEEEE’); # サンプルデータ
————————————————————
※テーブル名に複数形sがついていることに注意
※profiles テーブルの id カラムと連結させるのは members テーブルのidと指定
————————————————————
モデル
————————————————————
$ vi app/models/member.php
————————————————————
class Member extends AppModel
{
 var $name = ‘Member’;
 var $hasOne = array(
  ’Profile’ =>
  array(
   ’className’ => ‘Profile’,
   ’conditions’ => ”,
   ’order’ => ”,
   ’dependent’ => true,
   ’foreignKey’ => ‘member_id’
  )
 );
}
————————————————————
コントローラ
————————————————————
$ vi app/controllers/member_controller.php
————————————————————
<?php
class MemberController extends AppController
{
function index()
{
 $results = $this->Member->find(‘first’, array(‘conditions’=>array(‘Member.id’=>4)));
 $this->set(‘results’, $results);
 //var_dump($results);
 }
}
————————————————————
ビュー
————————————————————
$ vi app/views/member/index.ctp
————————————————————
<li><?php echo $results[‘Member’][‘id’]; ?></li>
<li><?php echo $results[‘Member’][‘name’]; ?></li>
<li><?php echo $results[‘Profile’][‘id’]; ?></li>
<li><?php echo $results[‘Profile’][‘member_id’]; ?></li>
<li><?php echo $results[‘Profile’][‘freetext’]; ?></li>
————————————————————

cakephp 1.3 インストール

自分用メモ

Cakephp 1.3 をダウンロードして解凍してウェブサーバースペースに配置
http://cakephp.org/

ブラウザでアクセスするとエラーが出るのでphp.ini設定変更
$ sudo vi /etc/php.ini
;date.timezone =
date.timezone = Asia/Tokyo

Apacheのcakephp1.3配下の設定変更
$ sudo vi /etc/httpd/conf/httpd.conf
————————————————————
<Directory “/var/www/html/cakephp1.3″>
AllowOverride All
</Directory>
————————————————————

Apache 再起動
$ sudo /etc/init.d/httpd restart

cakephpのtmpディレクトリパーミッション設定
$ cd /var/www/html/cakephp1.3/app/
$ chmod -R 777 tmp

cakephpの設定ファイルを変更
$ sudo vi /var/www/html/cakephp1.3/app/config/core.php
Security.salt と Security.cipherSeed の値を書き換える

cakephpデータベース接続設定
$ cp /var/www/html/cakephp1.3/app/config/database.php.default /var/www/html/cakephp1.3/app/config/database.php
$ vi /var/www/html/cakephp1.3/app/config/database.php
————————————————————
public $default = array(
‘datasource’ => ‘Database/Mysql’,
‘persistent’ => false,
‘host’ => ‘localhost’,
‘login’ => ‘testsys’,
‘password’ => ‘testpass’,
‘database’ => ‘testdb’,
‘prefix’ => ”,
//’encoding’ => ‘utf8’,
);
————————————————————

cakephp 1.3 サンプルコード

自分用メモ

■cakephp 1.3 でDB連携してデータ取得するまで
————————————————————
1. データベースにテーブルを作成
————————————————————
mysql>
CREATE TABLE members ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
————————————————————
※テーブル名に複数形sがついていることに注意
————————————————————
2. モデルの作成
————————————————————
$ vi app/models/member.php
————————————————————
<?php
class Member extends AppModel
{
 var $name=”Member”;
}
————————————————————
3. コントローラの作成
————————————————————
$ vi app/controllers/member_controller.php
————————————————————
<?php
class MemberController extends AppController
{
 public $scaffold;
}
————————————————————
4. ブラウザで確認
————————————————————
http://localhost/cakephp1.3/member
————————————————————

■全レコード取得
————————————————————
コントローラ
————————————————————
$ vi app/controllers/member_controller.php
————————————————————
<?php
class MemberController extends AppController
{
 function index()
 {
  // all records
  $results = $this->Member->find(‘all’);
  $this->set(‘results’, $results);
 }
}
————————————————————
ビュー
————————————————————
$ vi app/views/member/index.ctp
————————————————————
<?php foreach($results as $v): ?>
<li><?php echo $v[‘Member’][‘id’] . $v[‘Member’][‘name’]; ?></li>
<?php endforeach; ?>
————————————————————

■1レコード取得
————————————————————
コントローラ
————————————————————
$ vi app/controllers/member_controller.php
————————————————————
<?php
class MemberController extends AppController
{
 function index()
 {
  // 1 record
  $results = $this->Member->find(‘first’, array(‘conditions’=>array(‘id’=>4)));
  $this->set(‘results’, $results);
 }
}
————————————————————
ビュー
————————————————————
$ vi app/views/member/index.ctp
————————————————————
<?php foreach($results as $v): ?>
<li><?php echo $v[‘id’] . $v[‘name’]; ?></li>
<?php endforeach; ?>
————————————————————