railsでRMagickを使うとサーバーが落ちる問題
やっとこさ止まっていたrails案件が動きだした
そこで、rails で rmagick を使おうと思ったらハマったのでメモ。
以前、rmagick を使った簡単なサンプルは作ってあった。
require "RMagick"; img = Magick::ImageList.new("sample.png"); md = Magick::Draw.new; md.annotate( img, 0, 0, 0, 50, "hello rmagick") do md.fill = "white"; md.stroke = "red" md.pointsize = 30; md.font = font; end img.write("generate/generate.png");
これは sample.png を読み込んで ( x=0,y=50 ) から hello magick を描く サンプル
これは問題なく動いていた。
ただ、rails から rmagick を使うとサーバーが落ちるという問題に面してしまった。
コードはこんな感じ。
require 'RMagick' class ImageController < ApplicationController def generate_sample @text = params[:text] @text ||= 'hello' content = File.read("#{Rails.root}/app/assets/images/sample.png") img = Magick::Image.from_blob(content).shift md = Magick::Draw.new md.annotate( img, 0, 0, 0, 50, @text ) do md.fill = "white" md.stroke = "red" md.pointsize = 30 end img.write("#{Rails.root}/app/assets/images/sample/sample.png") end end
こんな感じで。 描画の文字をパラメータで渡して描画してくれる 簡単さサンプル。
が、rails s で起動してURLにアクセスすると
RMagick.rb:1635: [BUG] Segmentation fault
こんな感じのエラーが出てサーバーが落ちる。 色々調べてるとここにいきついた。
結論から言うと
ImageMagick をインストールするときに
--disable-openmp
オプションをつけてインストールするといいみたい。 homebrew でインストールし直して、gem も入れなおしたら上手くいった。