Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
go-thumber-imagick
yoya
March 14, 2017
Technology
1
110
go-thumber-imagick
Go-Thumber に ImageMagick をつなげた話
yoya
March 14, 2017
Tweet
Share
More Decks by yoya
See All by yoya
resize_nitpick
yoya
1
110
ImageFluxBinary
yoya
2
1.8k
HEIF-kaisetsu
yoya
4
2.5k
chokaizomae
yoya
2
420
wildimagebinary
yoya
1
170
goimagicksyokai
yoya
1
880
GoImagickThumbnail
yoya
0
1k
sushigazou
yoya
0
11k
twitterimgupload
yoya
0
260
Other Decks in Technology
See All in Technology
プロダクトグロースと技術のベースアップを両立させるRettyのアプリ開発スタイル / Achieve Product Growth and Tech Update
imaizume
1
270
msal.jsのあれこれ
takas0522
0
1.4k
AWSの基礎を学ぼうで学んだ9種類のDBを勝手にふりかえる
98lerr
2
710
How We Foster Reliability in Diversity
nari_ex
PRO
8
2.3k
LINEスタンプの実例紹介 小さく始める障害検知・対応・振り返りの 改善プラクティス
line_developers
PRO
3
1.3k
実験!カオスエンジニアリング / How to Chaos Engineering
oracle4engineer
PRO
0
130
Babylon.js v5 新機能の紹介
limes2018
0
990
AWS CLI入門_20220513
suzakiyoshito
0
3.6k
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
0
570
長年運用されてきたモノリシックアプリケーションをコンテナ化しようとするとどんな問題に遭遇するか? / SRE NEXT 2022
nulabinc
PRO
15
7.2k
ZOZOTOWNのProduction Readiness Checklistと信頼性向上の取り組み / Improvement the reliability of ZOZOTOWN with Production Readiness Checklist
akitok_
5
1.4k
Power Query 日時の変換でちょっと焦ったケース +1 / Power Query Some cases
ishiayaya
0
150
Featured
See All Featured
Building Applications with DynamoDB
mza
83
4.6k
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Bootstrapping a Software Product
garrettdimon
295
110k
Robots, Beer and Maslow
schacon
152
7.1k
Designing Experiences People Love
moore
130
22k
Building an army of robots
kneath
299
40k
Three Pipe Problems
jasonvnalue
89
8.6k
Documentation Writing (for coders)
carmenhchung
48
2.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
268
11k
The Illustrated Children's Guide to Kubernetes
chrisshort
14
34k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
212
11k
WebSockets: Embracing the real-time Web
robhawkes
57
5k
Transcript
pixiv/go-thumber に ImageMagickをつなげた話 2017/03/14(Tue) “よや” <yoya@awm.jp> Go言語 GoImagick ImageMagick
はじめに pixiv/go-thumber をネタにした Go言語 と ImageMagick の話 ◦ Pixiv
さんの業務と直接関係ない話でごめ んなさい
もくじ pixiv/go-thumber について go-thumber + ImageMagick GoImagick
について ImageMagick 使用上の注意 画像プロキシ使用上の注意
pixiv/go-thumber とは https://github.com/pixiv/go-thumber by Google翻訳
go-thumber 資料 by pixiv サムネイルマスタとgo-thumber ◦ https://speakerdeck.com/harukasan/use- thumbnail-master-with-go-thumber
go-thumber の使い所 端末によって解像密度が違う (retina とか) ◦ Storage に全サイズの画像を置きたいか? Storage
に(大きめの) 画像がひとつあれば User の欲しいサイズ の画像を都度作る
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入出力
go-thumber で物足りないとこ 案件によっては機能が足りない ◦ JPEGのみで、PNG, GIFが使えない ◦ 画像合成とかできない (ロゴとか)
◦ 文字入れできない (著作権表示とか) Gopher
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 画像合成, 文字入れ 縮小/拡大
ImageMagick でOK (1/2) 画像を処理したいメソッドが大体揃っ ている ◦ リサイズ ◦ フィルタ
◦ 画像合成 ◦ 文字入れ Gopher
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
Go で ImageMagick を使うには 公式サイトを見る ◦ http://imagemagick.org/script/api.php#go MagickWand
と MagickCore の Go バ インディング ◦ GoImagick はMagickCore の定義を取り入 れるけど、関数は MagickWand だけ使う
GoImagick とは https://github.com/gographics/imagick MagickWand API (C言語)の Go バイン
ディング (thin ラッパー) ◦ Go 言語で ImageMagick の機能が大体使える
go-thumber + ImageMagick GoImagick でつなげる yoya-thumber thumberd go package net/http
GoImagick imagick thumbnail ImageMagick MagickWand cgo
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/
動作サンプル go-thumber と同じよ うなパラメータ
ImageMagick の注意点 沢山の画像形式に対応しすぎ ◦ 脆弱性が入り易い (マイナーな形式は危険 ◦ 形式を絞る必要がある
処理が重たい ◦ 画像データ全部をメモリ展開する ◦ 文字入れはじめの1回目がめっちゃ重たい
ImageMagick security policy Policy.xml で拒否する形式を指定 ◦ ブラックリスト形式でした (過去形)
漏れがあるかも。。 バージョンアップで新しい形式が増え たら? <policymap> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern=”GIF" /> </policymnap>
Yoya-thumber では バイナリみて知らない形式を排除 https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L182
ImageMagick security policy改良 ◦ ImageMagick 6.9.7-7 で仕様追加 ホワイトリスト形式 <policymap>
<policy domain=”delegate” rights=“none” pattern=“*” /> <policy domain="coder" rights=”none" pattern=”*" /> <policy domain="coder" rights=”all" pattern=”{PNG,JPEG,GIF,WEBP}" /> </policymnap>
GIF アニメ辛い ImageMagick は全コマをメモリに展開 するので、すぐメモリ不足になる 仕方ないので、ImageMagick に GIF
バ イナリを渡す前に、バイナリを編集し て1コマのGIFアニメにする。
GIFアニメは1枚のみ(力づく) https://github.com/smartnews/yoya-thumber/blob/master/thumbnail/ thumbnail_magick.go#L232
画像 Proxy の注意点 サーバを素のまま晒すと危険 というか、F5 しなくても普通に死ぬ。 thumberd Client
F5連打 CPU が死ぬ!
Reverse proxy キャッシュを仕込む (F5 耐性) サーバ nginx thumberd reverse
proxy 8000 80 80,443 upstream Client
更に forward proxy サイズ違いでアクセスし直さない サーバ nginx thumberd reverse proxy
nginx forward proxy 8000 80 80,443 3128 upstream Client
はじめの一歩が辛い問題 URL 公開した時の①発めは cache が 効かない問題 サーバ nginx thumberd
Client 絶賛 処理中 やっぱり CPU が死ぬ!
Nginx proxy_cache_lock 処理中の URL アクセスは待たせる! サーバ nginx thumberd Client
絶賛 処理中
ImageProxy as A Service 画像プロキシのクラウドサービス ◦ 面倒ならそういうのを使った方が楽 https://www.sakura.ad.jp/services/
imageflux/
ImageFlux
まとめ go-thumber 改造楽しい GoImagick 結構いいよ Reverse proxy
大事 Nginx proxy_cache_lock すごい ImageFlux みたいなクラウドサービス もあるよ