Slide 1

Slide 1 text

'6+*.*ͷ'BTUMZ׆༻ࣄྫू

Slide 2

Slide 2 text

++ -FBE8FCBOE&EHF&OHJOFFS 5XJUUFS!LPOPKVOZB (JU)VC!LPOPKVOZB [FOOEFW!KK ࣗݾ঺հ

Slide 3

Slide 3 text

#VTJOFTTʷ'6+*.*

Slide 4

Slide 4 text

'6+*.*͸໿໰ͷ8ඒ༰෼ੳ͔Β ύʔιφϥΠζ͢ΔϏϡʔςΟʔϒϥϯυͰ͢ɻ '6+*.*ͷࣄۀ঺հ ถࠃISNFαϓϦϝϯτΞυόΠβʔࢿ֨Λ࣋ͪɺ ػೳੑදࣔ৯඼ݕఆڠձͷཧࣄΛ຿ΊΔαϓϦϝϯτͷઐ໳ՈΛ ΞυόΠβʔͱܴͯ͑͠ɺFUJIMIಠࣗͷඒ༰෼ੳΛ։ൃɺ࣮ݱɻ 2019೥3݄ͷαϓϦϝϯτϦϦʔεޙɺ໿40ສਓͷ෼ੳ৘ใΛ΋ͱʹ 2020೥3݄ʹඒ༰෼ੳΛΞοϓσʔτɻ

Slide 5

Slide 5 text

'6+*.*͸໿໰ͷ8ඒ༰෼ੳ͔Β ύʔιφϥΠζ͢ΔϏϡʔςΟʔϒϥϯυͰ͢ɻ '6+*.*ͷࣄۀ঺հ

Slide 6

Slide 6 text

5FDIOPMPHZʷ'6+*.*

Slide 7

Slide 7 text

1SPHSFTTJWF3FMFBTF -1ͷϦμΠϨΫτXJUI$!& 1SFWJFX؀ڥ "HFOEB

Slide 8

Slide 8 text

1SPHSFTTJWF3FMFBTF

Slide 9

Slide 9 text

'BTUMZʷ'6+*.* #SPXTFS

Slide 10

Slide 10 text

'BTUMZʷ'6+*.* if(req.url.path ~ “^/xxx”) { set req.backend = Origin2; } YYYʹର͢ΔϦΫΤετʹରͯ͠$MPVE3VOΛPSJHJOͱ͢Δ

Slide 11

Slide 11 text

'BTUMZʷ'6+*.* ஈ֊తʹҠߦ͢ΔͨΊʹ7$-Λੜ੒͢Δ ʷ

Slide 12

Slide 12 text

'BTUMZʷ'6+*.* #SPXTFS $VTUPN7$- ஈ֊తʹҠߦ

Slide 13

Slide 13 text

'BTUMZʷ'6+*.* *NBHF0QUJNJ[FS τοϓϖʔδͰݕূ -B[ZMPBE༗Γͷϖʔδ'7ಡΈࠐΈ࣌఺ͰɺL#ͷ࡟ݮ -BSHFTU$POUFOUGVM1BJOU͸TͷύϑΥʔϚϯε޲্ if(req.url.ext ~ “(?i)^(gif|png|jpe?g)$”) { set req.url = req.url.path “?auto=webp”; set req.http.Cache-Control = “public, max-age=…”; set req.http.Surrogate-Key = “image”; }

Slide 14

Slide 14 text

'BTUMZʷ'6+*.* *NBHF0QUJNJ[FS if(req.url.ext ~ “(?i)^(gif|png|jpe?g)$”) { if(req.http.Save-Data) { set req.url = req.url.path “?quality=440”; } } 'BTUMZ*NBHF0QUJNJ[FSΛ࢖͏ར఺ ($1ͳͲʹରͯ͠BTTFUTΛEFQMPZͤͣʹ͢Ή ্هͷΑ͏ʹIUUQGJFMEͰ෼ذΛ͢Δ͜ͱ͕Ͱ͖Δ 4VSSPHBUF,FZʹΑΔDBDIFͷΠϯελϯτύʔδ͕ߦ͑Δ

Slide 15

Slide 15 text

-1ͷϦμΠϨΫτXJUI$!&

Slide 16

Slide 16 text

$PNQVUF!&EHFʷ'6+*.* IUUQTQSGVKJNJNFYYY ޿ࠂ༻ͷϥϯσΟϯάϖʔδ GVKJNJNFͰ഑৴͍ͨ͠ʜ ·͔͢͡🤔 ϦμΠϨΫτͲ͏͠Α͏͔ͳʜ -1ͷϦμΠϨΫτXJUI$!&

Slide 17

Slide 17 text

$PNQVUF!&EHFʷ'6+*.* -1ͷϦμΠϨΫτXJUI$!& GET /pt101 HTTP/2 Host: pr.fujimi.me HTTP/2 308 Location: https://fujimi.me/lp/protein 3FRVFTU 3FTQPOTF let path = req.get_path(); let path = match path { path if path.contains(“pt”) => “/protein”, _ => path, }; Ok(Response::from_status(StatusCode::PERMANENT_REDIRECT).with_header( header::LOCATION, format!(“https://fujimi.me/lp{}”, path), )) src/main.rs

Slide 18

Slide 18 text

1SFWJFX؀ڥ

Slide 19

Slide 19 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ a͜ͷλεΫΑΖͽ aঝ஌ʂʂ 1. %FW a֬ೝ͠·͢ʂʂ aͰ͖ͨʂ 1. %FW 8SJLFΛ࢖ͬͯ λεΫΛνέοτ؅ཧ νέοτͱ13͕΄΅

Slide 20

Slide 20 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ a֬ೝ͠·͢ʂʂ aͰ͖ͨʂ 1. %FW 1VMM3FRVFTUΛϚʔδ 1.͕֬ೝ͢ΔͨΊʹ 13ΛNBJOCSBODIʹϚʔδ͠ͳ͍ͱ͍͚ͳ͍ʜ ໰୊఺ 1.͕ϨϏϡʔͯ͠μϝͩͬͨ৔߹ɺSFWFSUPSमਖ਼13Λ͋͛ͳ͍ͱ͍͚ͳ͍ ະ׬੒ͳ΋ͷΛNBJOCSBODI΁Ϛʔδ͠ͳ͚Ε͹ͳΒͳ͍

Slide 21

Slide 21 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ ֤1VMM3FRVFTUʹԠͯ͡αʔόʔ্ཱ͕͕ͪΕ͹ NBJOCSBODIʹϚʔδ͢Δඞཁ͕ͳ͍ʂʂʂ a1SFWJFX؀ڥര஀

Slide 22

Slide 22 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ QSQSFWJFXFYBNQMFDPN QSEFWYYYDMPVEBSVOBQQ

Slide 23

Slide 23 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ if host == “preview.example.com" { return response_preview_list_app(); } src/main.rs

Slide 24

Slide 24 text

$PNQVUF!&EHFʷ'6+*.* 1SFWJFX؀ڥ ஫ҙ఺ 1VSHF63-͸ଘࡏ͠ͳ͍ QSFYBNQMFDPNͷΑ͏ʹಛఆͷ)PTU͸ࢦఆͰ͖ͳ͍ 4VSSPHBUF,FZΛઃఆͯ͠ύʔδͰ͖ΔΑ͏ʹ͢Δʂ

Slide 25

Slide 25 text

$BTF4UVEZʹܝࡌ͞Ε·ͨ͠🎉 ࠓ೔ͷ͓࿩ͷҰ෦ΛΑΓৄ͓͘͠࿩͍ͯ͠ΔͷΛ $BTF4UVEZʹܝࡌ͍͍ͯͨͩͨ͠ͷͰੋඇΈ͍ͯͩ͘͞ʂ ˜'BTUMZ *OD"MM3JHIUT3FTFSWFE 'BTUMZ ͷ $%/ͱ$PNQVUF!&EHFͰ '6+*.*ެࣜαΠτΛڧԽ ςϨϏ$.Ͱ໿ഒʹ૿͑ͨΞΫηεʹ ઃఆมߋͳ͠ͰରԠ ඒ༰෼ੳ͔Βͭ͘Δ͋ͳͨͷͨΊͷύʔιφϥΠζϏϡʔςΟϒϥϯυͰ͋Δ'6+*.*Λ த৺ʹࣄۀΛల։͢ΔτϦίגࣜձࣾïҎԼɺτϦίðɻެࣜαΠτͰ͋ΔGVKJNJNFʹɺ 'BTUMZͷ$%/ɺΠϝʔδΦϓςΟϚΠβʔɺ͓Αͼ$PNQVUF!&EHFΛ࠾༻ɻ Ωϟογϡͷώοτ཰ˋҎ্ɺΩϟογϡΧόϨοδˋΛ࣮ݱ͢Δͱͱ΋ʹɺ ςϨϏ $.ͷެ։ʹΑΔഒҎ্ͷΞΫηεͷ֦େʹ΋αʔόʔ؀ڥͷઃఆΛมߋ͢Δ͜ͱͳ͘ ରԠͰ͖Δ࢓૊ΈΛ࣮ݱͨ͠ɻ 'BTUMZτϦίגࣜձࣾ $"4&456%: ໊ࣾāτϦίגࣜձࣾ ॅॴā˟ ɹɹɹ ౦ژ౎৽॓۠৽॓େڮޚԓϏϧ' 63-ɿIUUQTUSJDPUJODDPN ೥݄ʹઃཱɻඒ༰෼ੳʹΑΓύʔιφϥΠζ͞Εͨα ϓϦϝϯτɺϓϩςΠϯɺϑΣΠεϚεΫΛఏڙ͢ΔϏϡʔ ςΟϒϥϯυʮ'6+*.*ʯͷࣄۀΛల։ɻ ೥݄ʹ͸ɺ ϧϛω৽॓ళʹॳͷৗઃళΛΦʔϓϯͨ͠ɻ ໊ࣾʹ͸ɺ͓٬༷ʹѪ͞ΕΔϓϩμΫτΛ૑Γɺເதʹͳͬ ͯ΄͍͠ͱ͍͏ʮྂʯͱɺ͓٬༷ͷ੠ΛͭͻͱͭஸೡʹฤΈ ্͛ɺਓʹدΓఴͬͨϓϩμΫτΛ૑Δͱ͍͏ϑϥϯεޠͷ ʮUSJDPUʢฤΈ෺ʣʯ ͷͭͷ૝͍͕ࠐΊΒΕ͍ͯΔɻ w $%/ ಋೖͱ 3JPUKT ͔Β /FYUKT ΁ͷҠߦͷ ͭΛ໨తʹ 'BTUMZ Λ࠾༻ ɹʮࢲΒ͍͠ඒ͠͞ͰɺࢲΛ΋ͬͱ޷͖ʹͳΔ⼧ͱ͍͏ϛογϣϯʹج͖ͮӡӦ͢Δ '6+*.* GVKJNJNF ͸Ŋ໿ʙ໰ͷඒ༰ʹؔ͢Δઃ໰ʹ౴͑Δ͜ͱͰɺͦͷ෼ੳ ݁Ռ͔ΒύʔιφϥΠζ͞ΕͨΦϦδφϧͷαϓϦϝϯτ΍ϑΣΠεϚεΫɺϓ ϩςΠϯΛߪೖͰ͖ΔެࣜαΠτͰ͋Δɻओʹʙ୅ͷঁੑʹࢧ࣋͞ΕɺΞΫ ςΟϒϢʔβʔ਺͸ສϢʔβʔҎ্ɻ௚ۙΧ݄ͷϖʔδϏϡʔï 17 ðͷฏۉ ͸ɺສ17Λ௒͍͑ͯΔɻ ɹ౰ॳɺGVKJNFNF Ͱ͸ίϯςϯπ഑৴ωοτϫʔΫ $%/ ͕ಋೖ͞Ε͍ͯͳ͔ͬ ͨɻ͔͠͠ɺ೥݄ʹλϨϯτΛى༻ͨ͠ςϨϏ$. ͷެ։͕ܾ·ͬͨ͜ͱ͔ Βɺ$%/ͳ͠ͷ··ςϨϏ$.Λެ։͢Δ͜ͱ͸ɺαʔόʔͷෛՙ૿େʹΑΔγες ϜఀࢭͷϦεΫ͕ߴ͔ͬͨɻ·ͨɺςϨϏ$.ͷެ։௚લͷ೥݄ʹ৽੡඼Ͱ͋ ΔϓϩςΠϯΛϦϦʔε͍͕ͯͨ͠ɺٕज़తͳ໰୊͔Β$%/ͷಋೖ͕ඞཁͩͬͨɻ ɹ-FBE 8FC &OHJOFFS ͷՏ໺७໵ࢯ͸ɺ⼦αϓϦϝϯτͱϑΣΠεϚεΫͷΞϓϦ έʔγϣϯ͸ɺ3JPUKT ͱ͍͏গ͠ݹ͍ +BWB4DSJQU ͷϑϨʔϜϫʔΫͰ࣮૷͞Ε ͍ͯͨͷͰ͕͢ɺ ॊೈͳઃܭʹͳ͍ͬͯͳ͍ͨΊɺͦ͜ʹϓϩςΠϯͷ৽نϓϥο τϑΥʔϜΛ௥Ճ͢Δͷ͸։ൃମݧ͕Α͘ͳ͍ͱߟ͑·ͨ͠ɻͦ͜Ͱ /FYUKT ͱ 5ZQF4DSJQUʹΑΔΞϓϦέʔγϣϯ։ൃʹҠߦ͍ͨ͠ͱࢥ͍ͬͯ·ͨ͠ʯͱ࿩͢ɻ ɹαϓϦϝϯτͱϑΣΠεϚεΫͷΞϓϦέʔγϣϯΛ 3JPUKT ͔Β /FYUKTʹҰ ؾʹॻ͖׵͑Δͱ։ൃͱ2" ඼࣭อূ ʹ޻਺͕͔͔ͬͯ͠·͏ɻ ͦ͜Ͱɺผͷαʔ όʔͰϓϩςΠϯͷΞϓϦέʔγϣϯΛ։ൃ͠ͳ͕ΒɺGVKJNJNF͔ΒΞΫηεͰ ͖ΔΑ͏ʹ͢Δ͜ͱ͕ඞཁͩͬͨɻՏ໺ࢯ͸ɺ ⼦'BTUMZ Ͱ͋Ε͹ɺ7$- 7BSOJTI $POpHVSBUJPO -BOHVBHF Λ࢖͏͜ͱͰɺ ͜ΕΛ࣮ݱͰ͖Δͱߟ͑·ͨ͠ʯ ͱ࿩͢ɻ ɹݕ౼ͷ݁Ռɺ೥݄ʹ 'BTUMZ ͷ࠾༻Λܾఆɻ࠾༻ͷཧ༝ΛՏ໺ࢯ͸ɺʮલ ৬Ͱ 'BTUMZ Λ࢖ͬͨ͜ͱ͕͋ΔͷͰ͕͢ɺ'BTUMZ ͷڧΈͰ͋Δ 7$- Λར༻ͨ͠ ॊೈͳઃܭ͕Մೳͳ͜ͱΛධՁ͠·ͨ͠ɻ·ͨɺ৽͍͠ΞϓϦέʔγϣϯΛϦϦʔε ͨ͠ͱ͖ʹɺΩϟογϡΛύʔδ͠ͳ͚Ε͹ͳΒͳ͍ͷͰ͕͢ɺ'BTUMZ Ͱ͋Ε͹Π ϯελϯτύʔδͰߴ଎ʹΩϟογϡΛύʔδͰ͖Δ͜ͱ΋࠾༻ΛܾΊͨཧ༝ͷͭ Ͱͨ͠ʯͱ࿩͍ͯ͠Δɻ

Slide 26

Slide 26 text

8FBSFIJSJOH aશ৬छืूதͰ͢ʂ IUUQTIFSQDBSFFSTWUSJDPU

Slide 27

Slide 27 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠