SoftLayer Object Storageを使ってEC-CUBEの画像ファイルを送信する。

このエントリは[SoftLayerAdventCalendar2014](http://qiita.com/advent-calendar/2014/softlayer)の16日目のエントリです。

#概要
[EC-CUBE](http://www.ec-cube.net/)はオープンソースのECサイト構築パッケージです。今回はEC-CUBEをSoftLayer上に作成し、尚且つ商品の画像ファイル等をObjectStorageに保存,配信する方法を紹介します。

EC-CUBEは通常、Apache+PHP+MySQLの構成で構築されることが多いです。今回はEC-CUBEの高速化を図るために、ApacheではなくApacheと比較してメモリ消費量が少なく、サーバー本体への負担が低いNginx+PHP-FPMの構成で環境を構築します、またECサイトなので画像を使う事が多いかと思います。静的コンテンツである画像等をSoftLayer ObjectStorageに保存しサーバーのCPUやメモリの負荷を下げるアプローチとなります。
#前提
SoftLayer Object Storageのコンテナは設定済みのものとします。
設定に関しては次のリンクが参考になります。[ソフトレイヤー活用技術資料 -> コンフィグレーションガイド -> 5.オブジェクト・ストレージ編](https://gg-web.jp/document/ConfigGuide/05001/index.html)
#構成
OS:CentOS6.x
WEB:Nginx1.6.2
DB:MySQL5.6.16
PHP-FPM:5.5.10
EC-CUBE:2.13.3
#インストール
上記パッケージはソースコンパイルでインストールしてます。ですがyumでのインストールでも問題ありません。
詳細は割愛します。。

#Object Storageへ画像のアップロード
ObjectStorageへの画像アップロードは管理ポータルからアップロードする方法もありますが、アップする画像が多い時など結構面倒くさいです。APIを使う方法もありますが今回は次のリンクを参考に[CloudBerry Explorer for OpenStack (Windows)](http://www.cloudberrylab.com/free-openstack-storage-explorer.aspx)を使って画像をアップロードします。一括でアップロード出来るので便利ですね。

[SoftLayer Object Storage のファイル操作を簡単に行う方法](http://qiita.com/kkitase/items/37b6c0dc4d8c9689697f)

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/59865/6d87fea6-da9a-14b3-9567-ca681771e540.png)

###アップロードするEC-CUBEのディレクトリ
/var/www/eccube_html/user_data/packages/default/img
img以下に存在する画像を設定済みのコンテナにアップロードします。EC-CUBEはデバイス毎（PC用、スマホ用、モバイル用）にディレクトリが分かれていますが、今回はPC用：default以下の画像を対象とします。
※eccube_htmlは任意のディレクトリ

#登録された動画・画像のブラウザからの参照の有効化
管理ポータル画面から、コンテナの中のページに移動し「Static Site Access」の「Enable Static Site」のチェックボックスを有効にします。 

#画像ファイルをObjectStorageを参照するように変更する
Nginxのリダイレクト(rewrite)を使います。
###Nginx設定ファイル
```nginx:/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
        root   /var/www/eccube_html;
        index  index.html index.htm index.php;
    }

    location /user_data/packages/default/img/ {
        rewrite ^/user_data/packages/default/img/(.*)/(.*) https://sjc01.objectstorage.softlayer.net/v1/AUTH_xxxxxxxxxxxxxxxxxxxxxxxx/sjc-object-storage/img/$1/$2;
# xxxxxの所は環境に応じて変更ください。
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/eccube_html$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```
この設定では/user_data/packages/default/img/以下のファイルへのアクセスをオブジェクト・ストレージに変更しています。
※sjc-object-storageはコンテナ名です。


![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/59865/c6f1592b-e50a-2865-5f5e-1519ac9ce80e.png)
※見た目は変わりませんが、各画像がObjectStrageから配信されています。


#まとめ
以上でEC-CUBEの画像ファイルをObjectStorageから配信する事が出来ました。今度時間があれば、商品画像を登録する際、ローカルからObjectStorageに画像を保存する機能をSoftLayerのAPIを使って実現したいと思います。最後になりましたが、この記事が何かのお役に立てれば幸いです。