「Cloud Foundry 百日行」第62日目。 今回は超メジャーどころのWordPressです。 その為、Cloud Foundryでのデプロイ手順等は沢山あるのでもう紹介の必要なんてないかもしれませんがお付き合いください。
基本情報
手順は以下の通りです。
- 1) ソースコードの取得
- 2) アプリのデプロイ
- 3) 動作確認
- 4) Cloud Foundry用を利用したデプロイ
1. ソースコードの取得
Cloud Foundryで動作するようにされたものを利用してもいいのですが、それだとすぐに終わってしまうのでまずは公式のソースコードでのデプロイ方法をご紹介します。
まずは日本語ソースコードをダウンロードします。
$ wget https://ja.wordpress.org/wordpress-4.2.4-ja.tar.gz
$ tar xzvf wordpress-4.2.4-ja.tar.gz
$ cd wordpress
$ ls
index.php wp-blog-header.php wp-includes wp-settings.php
license.txt wp-comments-post.php wp-links-opml.php wp-signup.php
readme.html wp-config-sample.php wp-load.php wp-trackback.php
wp-activate.php wp-content wp-login.php xmlrpc.php
wp-admin wp-cron.php wp-mail.php
2. アプリのデプロイ
ちなみにご存知でない方の為にお伝えするとWordPressはPHPとMySQLの組み合せで動作させることが出来ます。その為、これまでの記事にも多く登場しているので愛読していただいている方にはおなじみの内容になります。
2.1 PHP拡張モジュールの追加
とりあえずMySQLのモジュールを追加します。
$ mkdir .bp-config
$ vi .bp-config/options.json
$ cat .bp-config/options.json
{
"PHP_EXTENSIONS": ["mysql"]
}
2.2 MySQL サービスの準備
$ cf create-service p-mysql 100mb wpdb1
ついでに環境変数から作成したDBとの説情報がとれるように wp-config.php
を作成します。
$ cp wp-config-sample.php wp-config.php
$ vi wp-config.php
$ diff wp-config-sample.php wp-config.php
22a23,27
>
> $services = getenv("VCAP_SERVICES");
> $services_json = json_decode($services,true);
> $mysql_config = $services_json["p-mysql"][0]["credentials"];
>
24c29
< define('DB_NAME', 'database_name_here');
---
> define('DB_NAME', $mysql_config["name"]);
27c32
< define('DB_USER', 'username_here');
---
> define('DB_USER', $mysql_config["username"]);
30c35
< define('DB_PASSWORD', 'password_here');
---
> define('DB_PASSWORD', $mysql_config["password"]);
33c38
< define('DB_HOST', 'localhost');
---
> define('DB_HOST', $mysql_config["hostname"]);
2.3 アプリのPush
アプリのプッシュ前にmanifest.ymlを作成します。
$ vi manifest.yml
・・・
$ cat manifest.yml
---
applications:
- name: wpja
services:
- wpdb1
では cf push
しましょう。
$ cf push
:
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: wpja.10.244.0.34.xip.io
last uploaded: Thu Aug 6 06:48:30 UTC 2015
stack: cflinuxfs2
buildpack: PHP
state since cpu memory disk details
#0 running 2015-08-06 03:48:59 PM 1.6% 33.5M of 256M 0 of 1G
ハイ完了!
3. 動作確認
URLにアクセスすれば以下のようなウィザードが上がってくるのでお好きなように入力して下さい。
ログインしてテスト投稿します。
が、ここでアプリを cf restart
すると添付ファイルが消失します。
原因は投稿された記事本文はDBに保管されていますが添付ファイルはアプリのローカルに保存される為、 cf restart
で見事に消えてしまいます。
ではこれを解消する為にCloud Foundry用に準備されたリポジトリを利用したデプロイを試してみましょう。
4. Cloud Foundry用を利用したデプロイ
まずは同じくソースコードをダウンロード。
$ git clone https://github.com/dmikusa-pivotal/cf-ex-worpress.git
$ cd cf-ex-worpress
$ ls
manifest.yml README.md wp-config.php
中身がほとんどありません。実はこのリポジトリには WordPress
自体のソースは含まれていません。
では何が含まれているか見てみましょう。
$ ls -a
. .bp-config c .gitignore README.md wp-config.php
.. .cfignore .git manifest.yml .ssh
ここの中で重要なのは .extensions/wordpress/extension.py
です。
これは PHP-buildpack
のオプションを利用する為のファイルです。これまであまり機会がありませんでしたが、これを利用することで更なるデプロイ内容の拡張が可能となります。
今回はオプションを利用して WordPress
のソースコードの取得とアプリの一部のディレクトリに外部サーバのディスクをマウントを行います。後者の機能によりアプリの再起動でリセットされていたデータを残すことが出来ます。
では前準備をしていきます。まずはMySQLを準備します。
$ cf create-service p-mysql 100mb wpdb2
あと環境変数で取得するサービス名が異なるので wp-config.php
修正。
$ vi wp-config.php
$ git diff
diff --git a/wp-config.php b/wp-config.php
index dbbff27..b59be71 100644
--- a/wp-config.php
+++ b/wp-config.php
@@ -16,7 +16,7 @@
// ** Read MySQL service properties from _ENV['VCAP_SERVICES']
$services = json_decode($_ENV['VCAP_SERVICES'], true);
-$service = $services['cleardb'][0]; // pick the first MySQL service
+$service = $services['p-mysql'][0]; // pick the first MySQL service
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
.bpconfigは既に準備されているので、manifest.ymlを編集。
diff --git a/wp-config.php b/wp-config.php
index dbbff27..b59be71 100644
--- a/wp-config.php
+++ b/wp-config.php
@@ -16,7 +16,7 @@
:
applications:
-- name: mywordpress
- memory: 128M
- path: .
- buildpack: https://github.com/cloudfoundry/php-buildpack
- host: wordpress-on
+- name: cfwp
services:
- - mysql-db
+ - wpdb2
env:
- SSH_HOST: user@your-ssh-server
- SSH_PATH: /full/or/relative/path/on/ssh/server
- SSH_KEY_NAME: sshfs_rsa
- SSH_OPTS: '["cache=yes", "kernel_cache", "compression=no", "large_read"]'
+ SSH_HOST: ubuntu@192.168.1.10
+ SSH_PATH: /home/ubuntu/sshfs
+ SSH_KEY_NAME: id_rsa
+ SSH_OPTS: '["cache=yes", "kernel_cache", "compression=no", "large_read", "Ciphers=arcfour"]'
ここでSSHの接続先サーバ情報と公開鍵の名前などを設定します。
以降はSSH接続の準備になります。
まずはキーを保存するディレクトリを作成し、ディレクトリに権限設定します。
$ mkdir .ssh
$ chmod 700 .ssh
$ ssh-keygen -t rsa -f .ssh/id_rsa
$ ls .ssh/
id_rsa id_rsa.pub
$ cat .ssh/id_rsa.pub
キーを作成後に接続先のSSHサーバの ssh/authorized_keys
に公開鍵(id_rsa.pub)を登録します。
(接続先のSSHサーバ)
$ vi .ssh/authorized_keys
(元のサーバに戻る)
known_hosts
に接続先のSSHサーバを記録する為に以下を実行。
$ ssh-keyscan -t rsa 192.168.1.10 > .ssh/known_hosts
で後は cf push
といきたいところですがここで 第2回 postgresql-cf-service-broker 記事の「Application Security Group の解放」のとおり接続先のSSHサーバがプライベート・アドレスの場合、接続に失敗します。
その為、過去の記事同様に security group
の作成をCloud Foundryの admin
権限で実施します。
$ cf login -u admin
$ vi sg-ssh.json
$ cat sg-ssh.json
[
{
"protocol": "tcp",
"destination": "192.168.1.10",
"ports": "22"
}
]
$ cf create-security-group sshwp sg-ssh.json
$ cf logout
$ cf login
(一般ユーザ)
後は cf push
するだけですが、折角なので先に利用した日本語版と同じものが入るように一手間加えます。
先ほど登場した extension.py
を編集。
$ vi .extensions/wordpress/extension.py
$ git diff
diff --git a/.extensions/wordpress/extension.py b/.extensions/wordpress/extension.py
index 21d6360..5a1bc91 100644
--- a/.extensions/wordpress/extension.py
+++ b/.extensions/wordpress/extension.py
@@ -13,10 +13,10 @@ _log = logging.getLogger('wordpress')
DEFAULTS = utils.FormattedDict({
- 'WORDPRESS_VERSION': '4.1.1', # or 'latest'
+ 'WORDPRESS_VERSION': '4.2.4-ja', # or 'latest'
'WORDPRESS_PACKAGE': 'wordpress-{WORDPRESS_VERSION}.tar.gz',
'WORDPRESS_HASH': '258bda90f618d7af3a2db7f22fc926d1fedb06f4',
- 'WORDPRESS_URL': 'https://wordpress.org/{WORDPRESS_PACKAGE}',
+ 'WORDPRESS_URL': 'https://ja.wordpress.org/{WORDPRESS_PACKAGE}',
})
では今度こそ cf push
。
$ cf push
:
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: cfwp.10.244.0.34.xip.io
last uploaded: Thu Aug 6 07:42:47 UTC 2015
stack: cflinuxfs2
buildpack: PHP
state since cpu memory disk details
#0 running 2015-08-06 04:45:23 PM 1.7% 37.2M of 256M 0 of 1G
動作確認は先ほどと同じ方法で実施。
再起動後も大丈夫。
ついでにSSHサーバのマウントしたディレクトリを確認するとこんな感じ。
~/sshfs$ ls -al
total 32
drwxrwxr-x 6 ubuntu ubuntu 4096 Aug 6 07:43 .
drwxr-xr-x 5 ubuntu ubuntu 4096 Aug 6 07:12 ..
-rw------- 1 ubuntu ubuntu 28 Jan 8 2012 index.php
drwx------ 4 ubuntu ubuntu 4096 Aug 6 07:43 languages
drwx------ 4 ubuntu ubuntu 4096 Aug 6 07:43 plugins
drwx------ 5 ubuntu ubuntu 4096 Aug 6 07:43 themes
drwxrwxr-x 3 ubuntu ubuntu 4096 Aug 6 07:48 uploads
-rw------- 1 ubuntu ubuntu 276 Aug 6 07:43 WARNING_DO_NOT_EDIT_THIS_DIRECTORY
最後にこのSSHで保存する機能はすごくアナログ感はあるのですが、これまでにも紹介したアプリも再起動したら残念な結果がまっているものがあるので、ひとまずこの機能を試してみるのはいかがでしょうか。
今回使用したソフトウェア
- cf-release (v211)
https://github.com/cloudfoundry/cf-release/tree/v211
(https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (v6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/tree/v6.12.0
(https://github.com/cloudfoundry/cli/tree/8c65bbd4d243cbbc9bdbf2ec2a3b0e094c094f48) - cf-mysql-release (v20)
https://github.com/cloudfoundry/cf-mysql-release/tree/v20
(https://github.com/cloudfoundry/cf-mysql-release/tree/8f7f6916b75a2e01332cc91df8c285dabe698703) - WordPress(v4.2.4)
https://ja.wordpress.org/wordpress-4.2.4-ja.tar.gz - cf-ex-wordpress
https://github.com/dmikusa-pivotal/cf-ex-wordpress/tree/0b8d4347a657e441fbb039ad5c6f6965ab28caf4