SlideShare ist ein Scribd-Unternehmen logo
1 von 35
iPhoneアプリのバックエンド
にRailsとHerokuを使ってみた
GMOメディア 中村真一郎
 名前 中村真一郎
 所属 GMOメディア株式会社
 Twitteアカウント s_nakamura
 業務内容:
ポイント管理、ユーザ管理を行うBtoC向けサービスの開発
と運用。
その前はブログシステムの開発、運用を担当
メイン言語はJava
 Rubyとの関わり:
Javaの次に学ぶ言語として始めた。Rubyの楽しさにハマっ
た。
自己紹介
 Girlscameraの概要
 Girlscameraサーバサイドの構成
 Girlscameraサーバサイド構築ナレッジ
 Herokuを使って困ったこと
 最後に
アジェンダ
 Herokuを実サービスで使っている人?
 Railsを実サービスで使っている人?
本題に入る前にアンケート
Girlscameraの概要
 プリクラが撮影できる無料のiPhoneアプリ。現在はVer1.4
 日本だけでなく、アジア各国、アメリカで使われている。
 Twitterやfacebookとも連携
 ダウンロード数:累計約77万(iphone/iPad)
Girlscameraとは
 当初はサーバサイドをPHPで作成。途中から私が担当を引き
継ぎPHPからRubyに変更。理由は・・・
Rubyが好きだから。
 当初は外部のクラウド環境で運用。途中から引き継ぎ好きに
してよいという話だったので、Herokuに変更。理由
は・・・・
この先の運用を考えた時にサーバやデータベースの運用等に
労力を掛けないようにしたかった。Herokuを使えば、より開発
に専念できると考えた
GirlscameraとRubyの関わり
Girlscamera構成
 使用ソリューション
Rails3.2.2/Ruby1.9.2
Heroku cedar stack(本番とステージング)
Postgresql(Roninを使用)
Amazon S3(Paperclip)
Unicorn
Memcached(Dalli)
Github
New Relic
Heroku Scheduler
Girlscamera構成
Girlscamera構成
Girlscamera
(iPhone)
Heroku
PostgresqlMemcached
girlscameraApp
UNICORN
Girlscameraサーバサイド
構築ナレッジ
 本番とStagingの二つの環境をHeroku上に構築。Stagingの
方は無料の範囲で構築。本番の方は無料のものだけでなく、
有料のものを使用
 Stagingはベーシック認証を入れて認証を通ればアクセスで
きるようにした。
 Railsアプリ側では、./config/environments/以下にstaging.rb
を追加。また./config/database.ymlにstagingに関する記述も
追記
Staging環境構築
 >heroku create hogehoge-staging --remote staging --stack cedar
 >git init
 >git add .
 >git commit -m'first commit'
 >git remote add staging [heroku git url]
 >git push staging master
 >heroku config:add RACK_ENV=staging --app hogehoge-staging
 >heroku config --app hogehoge-staging
 >heroku config:add --app hogehoge-staging USER_ID=‘[USERID]'
PASSWORD=‘[PASSWORD]'
Staging環境構築
 画像アップロードでは、
「paperclip(https://github.com/thoughtbot/paperclip) 」を使
用
 Paperclipは使いやすい画像アップロード用ライブラリ。今
回は画像ストレージとしてAmazon S3を使用。
 画像出力先やアップロードした画像のファイル名変更する
など行いたい場合は、モデルクラス内で環境変数の値を見
て処理を分岐させたり、「./config/initializers 」以下に
paperclip.rbなどのファイルを作成しパッチを適用したりす
る。
Paperclipを使った画像アップロー
ド
画像出力先を環境変数で変える場合モデルクラスに以下のよ
うな記述をする
if Rails.env.production?
has_attached_file :stamp,
:storage => :s3,
・・・・・・・・・・・
else
has_attached_file :stamp,
:url=>"/:style/:filename" ,
・・・・・・・・・・・・
end
Paperclipを使った画像アップロー
ド
 ./config/initializers/paperclip.rb
module Paperclip
class Thumbnail < Processor
def transformation_command
#Image Magicのコマンド実行時に処理を追加する
end
End
Paperclipを使った画像アップロー
ド
 New Relicを使って日々パフォーマンスをチェック。どこ
の処理で時間が掛かっているのか、実行されるメソッドが
何が多いのかなど細かい単位でチェックできるので便利
 高負荷になった場合の通知設定
New Relicでパフォーマンスを
チェック
 ./config/newrelic.yml
production:
error_collector:
capture_source: true
enabled: true
ignore_errors: ActionController::RoutingError
apdex_t: 0.9
ssl: false
monitor_mode: true
license_key: <%= ENV["NEW_RELIC_LICENSE_KEY"] %>
developer_mode: false
app_name: <%= ENV["NEW_RELIC_APP_NAME"] %>
transaction_tracer:
record_sql: off
enabled: true
stack_trace_threshold: 2.0
transaction_threshold: apdex_f
capture_params: false
log_level: info
New Relicでパフォーマンスを
チェック
 初期は何も設定をしない場合WEBrick。実運用では、WEBRickで
はなく別ソリューションがよいと考え、幾つかのサイトでも実
績があるUnicornを使うことにした。
 導入手順としては、Gemfileにunicornを追記。
 ./config/unicorn.rbを作成し、workerの数やTimeout設定などを追
記
 ./Procfileを作成しunicornの起動方法を記述
 Procfileとはcedarスタックから採用されたHerokuで動くアプリ
ケーションの動作を指定。web,worker,clockがある。
 最後にHeroku を再起動して設定を反映。起動しているかは、
「heroku ps」を使って確認
Unicornの導入
 Gemfileに追加
gem 'unicorn‘
 ./config/unicorn.rb を作成
worker_processes 4
timeout 15
preload_app true
 ./Procfileを作成
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
 >heroku ps –app [APPの名前]
Process State Command
------- ---------- ------------------------------------
web.1 up for 41m bundle exec unicorn -p $PORT -c ./..
Unicornの導入
 デフォルトだとherokuapp.comなので、それを独自のドメ
インに変更したい
 手順としては、アプリケーションの管理ページから新規
ドメイン( custom domain)を追加
 DNSサーバにIPの情報を追加し、新たに追加したドメイン
へ来た場合にHeroku側にいくようにする。
※追加IP
75.101.163.44
75.101.145.87
174.129.212.2
DNS設定の変更
 DBから取得した値などは、Memcachedに保存し、極力DB
アクセスを少なくする
 Memcachedを扱うライブラリとしてDalliを使用。
 Gemfileにdalliを追加
 ./config/environments/production.rbに設定を追加
 アプリケーション側にMemcachedへアクセスし、値を取
得/格納する記述を追記
Memcachedを使う
 Gemfileに追記
gem 'dalli‘
 ./config/environments/production.rbに追記
config.cache_store = :dalli_store
config.action_dispatch.rack_cache = {
:verbose => true,
:metastore => ENV['MEMCACHE_SERVERS'],
:entitystore => ENV['MEMCACHE_SERVERS']
}
config.static_cache_control = "public, max-age=2592000"
Memcachedを使う
 iPhoneアプリ内でAPI経由で取得した画像を表示している箇
所で「www.hogehoge.jp/photo/aaaaaa.png」のように記述し
ている箇所があった。しかし画像はAmazon S3に切り替えた
ため画像のURLが
「hogehoge-bucket.s3.amazonaws.com/photo/aaaaaa.png」
に変わったため表示が出来なかった。
 そこでアプリケーション側で「www.hogehoge.jp/photo」で
来たときに「hogehoge-bucket.s3.amazonaws.com/photo」に
遷移するようにリライト処理を追加した。
画像URLのリライト
 Gemfileに追加
gem 'rack-rewrite', '~> 1.0.0'
 ./config/initializers/rack_rewrite.rbを作成
require 'rack/rewrite'
GirlsCamera::Application.config.middleware.insert_before(Rac
k::Lock, Rack::Rewrite) do
if Rails.env.production?
r301 [遷移元URL パターン] ,[遷移先URLパターン]
end
end
画像URLのリライト
 定期的に実行したいバッチ処理はHerokuのプラグインで
ある「Heroku scheduler」を使うとよい。
 Rakeのタスクとして処理を記述し、Herokuのアプリケー
ション管理画面から実行時間の設定を行う
 実行時間を10分、1時間、1日という間隔で設定可能
Heroku Schedulerを使う
 ./lib/taks/cron.rakeのようにファイルを作成し、rakeタスクを定義
する
desc "This task is called by the Heroku scheduler add-on"
task :calculate_daily_photo=> :environment do
puts 'Daily stamp repcalculate_daily_photoort batch.'
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
end
End
 >rake calculate_daily_photo
※schdulerには「bundle exec rake calculate_daily_photo」
Heroku Schedulerを使う
 本番環境のテーブルに直接アクセスしデータの確認をしたい
とき、「heroku-sql-console」を使うと便利
>heroku plugins:install git://github.com/ddollar/heroku-sql-
console.git
>heroku sql --app hogehogeAPP
本番DBへ直接SQLを投げる
 >heroku restart –app [アプリ名]
 >heroku logs –t –app [アプリ名]
 >heroku run rake db:migrate –app [アプリ名]
 >heroku ps –app [アプリ名]
 >heroku ps:scale web=2 worker=1 –app [アプリ名]
 >heroku run console –app [アプリ名]
Herokuコマンド
Herokuを使って困ったこと
 Herokuが6月15日の13時過ぎに落ちた・・・・。
 Herokuの障害状況を表したページやTwitterを見て逐次状況
を確認(http://status.heroku.com)
 Subscribe notificationでメールを登録しておくと、Herokuで
何か問題があった時に直ぐに検知できる。
 Herokuが長時間使えない状況に陥った時の対応策を用意し
ておくべき
困ったこと(1)
 困るほどではないが、情報は大体英語で記載。難しい英
語ではないので読んで理解できる。
(https://devcenter.heroku.com)
 どうしても困った場合はサポートページで問い合わせす
るとよい。アメリカとの時差はあるが、割と真摯に対応
してくれる。
(https://support.heroku.com/home)
困ったこと(2)
最後に
 Herokuにして開発に集中できたと思う。
 Add-ONも充実している
 Herokuは海外でも導入実績があるので、使う機会があれば
使ってみるとよいと思う
 やっぱり日本リージョンが欲しい
 Herokuもダウンすることがあるので、その場合の対策は必
要
最後に
以上です。
ご清聴ありがとうございまし
た。

Weitere ähnliche Inhalte

Ähnlich wie Herokuとrails

JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」Junichiro Kazama
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceMakoto Haruyama
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版DIVE INTO CODE Corp.
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイoshiro_seiya
 
4時間耐久 PHP on Heroku
4時間耐久 PHP on Heroku4時間耐久 PHP on Heroku
4時間耐久 PHP on HerokuYusuke Ando
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm晃 遠山
 
Enterprise Redmine
Enterprise RedmineEnterprise Redmine
Enterprise RedmineDai FUJIHARA
 
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門leverages_event
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業についてHisatoshi Kikumoto
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方Yuji Oshima
 
XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!Atsushi Sato
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るshinjiigarashi
 
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発hmimura_embarcadero
 

Ähnlich wie Herokuとrails (20)

Ruby開発者のためのHeroku入門
Ruby開発者のためのHeroku入門Ruby開発者のためのHeroku入門
Ruby開発者のためのHeroku入門
 
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
 
ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
Rubykaigi2010
Rubykaigi2010Rubykaigi2010
Rubykaigi2010
 
OSC福岡 20111203
OSC福岡 20111203OSC福岡 20111203
OSC福岡 20111203
 
Facebook and heroku
Facebook and herokuFacebook and heroku
Facebook and heroku
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a Service
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
 
Dockerでデプロイ
DockerでデプロイDockerでデプロイ
Dockerでデプロイ
 
4時間耐久 PHP on Heroku
4時間耐久 PHP on Heroku4時間耐久 PHP on Heroku
4時間耐久 PHP on Heroku
 
最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm最強のPHP統合開発環境 PHPStorm
最強のPHP統合開発環境 PHPStorm
 
Enterprise Redmine
Enterprise RedmineEnterprise Redmine
Enterprise Redmine
 
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業について
 
runC概要と使い方
runC概要と使い方runC概要と使い方
runC概要と使い方
 
XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!XPagesDay 2014 - What's new in XPages NOW!
XPagesDay 2014 - What's new in XPages NOW!
 
DroidKaigi_devicefarm
DroidKaigi_devicefarmDroidKaigi_devicefarm
DroidKaigi_devicefarm
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
 
OSC 東京 2012春
OSC 東京 2012春OSC 東京 2012春
OSC 東京 2012春
 

Herokuとrails

Hinweis der Redaktion

  1. Preload_app Workerのアプリケーションの先読み