Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

200万ドメインを超えるレンタルサーバのコンテンツキャッシュ機能の裏側/2_million_m...

 200万ドメインを超えるレンタルサーバのコンテンツキャッシュ機能の裏側/2_million_more_than_the_domain_the_back_of_the_rental_server_content_cache

July Tech Festa 2018 (https://2018.techfesta.jp/)

Takuma Kume

July 29, 2018
Tweet

More Decks by Takuma Kume

Other Decks in Technology

Transcript

  1. ίϯςϯπΩϟογϡػೳ 3FWFSTF1SPYZ $BDIF4FSWFS 8&#4FSWFS Ωϟογϡ ίϯςϯπΩϟογϡ͋Γ OHJOY IUUQE ύϑΥʔϚϯεͷߴ͍OHJOYͰϦΫΤετ Λॲཧ͢Δɻ

    1)1౳ͷॲཧͰߴෛՙʹͳΓ΍͍͢ 8&#αʔόͷෛՙ௿ݮ 8&#4FSWFSͷલஈͰΩϟογϡͯ͠ ߴ଎ʹԠ౴͢Δɻ
  2. υϝΠϯͷઃఆʹԠͯ͡ϓϩΩγઌΛมߋ͍ͨ͠ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ 
  3. 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF# 4JUF$

    4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ  υϝΠϯͷઃఆʹԠͯ͡ৼΔ෣͍Λ੍ޚ͍ͨ͠
  4. ޮ཰తͳΩϟογϡ ୯७ʹ$BDIF4FSWFSΛฒ΂ͯ෼ࢄ͢Δͱ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰௿Լ σΟεΫྖҬͷফඅ FYBNQMFDPN FYBNQMFDPN
  5. ޮ཰తͳΩϟογϡ υϝΠϯຖʹॲཧ͢Δ$BDIF4FSWFSΛݶఆ͍ͨ͠ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰޲্ σΟεΫྖҬͷઅ໿ FYBNQMFDPN FYBNQMFDPN
  6. ΩϟογϡϞʔυͷ࣮૷ http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m;

    proxy_cache_valid 200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$ $is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻
  7. http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m; proxy_cache_valid

    200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$request_uri$is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ DBDIFͷอଘઌ΍αΠζɺ༗ޮظؒ ΩϟογϡϞʔυͷ࣮૷
  8. http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m; proxy_cache_valid

    200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$request_uri$is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ εςʔλείʔυʹ ΑͬͯอଘظؒΛม͑Δ ΩϟογϡϞʔυͷ࣮૷
  9. http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m; proxy_cache_valid

    200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$request_uri$is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ [POFΛ࢖ͬͯΩϟογϡ͢Δ ΩϟογϡϞʔυͷ࣮૷
  10. http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m; proxy_cache_valid

    200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$request_uri$is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ Ωϟογϡͷอଘɾ୳ࡧͷΩʔ ΩϟογϡϞʔυͷ࣮૷
  11. ΩϟογϡϞʔυͷ࣮૷ http { : proxy_cache_path /var/cache/nginx/cache levels=1:2 \ keys_zone=zone1:1024m inactive=10m;

    proxy_cache_valid 200 10m; proxy_cache_valid 404 1m; server { : proxy_cache zone1; proxy_cache_key $proxy_scheme://$host$request_uri$is_args$args; proxy_pass $proxy_scheme://${Origin Server}; } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ Ωϟογϡ͕ͳ͍৔߹ɾ༗ޮظݶ੾Εͷ৔߹ʹ ΞΫηε͢ΔΦϦδϯαʔό
  12. ΩϟογϡϞʔυͷ࣮૷ http { : server { : location /login {

    proxy_no_cache 1; proxy_cache_bypass 1; } } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ Ωϟογϡ͠ͳ͍ ΩϟογϡΛ୳ࡧ͠ͳ͍
  13. Ωϟογϡػೳ : location / { : set $do_not_cache 0; if

    ($http_cookie ~ '(wordpress_|comment_author|wp-postpass)') { set $do_not_cache 1; } proxy_no_cache $do_not_cache; proxy_cache_bypass $do_not_cache; proxy_cache zone1; proxy_cache_key "$proxy_scheme://$host$request_uri$is_args$args"; proxy_pass $proxy_scheme://${Origin Server}; } DPPLJFʹಛఆͷจࣈྻ͕ ͋Δ࣌͸Ωϟογϡ͠ͳ͍ 81Ωϟογϡػೳͷྫ Ұ෦ ɿ
  14. ΍Γ͍ͨ͜ͱ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS  ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ
  15. Ϩϯλϧαʔόͷ৔߹ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF% 

     େྔͷ૿ݮ͢ΔυϝΠϯΛ ͲͷΑ͏ʹϓϩΩγ͍ͯ͠Δ͔ʁ
  16. େྔυϝΠϯͷϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ ສαΠτҎ্ͷ ϓϩΩγͷઃఆΛ ॻ͘ͷ͸ݱ࣮తͰ͸ͳ͍
  17. େྔυϝΠϯͷಈతͳϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ υϝΠϯͱ8&#4FSWFSͷඥ͚ͮ σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS OHJOY  OHY@NSVCZ
  18. େྔυϝΠϯͷಈతͳϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ υϝΠϯͱ8&#4FSWFSͷඥ͚ͮ σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS OHJOY  OHY@NSVCZ NSVCZΛ࢖ͬͯ ίϯςϯπΩϟογϡػೳͷ ϋϯυϦϯάΛߦ͏ʂ
  19. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS  ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ 3FWFSTF1SPYZ 8&#4FSWFS $BDIF4FSWFS
  20. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  21. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ
  22. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε ΩϟογϡͷϞʔυ 81PS੩త  ʹΑͬͯڍಈΛม͍ͨ Ωϟογϡର৅֎΍ ظݶ੾Εͷ৔߹ʹ ΞΫηε͢Δ ΦϦδϯαʔόͷ৘ใ υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  23. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε OHY@NSVCZ υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  24. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 OHY@NSVCZ OHY@NSVCZΛ࢖͑͹ ΋ͬͱεϚʔτʹͰ͖Δ
  25. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε OHY@NSVCZ υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 3FWFSTF1SPYZ σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 %#͔Βऔಘͨ͠σʔλΛ
  26. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε OHY@NSVCZ υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 3FWFSTF1SPYZ $BDIF4FSWFS %#͔Βऔಘͨ͠σʔλΛ NSVCZͰ IUUQϔομʹ ෇༩ͯ͠఻ൖ )551ϔομ
  27. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  28. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε IUUQϔομΛ௥Ճ αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 9-0-*10161453&".8FC4FSWFS 9-0-*101$"$)&5:1&81 h = Nginx::Headers_in.new h['X-LOLIPOP-UPSTREAM'] = 'Web Server1' h['X-LOLIPOP-CACHE-TYPE'] = 'WP' ࣮ࡍ͸%#͔Βऔಘͨ͠஋
  29. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 9-0-*10161453&".8FC4FSWFS 9-0-*101$"$)&5:1&81 if ($http_x_lolipop_cache_type = "WP") { # WPΩϟογϡػೳͷڍಈ : } IUUQϔομΛ௥Ճ IUUQϔομΛ΋ͱʹ ΩϟογϡػೳͷڍಈΛมߋ
  30. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε IUUQϔομΛ΋ͱʹϓϩΩγ αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 9-0-*10161453&".8FC4FSWFS 9-0-*101$"$)&5:1&81 IUUQϔομΛ΋ͱʹ ΩϟογϡػೳͷڍಈΛมߋ proxy_pass $proxy_scheme://$http_x_lolipop_upstream; IUUQϔομΛ௥Ճ
  31. ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε IUUQϦΫΤετϔομΛ௥Ճ IUUQϦΫΤετϔομΛ΋ͱʹϓϩΩγ αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 9-0-*10161453&".8FC4FSWFS 9-0-*101$"$)&5:1&81 IUUQϦΫΤετϔομΛ΋ͱ ʹΩϟογϡػೳͷڍಈΛมߋ proxy_pass $proxy_scheme://$http_x_lolipop_upstream; NSVCZͰσʔλϕʔε͔Βऔಘͨ͠஋ΛIUUQ ϔομʹຒΊࠐΉ $BDIF4FSWFSଆ͸ຒΊࠐ·ΕͨIUUQϔομΛ ࢀর͚ͩͰυϝΠϯຖͷৼΔ෣͍ͷ੍ޚ͕Մೳ IUUQϔομʹΑΔ৘ใͷ఻೻ͳͷͰɺ$BDIF 4FSWFS͸௨ৗͷOHJOYͰΑ͍ͷͰγϯϓϧ
  32. Ωϟογϡͷಋೖ 3FWFSTF1SPYZ .Z42- ϦΫΤετ 3FEJT OHJOY OHY@NSVCZ ᶃ ᶅ ᶄ

    ᶃ3FEJT͔Β৘ใΛऔಘ ᶄᶃͰଘࡏ͠ͳ͚Ε͹.Z42-͔Β৘ใΛऔಘ ᶅᶄͰऔಘͨ͠৘ใΛ࣍ճϦΫΤετͷͨΊʹ 3FEJTʹॻ͖ࠐΈ
  33. NSVCZNTE redis = Msd::Store::Redis.new mysql = Msd::Store::MySQL.new( 'SELECT host FROM

    table WHERE domain = ?', 'localhost', 'root', 'password', 'DBName' ) msd = Msd::Client.new msd.configure do |c| c.stores = [redis, mysql] end msd.fetch('site-a.com') # => "Web Server1"
  34. NSVCZNTE redis = Msd::Store::Redis.new mysql = Msd::Store::MySQL.new( 'SELECT host FROM

    table WHERE domain = ?', 'localhost', 'root', 'password', 'DBName' ) msd = Msd::Client.new msd.configure do |c| c.stores = [redis, mysql] end msd.fetch('site-a.com') # => "Web Server1" ઀ଓ
  35. NSVCZNTE redis = Msd::Store::Redis.new mysql = Msd::Store::MySQL.new( 'SELECT host FROM

    table WHERE domain = ?', 'localhost', 'root', 'password', 'DBName' ) msd = Msd::Client.new msd.configure do |c| c.stores = [redis, mysql] end msd.fetch('site-a.com') # => "Web Server1" ઀ଓ σʔλετΞΛొ࿥
  36. NSVCZNTE redis = Msd::Store::Redis.new mysql = Msd::Store::MySQL.new( 'SELECT host FROM

    table WHERE domain = ?', 'localhost', 'root', 'password', 'DBName' ) msd = Msd::Client.new msd.configure do |c| c.stores = [redis, mysql] end msd.fetch('site-a.com') # => "Web Server1" ઀ଓ σʔλετΞΛొ࿥ σʔλΛΩϟογϡͭͭ͠GFUDI͢Δ
  37. OHY@NSVCZʹ͸NSVCZͷϑοΫϙΠϯτ͕ଘࡏ͢Δ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  38. OHY@NSVCZʹ͸NSVCZͷϑοΫϙΠϯτ͕ଘࡏ͢Δ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  39. OHY@NSVCZʹ͸NSVCZͷϑοΫϙΠϯτ͕ଘࡏ͢Δ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  40. OHY@NSVCZʹ͸NSVCZͷϑοΫϙΠϯτ͕ଘࡏ͢Δ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  41. OHY@NSVCZʹ͸NSVCZͷϑοΫϙΠϯτ͕ଘࡏ͢Δ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  42. ίωΫγϣϯΛ࢖͍ճ͢ https://github.com/matsumotory/ngx_mruby/tree/master/docs/directives mruby_init_worker /path/to/init.rb; mruby_init_worker_code " # ίʔυ "; mruby_set

    $variable /path/to/variable.rb; mruby_access_handler /path/to/access.rb; mruby_access_handler /path/to/access.rb cache; nginx.conf # Workerϓϩηεىಈ࣌ # cacheΦϓγϣϯΛ͚ͭΔͱnginxىಈ࣌ʹmrubyΛόΠτίʔυ # _code ͷσΟϨΫςΟϒ͸ΠϯϥΠϯͰmrubyͷίʔυΛهड़Ͱ͖Δ # mrubyͷ࣮ߦ݁ՌΛnginxͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ mruby_init_worker /path/to/init.rb; # Workerϓϩηεىಈ࣌ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ mruby_access_handler /path/to/access.rb;
  43. OHJOY XPSLFS 3FEJT mruby_init_worker_code " Userdata.new.redis = Redis.new('127.0.0.1', 6379) ";

    ίωΫγϣϯ 8PSLFSىಈ࣌ʹ3FEJTͱ઀ଓ͠ίωΫγϣϯΛอଘ͢Δ 8PSLFSϓϩηεͷ ىಈ NSVCZVTFSEBUBͱ͍͏NSCHFNΛ࢖ͬͯɺNSVCZεΫϦϓτ͔Β௚઀ࢀর Ͱ͖ͳ͍NSVCZͷάϩʔόϧม਺ʹ3FEJTͷίωΫγϣϯΛ֨ೲ ൺֱత҆શʹάϩʔόϧม਺ʹΦϒδΣΫτΛ֨ೲͰ͖Δ
  44. OHJOY XPSLFS 3FEJT 8PSLFSىಈ࣌ʹ઀ଓͨ͠3FEJTͷίωΫγϣϯΛ࢖͏ ϦΫΤετ ΞΫηε mruby_access_handler_code " Userdata.new.redis.get('hoge') ";

    8PSLFSىಈ࣌ʹ઀ଓͨ͠ίωΫγϣϯΛऔΓग़ͯ͠ɺར༻͢Δɻ NSVCZͷΠϯλϓϦλ͕8PSLFS಺Ͱ࢖͍ճ͞Ε͍ͯΔͨΊΞΫηε͕Մೳ ͦͷͨΊɺผͷ8PSLFS͔Β͸ผͷΠϯλϓϦλͳͷͰࢀরͰ͖ͳ͍
  45. OHJOY XPSLFS 3FEJT 8PSLFSىಈ࣌ʹ઀ଓͨ͠3FEJTͷίωΫγϣϯΛ࢖͏ ϦΫΤετ ΞΫηε mruby_access_handler_code " Userdata.new.redis.get('hoge') ";

    ίωΫγϣϯΛுͬͨޙʹ3FEJT͕࠶ىಈ͞ΕΔͳͲɺ ίωΫγϣϯ͕੾அ͞ΕΔ͜ͱΛ૝ఆͯ͠࠶઀ଓॲཧͷ࣮૷͸ඞཁɻ NSVCZNTE͸࣮૷ࡁΈ
  46. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS ϓϩΩγ͕ਖ਼ৗͳαʔόΛೝࣝͯ͠ ಈతʹϓϩΩγઌΛܾΊΔ
  47. 3FWFSTF1SPYZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS # curl -s http://localhost:8500/v1/health/service/

    \ cache-server | jq '.[].Node.Node' "cache-server-1" "cache-server-2" TFSWJDFDBDIFTFSWFS ϔϧενΣοΫ DPOTVM"1*ʹΞΫηε͢ΔͱαʔϏεʹଐ͢Δ ϊʔυΛಘΔ͜ͱ͕Ͱ͖Δɻ ϔϧενΣοΫ݁Ռ΋ಘΔ͜ͱ͕Ͱ͖Δɻ αʔϏεʹଐ͢ΔϊʔυͷҰཡ΍ϔϧενΣοΫ݁ՌΛಘΒΕΔ
  48. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} servers.yml.ctmpl DPOTVMUFNQMBUFΛ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ ςϯϓϨʔτϑΝΠϧ
  49. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} servers.yml.ctmpl TFSWJDF ϔϧενΣοΫঢ়ଶ OPEFͷ*1ΞυϨε DPOTVMUFNQMBUFΛ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ ςϯϓϨʔτϑΝΠϧ
  50. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} - cache-server-1ͷIPΞυϨε - cache-server-2ͷIPΞυϨε servers.yml.ctmpl servers.yml DPOTVMUFNQMBUFΛ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ औಘ ੜ੒ ςϯϓϨʔτϑΝΠϧ
  51. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} - cache-server-1ͷIPΞυϨε - cache-server-2ͷIPΞυϨε - cache-server-3ͷIPΞυϨε servers.yml.ctmpl servers.yml αʔόΛ૿ઃͨ͠ͱ͖ DPOTVM DBDIFTFSWFS ςϯϓϨʔτϑΝΠϧ
  52. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} - cache-server-1ͷIPΞυϨε - cache-server-2ͷIPΞυϨε servers.yml.ctmpl servers.yml αʔό͕μ΢ϯͨ͠ͱ͖ ϔϧενΣοΫ ςϯϓϨʔτϑΝΠϧ
  53. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ

    DPOTVMUFNQMBUF mruby_init_worker_code " servers = YAML.load( File.open('servers.yml').read ) Userdata.new.servers = servers "; nginx.conf DPOTVM DBDIFTFSWFS
  54. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    mruby_init_worker_code " servers = YAML.load( File.open('servers.yml').read ) Userdata.new.servers = servers "; nginx.conf DPOTVM DBDIFTFSWFS XPSLFSϓϩηεىಈ࣌ʹ ੜ੒͞Εͨ:".-Λϩʔυ *1ΞυϨεͷ഑ྻΛอଘ NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ
  55. 3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    mruby_init_worker_code " servers = YAML.load( File.open('servers.yml').read ) Userdata.new.servers = servers "; nginx.conf DPOTVM DBDIFTFSWFS XPSLFSϓϩηεىಈ࣌ʹ ੜ੒͞Εͨ:".-Λϩʔυ *1ΞυϨεͷ഑ྻΛอଘ DPOTVMUFNQMBUFͰϑΝΠϧੜ੒ޙʹOHJOYSFMPBEΛ࣮ࢪͯ͠ϩʔυ͢Δʂ OHJOY SFMPBE NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ
  56. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server nginx.conf
  57. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server μϛʔͷ6QTUSFBN OHY@NSVCZͰॻ͖׵͑Δ nginx.conf
  58. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server OHJOYͷม਺ʹNSVCZͷ࣮ߦ݁ՌΛ֨ೲ͢Δ nginx.conf
  59. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server mruby_init_worker_code " servers = YAML.load( File.open('servers.yml').read ) Userdata.new.servers = servers "; ىಈ࣌ʹऔಘͨ͠$BDIF4FSWFSҰཡ nginx.conf
  60. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server ઀ଓઌͷϙʔτ൪߸   nginx.conf
  61. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server μϛʔͰఆٛͨ͠6QTUSFBN nginx.conf
  62. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server 6QTUSFBNͷαʔόΛॻ͖׵͑Δ nginx.conf
  63. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server 6QTUSFBNͷαʔόΛॻ͖׵͑Δ ϥϯμϜʹΩϟογϡαʔόΛ1୆ฦ͢ nginx.conf
  64. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server ࠷ޙʹࢀরͨ͠΋ͷ͕ม਺ʹ֨ೲ͞ΕΔ nginx.conf
  65. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server ࠷ޙʹࢀরͨ͠΋ͷ͕ม਺ʹ֨ೲ͞ΕΔ ϓϩΩγ͢Δ nginx.conf
  66. NSVCZΛ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ upstream dynamic_cache_server { server 127.0.0.1:80; mruby_upstream_keepalive 64; } mruby_set_code

    $upstream " : if result.enable_contents_cache? servers = Userdata.new.servers port = Nginx::Connection.new.local_port index = SecureRandom.random_number(servers.size) upstream = Nginx::Upstream.new("dynamic_cache_server") upstream.server = "#{servers[index]}:#{port}" "dynamic_cache_server" else result.upstream end "; proxy_pass $upstream; # DB͔Βऔಘͨ͠ίϯςϯπΩϟογϡػೳͷར༻༗ແ # DB͔Βऔಘͨ͠υϝΠϯʹඥͮ͘Web Server ίϯςϯπΩϟογϡػೳ͕ແޮͷ৔߹͸ %#͔Βऔಘͨ͠8FC4FSWFSΛฦ͢ nginx.conf
  67. ޮ཰తͳΩϟογϡ ୯७ʹ$BDIF4FSWFSΛฒ΂ͯ෼ࢄ͢Δͱ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰௿Լ σΟεΫྖҬͷফඅ FYBNQMFDPN FYBNQMFDPN
  68. ޮ཰తͳΩϟογϡ υϝΠϯຖʹॲཧ͢Δ$BDIF4FSWFSΛݶఆ͍ͨ͠ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰޲্ σΟεΫྖҬͷઅ໿ FYBNQMFDPN FYBNQMFDPN
  69. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N υϝΠϯͷઌ಄͔Β̑จࣈநग़
  70. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N      ਐ਺ͷ"4$**ίʔυΛऔಘ υϝΠϯͷઌ಄͔Β̑จࣈநग़
  71. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N        ਐ਺ͷ"4$**ίʔυΛ଍͢ υϝΠϯͷઌ಄͔Β̑จࣈநग़
  72. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N        <> <> <> <> <> <> "SSBZ DPOTVMUFNQMBUFʹΑΔ:".-ੜ੒ˠ:".-MPBE ˠ"SSBZ
  73. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N             <> <> <> <> <> <> "SSBZ MFOHUI
  74. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N             <> <> <> <> <> <> "SSBZ
  75. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N             <> <> <> <> <> <> "SSBZ
  76. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N             <> <> <> <> <> <> "SSBZ MFOHUI DPOTVMUFNQMBUFͰઃఆϑΝΠϧ͕࠶ੜ੒ OHJOYSFMPBE
  77. 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS FYBNQMFDPN F Y B N Q M F  D P N             <> <> <> <> <> <> "SSBZ