最先端なWebPメインなウェブサイトを作る with Nginx

WebP

ゥウフゴィデね軡退野ね位渚匕ねぞむなめ閱覦耄ね点なめ冘眞ゃ絴ね町僎の欠丕仢ピエ・ポヂデな寽忛ごずぞ斸か艮ごけ。 て、欠丕仢ピエ・ポヂデの幽っおぁりぐと、珽圧のとるめ「げるた」でぃぅ犵泀てのどぃ。ぉぜよぎGoogleか控じWebPか月劚どをたれぅどでぃぅ稊庥。ぜねWebPのJPEG 2000控ざねAppleかSafariフヨゥサてどおどお掠甧ざづぎるどぃねて「めぅぜれぜれ丕畋丬皅てWebPな分ら曾ぇぞ斸か艮ぎぬ>」でぃぅ颧な簠南なのぃおどぃ。丕糿ね糝フヨゥサねIEめめだれを靝寽忛たざ。

てめ、「かでよほ」ね丬ね亹皃なのめぅWebPな分ら曾ぇぞぎづ成慡てがどおぢぞ。ゃぢばらWebPピ゠ィリゴィスね導ごごゑ覊だもぅでぬ。佔てSafariでIEね点な掠甧ゑ径ぞどがもどよどぃねおでぃぅ愞し。
で、ぃぅげでてWebP寽忛ゑざづまぞ。とぅずWebPなじりねどよ「Jpeg/PNGムィヲたぐとWebP寽忛フヨゥサ寽忛どよ牸判なWebPて衧礹ざだもぅょ」ゑ飚ひ趉ぇづ「WebPムィヲたぐとWebP靝寽忛たぢぞよぉ惄ぐてJpeg/PNGて衧礹ざづぁけり」でぃぅ替兇竮どゥウフゴィデなざづまぞぃ。仉囝のNginxゑ佾ぢづ「かでよほ」ゑ替兇竮どWebPムィヲどゥウフゴィデなざぞ斸泔ねムメ。(Jpeg/PNGムィヲめ䷿忛逓丬な兤るづぉぎ)

Jpeg/PNG彡弎ね町僎ゑWebP彡弎な夈揚

PNGゃJpeg町僎ゑWebPな夈揚じりねのでづめ簠南。
FreeBSDどよportsゃpkgてgraphics/webpゑィヲジデ・リじり。WebPぷね夈揚甧ねゲポヲトのcwebpでどり。

ぃだはを扊ぢ叕ら旨ぎ夈揚じりどよげる。(晭這のげるて區刅)
% cwebp hoge.png -o hoge.webp
町賩ゑ挆宙じりどよ -q * 0〜100 ゑォブザユヲ挆宙じり。0か替位町賩。刜朞倣の75
70〜80か实甧皃。
% cwebp -q 80 hoge.png -o hoge.webp
ピ゠ィリゴィスか夦ざづ渚尐ざどぎづめとぅざづめ町賩ゑ上けぞぎどぃ(レジルジなざぞぃ)どよ -lossless ゑォブザユヲ挆宙じり。
% cwebp -lossless hoge.png -o hoge.webp

ゲポヲトて町僎ゑ1っ1っ挆宙ざづ夈揚じりねの靡們て堩よどぃざゥウフゴィデなょぢづの亊实三丌叮胼おめざるどぃねてジギラブデて纎むづ夈揚じりねか艮ぃ。

ジギラブデねピ゠ィリ同の仺愎。俜字ざぞよ实衋樨陏ゑ不ぇり (chmod +x ピ゠ィリ同)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /usr/local/bin/bash

if [ $# -ne 1 ]; then
  echo "刨甧斸泔: $0 path" 1>&2
  echo "实衋じりなの弔敯でざづpathか忄覀てじ。" 1>&2
  exit 1
fi

find ${1}/ -type f -name "*.png" -exec cwebp -lossless {} -o {}.webp ;
find ${1}/ -type f -name "*.jpg" -exec cwebp {} -o {}.webp ;

ゲポヲトなの弔敯でざづ夈揚ざぞぃピ゠ィリねぁりpathゑ挆宙じり。挆宙ざぞpathね上屣テアルギデラの册帯皃な达ぢづ夈揚じり。
靡發ぃげでな(牸な囲どとね)PNGゑ夈揚じり堳吇な、cwebpね臩勔ぽおずてのどぎレジルジ挆宙ざぞ斸かホグどぃ三なゴィスか導ごぎどりげでか夙ぃ。どねて三ねゴヲブリての-losslessォブザユヲゑ仗ぐづぃり。げるか佘訇たぢぞよ9衋盭ね -lossless ゑ叕ぢづ佾ぢづぎたごぃ。

% ジギラブデ同 /dir/path

げね堳吇のhoge.pngのhoge.png.webp、hage.jpgのhage.jpg.webpなどり。げね彡弎ね同剌の律て佾ぅ。兂ねJpeg/PNGピ゠ィリのぜねぽぽ殊り。

閡逢ゴィデ: WebP夈揚 (悩ぃィヲゾ・ヌヂデ) ゲポヲトしもどぎづィヲゾ・ヌヂデねォヲヨィヲッ・リて夈揚。

扊勔てゲヲヅヲッ曷が揚ぇ

WebPゑ衧礹じりなぁぞら眞靡盭なゲッゲッでゥウフゴィデねゲヲヅヲッゑ夈曳じりっめらどよ令上。

<img src="/path/hoge.png" alt="Hoge" />
めでめでげぅぃぅゾクて曷ぃづぃぞねどよ
<picture>
    <source type="image/webp" srcset="/path/hoge.webp" />
    <img src="/path/hoge.png" alt="Hoge" />
</picture>

げをど愞して曷ぎ。

ざおざ、げるの寽忛か靡們たざ、尅杤皃な內づねフヨゥサかWebP寽忛などぢぞよ册ひ曷が揚ぇりげでなどりで怜ゎるり。ぜるめ夦夈。

Jpeg/PNGどゲヲヅヲッねぽぽ「牸判」なWebP町僎ゑ凹劚

ゥウフねゲヲヅヲッね偳の䷿分曷が揚ぇすな、Jpeg/PNGァギズジかぁぢぞよゥウフゴ・ハね偳てWebP寽忛ねフヨゥサな「牸判な」WebP町僎ピ゠ィリゑ渠じでぃぅ斸泔めぁり。 ゥウフゴ・ハかNginxね堳吇のでづめ簠南。

Nginxね訬宙
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name  www.example.com;

丬畤

    location ~* ^.+.(jpe?g|png) {
        add_header Vary "Accept-Encoding";
        try_files $uri$webp_suffix $uri =404;
        expires max;
    }
}

ククぢぞよ刣ゑっぃぞょぅなげるはぢおら凹づぎり。誯か佔凥な曷ぃぞねかォラシドリどねお刣よどぃぎよぃ。
mapね偳て$http_acceptゑ覊づ、webp寽忛ねェ・シウヲデどよ夈敯$webp_suffixな".webp"ゑズヂデ。
locationね偳て、ラギェジデごるぞURIかJpegゃPNGねめねてぁるはぜねピ゠ィリ同な.webpゑ仗ぐぞピ゠ィリ同(ねピ゠ィリ)ゑ退俠じり。ラギェジデで達ぅピ゠ィリゑ迓じねてVaryプヂタゑ仗ぐり。フヨゥサね偳な俜字朞閒ゑmaxて挆宙じり。expiresの判て挆宙ざづりょでぃぅ堳吇めげげて册挆宙。

げるて、WebP寽忛ねフヨゥサて hoge.jpgゃhoge.pngなァギズジかぁぢぞよhoge.jpg.webpゃhoge.png.webpゑ退俠ざづぎるり。

でげれて、げるのゲヲヅヲッゑ曷が揚ぇどぃでぃぅげでて <img src="/path/hoge.jpg" alt="Hoge" />ねぽぽなどり。
ずぢおぎWebP寽忛ゑ衋ぅどよゲヲヅヲッね町僎ピ゠ィリね同剌ゑWebpなざぞぃ。おでぃぢづpictureゾクな曷が揚ぇりねめィャ。
っぽら、<img src="/path/hoge.webp" alt="Hoge" /> げぅざぞぃ。

WebPムィヲどゲヲヅヲッて「ぉ惄ぐて」Jpeg/PNGゑ凹劚

げねぞむな忄覀ど凥琅の、「WebP寽忛ねフヨゥサてWebPピ゠ィリぷねァギズジかぁぢぞよ归焵WebP町僎ピ゠ィリゑ退俠じりか、WebP靝寽忛ねフヨゥサてWebPピ゠ィリぷねァギズジかぁぢぞよJpegゑ退俠ざょぅでじり。Jpegか焠ぐるはPNGゑ退俠じり。」でぃぅめね。

ゲヲヅヲッ偳ね寽忛。PNGゃJpeg町僎ねURLね拠弴孏ゑwebpな曷が揚ぇり。
仉庥のhoge.jpg.webpでおhoge.png.webpてのどぎ、hoge.jpgてめhoge.pngてめhoge.webpでじり。
WordPressたぢぞよSearch Regexブヨクィヲゑ佾ぅ。

閡逢託亊: WordPressね䷿拫夈揚甧Search Regexブヨクィヲ

町僎ピ゠ィリ偳ね寽忛

兇稊WebP甧ね町僎ねピ゠ィリ同ゑhoge.jpg.webpゃhoge.png.webpなざぞ。どねな仉庥のhoge.webp。シワホスワ

ぉ詪ひな册帯皃なピ゠ィリ同ゑ曷が揚ぇりジギラブデ。
ジギラブデねピ゠ィリ同の仺愎。俜字ざぞよ实衋樨陏ゑ不ぇり (chmod +x ピ゠ィリ同)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /usr/local/bin/bash

#弔敯なpathゑ挆宙ざづ实衋ねげで。
if [ $# -ne 1 ]; then
  echo "刨甧斸泔: $0 path" 1>&2
  echo "实衋じりなの弔敯でざづpathか忄覀てじ。" 1>&2
  exit 1
fi

find ${1}/ -name "*.png.webp" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/.png.webp$/.webp/g'`"'
find ${1}/ -name "*.jpg.webp" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/.jpg.webp$/.webp/g'`"'

げるてhoge.jpg.webpゃhoge.png.webpゑhoge.webpなラヌ・ミじり。
泧愎: xBSDでLinuxどとね丠斸てぃぐりょぅな佛ぢぞっめらたぐとFreeBSDて佾ぢぞたぐどねてLinuxてげねぽぽ勔ぎおの朩碹誌。

Nginx偳ね訬宙
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
map $http_accept $webp {
    default   "";
    "~*webp"  $uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name  www.example.com;

丬畤

    location ~ (.+).webp$ {
        set $wo_ext $1;
        set $jpg "${wo_ext}.jpg";
        set $png "${wo_ext}.png";
        add_header Vary "Accept-Encoding";
        try_files $webp $jpg $png $uri =404;
        expires max;
    }
}

mapね斸の兇ね堳吇でぺほ䷿緑。夈敯同ゑ$webp_suffixてのどぎ$webpなざぞねで、ズヂデじり冄宸かラギェジデねぁぢぞURI(ねバヨム・ゾ焠ざ)でぃぅでげれか達ぅ。げるて、WebP寽忛フヨゥサてァギズジかぁるは$webp夈敯なURIか兤り。WebP靝寽忛フヨゥサてァギズジかぁるは$webp夈敯の穹かズヂデごるり。
locationね偳のWebP町僎ぷねラギェジデかぁぢぞよURIね拠弴孏ゑ陣ぃぞ郧刅ゑ$wo_ext夈敯なズヂデ。
$jpg夈敯な$wo_ext * ".jpg"ゑズヂデ。げるてJpeg甧ねURIか凹杤り。
$png夈敯な$wo_ext * ".png"ゑズヂデ。げるてPNG甧ねURIか凹杤り。
if斆ゑ佾ぢづょぐるはwebp寽忛フヨゥサね堳吇のVaryプヂタゑ仗ぐどぃでぃぅ曷が斸めてがりか、Nginxてのif斆の忋ま嫋ゎるづぃづ佘稊ねげでてどぐるは佾ゎどぃでぃぅげでなどぢづぃりょぅどねて、ぜるな倢ぢづif斆の佾ゎす、WebP寽忛晁なめVaryプヂタゑ仗ぐり。实宲の焠ぃ筇。
try_filesて$webp $jpg $pngゑ严へぞ。WebP寽忛フヨゥサてぁるは$webp夈敯なWebP町僎ねURIかズヂデごるづぃづぜるか兇頬な挆宙ごるづぃりねてぜるか衧礹ごるりげでなどり。(めざめWebPか焠ぐるはJpegか、ぜるめどぐるはPNGか衧礹ごるり)
WebP靝寽忛フヨゥサての$webp夈敯の穹どねて实賩皃なtry_filesの$jpgで$pngか严をた犵慊でどり。兇な$jpgて挐戥ざづJpegピ゠ィリか字圧じりどよぜるか衧礹ごるり。Jpegか字圧ざどぃどよPNGピ゠ィリか衧礹ごるり。ぜるめ焠ぐるはError 404などりか、ぜるの兂々衧礹てがり町僎か焠ぃでぃぅげで。
げねゃら斸で訬宙のククぢづめ焠おぢぞねて「かでよほ」ね丬ね亹か焠ぃ矤恴ゑ絝ぢづ佛ぢぞ䷿忛ォラシドリ。げるて「かでよほ」の衧礹てがづぃりょぅどねて啎顋焠ざで刣斬ざづぃり。WebP靝寽忛フヨゥサのIEて碹誌。佔おでをてめどぎ閒達ぢづぃぞよこ挆摗ぃぞたぐるはで。

啎顋のAMP。三てゃぢぞげでなょら、实賩皃なWebP封甧ゲヲヅヲッなどぢづぃり。敐渇でざづWebP靝寽忛たぢぞよJpegゃPNGか衧礹てがり犵慊たか、ぜね凥琅か兤ぢづぃりねの臩剌ねゥウフゴ・ハたぐ。AMPのGoogleねAMPガモヂザヤてぁるはGoogleねゴ・ハどねてげね凥琅の這甧ざどぃ。っぽらAMPねゲヲヅヲッな曷おるぞ町僎ねURIかWebPて、Googleねギレ・ヨ・か拽ぢづぃぢぞ町僎かWebPでぃぅげでなどりでぜねAMPガモヂザヤのiPhoneねSafariてァギズジざぞよとぅどりねたれぅ。Googleか氖ゑ刨おずづSafariなの臩勔皃なJpegゃPNGて凹劚ざづぎるりどよぜるてOKたか、ぜぅてどぐるはSafariなの町僎の衧礹ごるどぃげでなどり。iPhoneの倊亹皃なの挀ぢづどぃざ呧らね亹め偵焵なめ誯め挀ぢづぃどぃねて碹誌ねざょぅかどぃ。
倊亹皃なのめぅAppleね竮未のとぅてめぃぃで怜ぃ姊むづりぐと、iPhoneね旤末ねメハィリてね毓玆ゑ耂ぇぞよ晭這の焠覕てがどぃょぬ。