オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-09-16

WordPress を Cloud Foundry で動かす

「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で保存する機能はすごくアナログ感はあるのですが、これまでにも紹介したアプリも再起動したら残念な結果がまっているものがあるので、ひとまずこの機能を試してみるのはいかがでしょうか。

今回使用したソフトウェア