Docker入門 Immutable Infrastructureを実現する

読んだよ。

macでchefのテスト用に使いたいんだけど、 VirtualBox 上ので実行するってなると、実際早いのかな? って疑問が。

やってみろって話っすね。

Amazon Web Services 基礎からのネットワーク&サーバー構築

Amazon Web Services 基礎からのネットワーク&サーバー構築

Amazon Web Services 基礎からのネットワーク&サーバー構築

読みました。

この本は初心者向けですが、 いままでオンプレでやってた経験者が、AWSのサーバを構築するって時にもいいかなと思います。

AWSの全ての機能を網羅していると言うタイプの本ではないですが、 この本を読みながら手を動かせば、いくつかの機能を統合して、 手っ取り早くシステムを作ることが出来ると思います。

最終的には大量にあるAWSのマニュアル群を一読するのが良いと思うのですが、 手っ取り早くやりたいことが出来るようになるには、 一旦ザックリこういう本を読んでシステムを組んでみると良いと思います。

経験者なら、読むだけなら2時間、 更にポチポチ試して、あと2時間位で全部できるんじゃないでしょうか。

AWS未経験者はぜひ試してみてください!

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

後で書く

君に友だちはいらない

君に友だちはいらない

君に友だちはいらない

誕生日プレゼントでもらったこの本を読み終わりました。

要は「同じ目的をもった仲間を作りましょう」って話でした。

たしかに、ダラダラ話すための友達が一杯いても、 飲み会して終わりなので、金がかかるだけです。

なにかを成し遂げるための友達は、一緒に活動を行うことで 研ぎすまされますし、プロジェクトが終ってから何年かぶりにあっても、 なんだか久々に会った感じもしないし、現状を聞いていて楽しいです。

最後の方の著者の燃え上がりっぷりがとても良いので、 是非多くの人に読んでみてほしいです。

vagrantのawsプラグイン入れようとして積んだ

やりたいこと

vagrantでEC2を使ってみたいなと思っていた。

vagrant plugin install vagrant-aws

でインストールしようとしたけど、インストールできなかった。

答え

NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-aws

経緯

先週、vagrantaws立ち上げたくて、諸々いじってたんだけど、

vagrant plugin install vagratn-aws

が通らなくてあきらめてた。こんな感じでnokogiriのインストールエラーね。

Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following patches applied:
        - 0001-Fix-parser-local-buffers-size-problems.patch
        - 0002-Fix-entities-local-buffers-size-problems.patch
        - 0003-Fix-an-error-in-previous-commit.patch
        - 0004-Fix-potential-out-of-bound-access.patch
        - 0005-Detect-excessive-entities-expansion-upon-replacement.patch
        - 0006-Do-not-fetch-external-parsed-entities.patch
        - 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
        - 0008-Improve-handling-of-xmlStopParser.patch
        - 0009-Fix-a-couple-of-return-without-value.patch
        - 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
        - 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxml2.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

However, note that nokogiri does not necessarily support all versions
of libxml2.

For example, libxml2-2.9.0 and higher are currently known to be broken
and thus unsupported by nokogiri, due to compatibility problems and
XPath optimization bugs.
************************************************************************
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.2.1'` succeeds before bundling.

まーいろいろやったんですが、さっぱり上手く行かない。vagrantvagrantでgemも閉じてるから、よくわからないなーっと。

そんで、色々ググると大抵、stackoverflowにあたるわけで、askは見つかったんですが、 まだ、だれも answerしてなくてうろたえて、一旦あきらめて、週末あけてみると、stackoverflowを見たと同僚が教えてくれました。

同僚のブログ

そして、stackoverflow

ちゃんとanswerされてる。すごいなstackoverflow

capistrano + unicornではまった。

以外と語られていないような気がするんだが、railscapistranounicornをつかっていると、思わぬ落とし穴がある。

今まで順調だったcapistranoでのデプロイでunicornの立ち上げが失敗するようになる。 unicornのupgrade(SIGUSR2)がきかなくなった。

upgradeってのは、gracefulなんだけど、

/usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/bundler-1.5.2/lib/bundler/definition.rb:23:in `build': /xxxxxxx/releases/日付的なやつ/Gemfile not found (Bundler::GemfileNotFound)
        from /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/bundler-1.5.2/lib/bundler.rb:152:in `definition'
        from /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/bundler-1.5.2/lib/bundler.rb:115:in `setup'
        from /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/bundler-1.5.2/lib/bundler/setup.rb:17:in `<top (required)>'
        from /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
        from /usr/local/rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

みたいな感じでエラーが出て再起動が出来ない。

解決方法

下記URLのBUNDLE_GEMFILE for Capistrano usersを見ればわかると思います。

capistranoをつかってると、多分、RAILS_ROOT/config/unicorn/production.rb とか作ってると思うんで、そこに、

before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = "/path/to/app/current/Gemfile"
end

を追記してやる unicornの実行直前にRAILS_ROOT/current/GemfileのGemfileを見るように``BUNDLE_GEMFILE```を差し替えてやればいい。

普通、大体配置は同じと思うんで、さらしておくけど、下記のように出来るかなーと。

before_exec do |server|
  ENV["BUNDLE_GEMFILE"] = File.join(File.expand_path("../../../../", __FILE__), "current", "Gemfile")
end

注意してほしいのは、一回この現象が起きちゃった人、もしくは、対応する前の起動設定で起動しちゃった人は、Unicornをstop startして再起動してあげないとだめ。SIGUSR2 では解決できないと思う。

原因

原因としては、僕はcapistranoで5世代まで昔のディレクトリを保存しておくようにしているんだけど、それが、始めにunicornを立ち上げたディレクトリが消されたタイミングで Gemfile が存在しなくなってしまうことにある。

capistarano unicornはこんな感じで、unicornを立ち上げる。

RAILS_ENV=vm BUNDLE_GEMFILE=/xxxxxxx/releases/日付的なやつ/Gemfile bundle exec unicorn -c $UNICORN_CONFIG_PATH -E vm -D

この時点でENV["BUNDLE_GEMFILE"]にはRAILS_ROOT/releases/日付的なやつ/Gemfileが入ってしまうので、これをunicornプロセスが覚え続けてしまう。

そうすると、そのうちSIGUSR2がなげられても、一旦BUNDLE_GEMFILEの方にGemfileを確認してしまうので、既に存在しないGemfileを確認にいってしまう。

そして該当のエラーがでてしまうのだっ! だので対応は、解決方法の所で示した通りだっ!