Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

go-thumber-imagick

Go thumber に ImageMagick をつなげた話

  • Login to see the comments

go-thumber-imagick

  1. 1. pixiv/go-thumber に ImageMagickをつなげた話 2017/03/14(Tue) “よや” <yoya@awm.jp> Go言語 GoImagic k ImageMagi ck
  2. 2. はじめに  pixiv/go-thumber をネタにした ImageMagick の話 ◦ pixiv さんの業務でも画像処理ズバリでも なくてごめんなさい
  3. 3. もくじ  pixiv/go-thumber について  go-thumber + ImageMagick  GoImagick について  ImageMagick 使用上の注意  画像プロキシ使用上の注意
  4. 4. pixiv/go-thumber とは  https://github.com/pixiv/go-thumber by Google翻訳
  5. 5. go-thumber 資料 by pixiv  サムネイルマスタとgo-thumber ◦ https://speakerdeck.com/harukasan/use- thumbnail-master-with-go-thumber
  6. 6. go-thumber の使い所  端末によって解像密度が違う (retina とか) ◦ Storage に全サイズの画像を置きたい か? Storage に(大きめの) 画像がひとつあれば User の欲しいサイズ の画像を都度作る
  7. 7. go-thumber の構造  go の net/http + swscale(ffmpeg) + libjpeg go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpeg jpegswscale mkthum cgo cgo HTTPプロキシ 縮小/拡大 JPEG入出力
  8. 8. go-thumber 物足りないとこ  案件によっては機能が足りない ◦ JPEGのみで、PNG, GIF とか使えない ◦ 画像合成とかできない (ロゴとか) ◦ 文字入れできない (著作権表示とか) Gopher
  9. 9. go-thumber 改造案  辛い! (YUV とか JPEG 決め打ちの作りなので尚更) go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpegjpeg swscale mkthum png gif libpng giflib libavfilter avfilter cgo cgo cgo cgo cgo 画像合成, 文字入れ縮小/拡大
  10. 10. ImageMagick でよくない? (1/2)  画像を処理したいメソッドが大体揃っ ている ◦ リサイズ ◦ フィルタ ◦ 画像合成 ◦ 文字入れ Gopher
  11. 11. ImageMagick でよくない? (2/2)  メジャーな画像フォーマットからマイ ナーなものまで100種類以上に対応して る  http://www.imagemagick.org/script/forma ts.php png jpeg gif inline sixe l webp svg pdf 超メジャー 最近の キワモノ系 (Webの base64画像と か) ベクター画像 dcm 医療系 (DICOM等) 古いの sun
  12. 12. Go で ImageMagick を使う  公式サイトで調べる ◦ http://imagemagick.org/script/api.php#go  MagickWand と MagickCore の Go バインディング ◦ GoImagick はMagickCore の定義を取り入 れるけど、関数は MagickWand だけ使う
  13. 13. GoImagick とは  https://github.com/gographics/imagick  MagickWand API (C言語)の Go バイン ディング (thin ラッパー) ◦ Go 言語で ImageMagick の機能が大体使える
  14. 14. GoImagick セッティング (MacOS) (1/2)  少し前まで master  今のやり方 $ sudo port install ImageMagick # ImageMagick v6.8.9-9以降 $ go get gopkg.in/gographics/imagick.v2/imagick $ sudo port install ImageMagick # 古いやり方 $ go get github.com/gographics/imagick 以下のエラーが出る expects import "gopkg.in/gographics/imagick.v2/imagick”
  15. 15. GoImagick セッティング (MacOS) (2/2)  ImageMagick を brew と ports 両方とも入 れてる場合  pkg-config の実行パスを変えればOK $ PATH=/opt/local/bin:$PATH go install gopkg.in/gographics/imagick.v2/imagick /* #cgo !no_pkgconfig pkg-config: MagickWand MagickCore */ import "C" リンク先は pkgconfig コマンドで決める
  16. 16. GoImagick の使い方  例えば、640x480 にリサイズする ( _ = 〜はエラーの値。本来はチェックするべき) package main import ( "gopkg.in/gographics/imagick.v2/imagick” ) func main() { imagick.Initialize() defer imagick.Terminate() mw := imagick.NewMagickWand() _ = mw.ReadImage(”input.png”) _ = mw.ResizeImage(640, 480, imagick.FILTER_UNDEFINED, 1) _ = mw.WriteImage("output.png") }
  17. 17. go-thumber + ImageMagick GoImagick でつなげる yoya-thumber thumberd go package net/http GoImagick imagick thumbnail ImageMagick MagickWand cgo
  18. 18. yoya-thumber  https://github.com/smartnews/yoya- thumber  yoya-thumberのOSS公開に寄せて ◦ http://developer.smartnews.com/blog/201 6/12/19/yoya-thumber/  yoya-thumber と go-thumber ◦ http://blog.awm.jp/2017/01/01/yoya- thumber/
  19. 19. 動作サンプル go-thumber と同じ ようなパラメータ
  20. 20. ImageMagick の注意点  沢山の画像形式に対応しすぎ ◦ 脆弱性が入り易い (マイナーな形式は危険 ◦ 形式を絞る必要がある  処理が重たい ◦ 画像データ全部をメモリ展開する ◦ 文字入れはじめの1回目がめっちゃ重たい
  21. 21. ImageMagick security policy  policy.xml で拒否する形式を指定 ◦ ブラックリスト形式でした (過去形)  漏れがあるかも。。  バージョンアップで新しい形式が増えた ら? <policymap> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern=”GIF" /> </policymnap>
  22. 22. Yoya-thumber では  バイナリを見て最低限の形式だけ受理 https://github.com/smartnews/yoya- thumber/blob/master/thumbnail/thumbnail_magick.go#L182
  23. 23. ImageMagick security policy 改良 ◦ ImageMagick 6.9.7-7 で仕様追加  ホワイトリスト形式 ◦ (参考URL) ImageMagick 6.9.7-7 から policy の挙動が変わりました  http://blog.awm.jp/2017/02/09/imagemagick/ <policymap> <policy domain=”delegate” rights=“none” pattern=“*” /> <policy domain="coder" rights=”none" pattern=”*" /> <policy domain="coder" rights=”all" pattern=”{PNG,JPEG,GIF,WEBP}" /> </policymnap>
  24. 24. 小ネタ (ChangeLog) 1/2  ChangeLog に無いのでツッコミした https://github.com/ImageMagick/ImageMagick/issues/377
  25. 25. 小ネタ (ChangeLog) 2/2  入れてくれました
  26. 26. GIF アニメ辛い  ImageMagick は全コマをメモリに展 開する ◦ すぐメモリ不足になる  妥協で、ImageMagick に GIF バイナ リを渡す前に、バイナリを編集して1 コマのGIFアニメにする。
  27. 27. GIFアニメは1枚のみ(力づく) https://github.com/smartnews/yoya- thumber/blob/master/thumbnail/thumbnail_magick.go#L232
  28. 28. 画像 Proxy の注意点  サーバを素のまま晒すと危険  というか、F5 しなくても普通に死ぬ。 thumberd Client F5連打 CPU が死ぬ!
  29. 29. Reverse proxy  キャッシュを仕込む (F5 耐性) サーバ nginx thumberd reverse proxy 8000 80 80,443 upstream Client
  30. 30. 更に forward proxy  サイズ違いでアクセスし直さない サーバ nginx thumberd reverse proxy nginx forward proxy 8000 80 80,443 3128 upstream Client
  31. 31. はじめの一歩が辛い問題  URL 公開した時の①発めは cache が 効かない問題 サーバnginx thumberdClient 絶賛 処理中 やっぱり CPU が死ぬ!
  32. 32. Nginx proxy_cache_lock  処理中の URL アクセスは待たせる! サーバnginx thumberdClient 絶賛 処理中
  33. 33. ImageProxy as A Service  画像プロキシのクラウドサービス ◦ 面倒ならそういうのを使った方が楽  https://www.sakura.ad.jp/services/ima geflux/
  34. 34. ImageFlux 設定画面で origin 指定するだけ
  35. 35. まとめ  go-thumber 改造楽しい  GoImagick 結構いいよ  Reverse proxy 大事 ◦ Nginx proxy_cache_lock すごい  ImageFlux みたいなクラウドサービスも あるよ  GoConf2017Spring で、もっと細部を話 すので、興味のある方はお待ちしてます。

×