Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
pixiv/go-thumber に ImageMagickをつなげた話 2017/03/14(Tue) “よや” Go言語 GoImagick ImageMagick
Slide 2
Slide 2 text
はじめに pixiv/go-thumber をネタにした Go言語 と ImageMagick の話 ◦ Pixiv さんの業務と直接関係ない話でごめ んなさい
Slide 3
Slide 3 text
もくじ pixiv/go-thumber について go-thumber + ImageMagick GoImagick について ImageMagick 使用上の注意 画像プロキシ使用上の注意
Slide 4
Slide 4 text
pixiv/go-thumber とは https://github.com/pixiv/go-thumber by Google翻訳
Slide 5
Slide 5 text
go-thumber 資料 by pixiv サムネイルマスタとgo-thumber ◦ https://speakerdeck.com/harukasan/use- thumbnail-master-with-go-thumber
Slide 6
Slide 6 text
go-thumber の使い所 端末によって解像密度が違う (retina とか) ◦ Storage に全サイズの画像を置きたいか? Storage に(大きめの) 画像がひとつあれば User の欲しいサイズ の画像を都度作る
Slide 7
Slide 7 text
go-thumber の構造 go の net/http + swscale(ffmpeg) + libjpeg go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum cgo cgo HTTPプロキシ 縮小/拡大 JPEG入出力
Slide 8
Slide 8 text
go-thumber で物足りないとこ 案件によっては機能が足りない ◦ JPEGのみで、PNG, GIFが使えない ◦ 画像合成とかできない (ロゴとか) ◦ 文字入れできない (著作権表示とか) Gopher
Slide 9
Slide 9 text
go-thumber 改造案 辛い! (YUV とか JPEG 決め打ちの作りなので尚更) go-thumber thumberd go package net/http ffmpeg libswscale thumbnail libjpeg jpeg swscale mkthum png gif libpng giflib libavfilter avfilter cgo cgo cgo cgo cgo 画像合成, 文字入れ 縮小/拡大
Slide 10
Slide 10 text
ImageMagick でOK (1/2) 画像を処理したいメソッドが大体揃っ ている ◦ リサイズ ◦ フィルタ ◦ 画像合成 ◦ 文字入れ Gopher
Slide 11
Slide 11 text
ImageMagick で OK (2/2) メジャーな画像フォーマットからマイ ナーなものまで100種類以上に対応して る http://www.imagemagick.org/script/ formats.php png jpeg gif inline sixel webp svg pdf 超メジャー 最近の キワモノ系 (Webの base64画像と か) ベクター画像 dcm 医療系 (DICOM等) 古いの sun
Slide 12
Slide 12 text
Go で ImageMagick を使うには 公式サイトを見る ◦ http://imagemagick.org/script/api.php#go MagickWand と MagickCore の Go バ インディング ◦ GoImagick はMagickCore の定義を取り入 れるけど、関数は MagickWand だけ使う
Slide 13
Slide 13 text
GoImagick とは https://github.com/gographics/imagick MagickWand API (C言語)の Go バイン ディング (thin ラッパー) ◦ Go 言語で ImageMagick の機能が大体使える
Slide 14
Slide 14 text
go-thumber + ImageMagick GoImagick でつなげる yoya-thumber thumberd go package net/http GoImagick imagick thumbnail ImageMagick MagickWand cgo
Slide 15
Slide 15 text
yoya-thumber https://github.com/smartnews/yoya- thumber Yoya-thumberのOSS公開に寄せて ◦ http://developer.smartnews.com/blog/ 2016/12/19/yoya-thumber/ yoya-thumber と go-thumber ◦ http://blog.awm.jp/2017/01/01/yoya-thumber/
Slide 16
Slide 16 text
動作サンプル go-thumber と同じよ うなパラメータ
Slide 17
Slide 17 text
ImageMagick の注意点 沢山の画像形式に対応しすぎ ◦ 脆弱性が入り易い (マイナーな形式は危険 ◦ 形式を絞る必要がある 処理が重たい ◦ 画像データ全部をメモリ展開する ◦ 文字入れはじめの1回目がめっちゃ重たい
Slide 18
Slide 18 text
ImageMagick security policy Policy.xml で拒否する形式を指定 ◦ ブラックリスト形式でした (過去形) 漏れがあるかも。。 バージョンアップで新しい形式が増え たら?
Slide 19
Slide 19 text
Yoya-thumber では バイナリみて知らない形式を排除 https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L182
Slide 20
Slide 20 text
ImageMagick security policy改良 ◦ ImageMagick 6.9.7-7 で仕様追加 ホワイトリスト形式
Slide 21
Slide 21 text
GIF アニメ辛い ImageMagick は全コマをメモリに展開 するので、すぐメモリ不足になる 仕方ないので、ImageMagick に GIF バ イナリを渡す前に、バイナリを編集し て1コマのGIFアニメにする。
Slide 22
Slide 22 text
GIFアニメは1枚のみ(力づく) https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L232
Slide 23
Slide 23 text
画像 Proxy の注意点 サーバを素のまま晒すと危険 というか、F5 しなくても普通に死ぬ。 thumberd Client F5連打 CPU が死ぬ!
Slide 24
Slide 24 text
Reverse proxy キャッシュを仕込む (F5 耐性) サーバ nginx thumberd reverse proxy 8000 80 80,443 upstream Client
Slide 25
Slide 25 text
更に forward proxy サイズ違いでアクセスし直さない サーバ nginx thumberd reverse proxy nginx forward proxy 8000 80 80,443 3128 upstream Client
Slide 26
Slide 26 text
はじめの一歩が辛い問題 URL 公開した時の①発めは cache が 効かない問題 サーバ nginx thumberd Client 絶賛 処理中 やっぱり CPU が死ぬ!
Slide 27
Slide 27 text
Nginx proxy_cache_lock 処理中の URL アクセスは待たせる! サーバ nginx thumberd Client 絶賛 処理中
Slide 28
Slide 28 text
ImageProxy as A Service 画像プロキシのクラウドサービス ◦ 面倒ならそういうのを使った方が楽 https://www.sakura.ad.jp/services/ imageflux/
Slide 29
Slide 29 text
ImageFlux
Slide 30
Slide 30 text
まとめ go-thumber 改造楽しい GoImagick 結構いいよ Reverse proxy 大事 Nginx proxy_cache_lock すごい ImageFlux みたいなクラウドサービス もあるよ