以前の記事にもある通り、このブログではスタイルシートや画像、JavaScript ファイルなどの静的ファイルを Amazon S3 に置いて、Amazon CloudFront から配信しています。
URLの切替には自作のプラグインを使っています。記事にした当時は stylesheet_uri と template_directory_uri の置き換えをするだけのものでしたが、今は WP_PLUGIN_URL も置換えて、プラグインが追加するスタイルや画像も CloudFront から配信しています。
ここまではわりと簡単に実装できていたのですが、メディアライブラリ(uploads ディレクトリ)に置いた画像ファイルは記事の中身を書き換える必要があるため、なかなか手を出せずに1年くらい放置していましたが、最近、WordPress Amazon S3 Plugin というものがあるのを知り、さっそく試してみました。
このプラグインのセットアップは簡単で、plugins ディレクトリに置いて有効化したあとで、Amazon S3 の認証情報と画像を置くバケツ名を指定するだけです。
設定が完了した後はしばらく待っていると、wp-cron の仕組みを使い、誰かがアクセスしてきた時にバックグラウンドで画像ファイルを Amazon S3 にアップロードしていきます。(アップロードする画像はキューに入れられ、順番に処理されていくようです。)
画像ファイル毎に Amazon S3 へのアップロード状況が記録され、正常に保存された画像ファイルの URL は次回に表示される時から Amazon S3 の URL に置換えられます。
非常に簡単に使えて効果の高いプラグインなのですが、このブログの環境ではいくつか問題がありました。
画像ファイルが完全URLで指定されている事が想定されている。
このプラグインでは画像ファイルへの URL が http:// から始まる完全 URL で書かれている事を想定しているのですが、当ブログでは、ある記事では完全 URL、別の記事ではルート相対URL、という感じで記事ごとに画像の URL の書き方がバラバラでした。
このため、画像への URL を探す正規表現にマッチしない画像がたくさん出てきてしまいました。
メディアライブラリから画像を「投稿に挿入」していれば、完全URLで書かれるので普通に使っていれば問題は無かったはずなんですが。。。
しかたがないので、これはプラグインのソースに手を入れてルート相対URLでも書き換えられるように修正しました。
CloudFront の URL に対応していない。
このプラグインは画像ファイルのURLを http://>バケツ名<.s3.amazonaws.com という場所に変更するのですが、私のデータは Amazon S3 の中でも北米東海岸のサーバに置かれているため、ファイルの送信にちょっと時間がかかります。どうせなら国内の CloudFront のサーバから配信したいので、以下のようにソースを修正しました。wp-cdn.bluegold.me はヂストリビューションに付けた CNAME です。
*** 212,218 **** if (file_exists ( $mediaInfo [ 'cache' ] ) === TRUE) { $fileContents = file_get_contents ( $mediaInfo [ 'cache' ] ); if ($fileContents == 'done') { ! $cdnUrl = "http://{$this->s3BucketName}.s3.amazonaws.com/" . $mediaInfo [ 'path' ]; $the_content = str_replace ( $mediaInfo [ 'url' ], $cdnUrl, $the_content ); } } else { --- 214,221 ---- if (file_exists ( $mediaInfo [ 'cache' ] ) === TRUE) { $fileContents = file_get_contents ( $mediaInfo [ 'cache' ] ); if ($fileContents == 'done') { ! // $cdnUrl = "http://{$this->s3BucketName}.s3.amazonaws.com/" . $mediaInfo [ 'path' ]; ! $cdnUrl = "http://wp-cdn.bluegold.me/" . $mediaInfo [ 'path' ]; $the_content = str_replace ( $mediaInfo [ 'url' ], $cdnUrl, $the_content ); } } else {
このプラグインは非常に簡単に使えるので、Amazon S3 のアカウントを持っている人にはお勧めできますね。
[…] というような改良ができるかな、と感じました。 一点目は、このサイトを参考にさせていただきました。こんな感じに plugins/wp-s3/s3.php を変更しています。 […]