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

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

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

22522e2bc35255ab75308c399ff782f6?s=128

Takuma Kume

July 29, 2018
Tweet

Transcript

  1. 3.
  2. 7.
  3. 12.

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

    1)1౳ͷॲཧͰߴෛՙʹͳΓ΍͍͢ 8&#αʔόͷෛՙ௿ݮ 8&#4FSWFSͷલஈͰΩϟογϡͯ͠ ߴ଎ʹԠ౴͢Δɻ
  4. 27.
  5. 28.
  6. 42.

    υϝΠϯͷઃఆʹԠͯ͡ϓϩΩγઌΛมߋ͍ͨ͠ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ 
  7. 43.

    3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF# 4JUF$

    4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ  υϝΠϯͷઃఆʹԠͯ͡ৼΔ෣͍Λ੍ޚ͍ͨ͠
  8. 49.

    ޮ཰తͳΩϟογϡ ୯७ʹ$BDIF4FSWFSΛฒ΂ͯ෼ࢄ͢Δͱ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰௿Լ σΟεΫྖҬͷফඅ FYBNQMFDPN FYBNQMFDPN
  9. 50.

    ޮ཰తͳΩϟογϡ υϝΠϯຖʹॲཧ͢Δ$BDIF4FSWFSΛݶఆ͍ͨ͠ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

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

    ΩϟογϡϞʔυͷ࣮૷ 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Λར༻
  11. 57.

    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ͷอଘઌ΍αΠζɺ༗ޮظؒ ΩϟογϡϞʔυͷ࣮૷
  12. 58.

    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Λར༻ εςʔλείʔυʹ ΑͬͯอଘظؒΛม͑Δ ΩϟογϡϞʔυͷ࣮૷
  13. 59.

    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Λ࢖ͬͯΩϟογϡ͢Δ ΩϟογϡϞʔυͷ࣮૷
  14. 60.

    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Λར༻ Ωϟογϡͷอଘɾ୳ࡧͷΩʔ ΩϟογϡϞʔυͷ࣮૷
  15. 61.

    ΩϟογϡϞʔυͷ࣮૷ 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Λར༻ Ωϟογϡ͕ͳ͍৔߹ɾ༗ޮظݶ੾Εͷ৔߹ʹ ΞΫηε͢ΔΦϦδϯαʔό
  16. 62.

    ΩϟογϡϞʔυͷ࣮૷ http { : server { : location /login {

    proxy_no_cache 1; proxy_cache_bypass 1; } } } OHJOYඪ४ͷOHY@IUUQ@QSPYZ@NPEVMFΛར༻ Ωϟογϡ͠ͳ͍ ΩϟογϡΛ୳ࡧ͠ͳ͍
  17. 63.

    Ωϟογϡػೳ : 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Ωϟογϡػೳͷྫ Ұ෦ ɿ
  18. 67.

    ΍Γ͍ͨ͜ͱ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS PS  ίϯςϯπΩϟογϡػೳ͸ 0/ʁ0''ʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ
  19. 73.

    Ϩϯλϧαʔόͷ৔߹ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF% 

     େྔͷ૿ݮ͢ΔυϝΠϯΛ ͲͷΑ͏ʹϓϩΩγ͍ͯ͠Δ͔ʁ
  20. 74.

    େྔυϝΠϯͷϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ ສαΠτҎ্ͷ ϓϩΩγͷઃఆΛ ॻ͘ͷ͸ݱ࣮తͰ͸ͳ͍
  21. 78.

    େྔυϝΠϯͷಈతͳϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ υϝΠϯͱ8&#4FSWFSͷඥ͚ͮ σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS OHJOY  OHY@NSVCZ
  22. 79.

    େྔυϝΠϯͷಈతͳϓϩΩγ 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

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

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

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

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  25. 82.

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ ΩϟογϡͷϞʔυ͸ 81Ωϟογϡʁ ੩తΩϟογϡʁ
  26. 83.

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

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

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε OHY@NSVCZ υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  28. 85.

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ 8&#4FSWFS *OUFSOFU 8&#4FSWFS   IUUQTTJUFBDPN 4JUF" 4JUF#

    4JUF$ 4JUF% ͓٬༷ͷίϯςϯπ $BDIF4FSWFS  σʔλϕʔε υϝΠϯTJUFBDPN αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81 OHY@NSVCZ OHY@NSVCZΛ࢖͑͹ ΋ͬͱεϚʔτʹͰ͖Δ
  29. 86.

    ػೳͷϋϯυϦϯά 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 %#͔Βऔಘͨ͠σʔλΛ
  30. 87.

    ػೳͷϋϯυϦϯά 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ϔομ
  31. 88.

    ػೳͷϋϯυϦϯά 3FWFSTF1SPYZ OHJOY OHY@NSVCZ 8&#4FSWFS 8&#4FSWFS 4JUF" 4JUF# 4JUF$ 4JUF%

    $BDIF4FSWFS IUUQTTJUFBDPN σʔλϕʔε αʔό8&#4FSWFS ΩϟογϡPO ΩϟογϡλΠϓ81
  32. 89.

    ػೳͷϋϯυϦϯά 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' ࣮ࡍ͸%#͔Βऔಘͨ͠஋
  33. 90.

    ػೳͷϋϯυϦϯά 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ϔομΛ΋ͱʹ ΩϟογϡػೳͷڍಈΛมߋ
  34. 91.

    ػೳͷϋϯυϦϯά 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ϔομΛ௥Ճ
  35. 92.

    ػೳͷϋϯυϦϯά 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ͰΑ͍ͷͰγϯϓϧ
  36. 99.

    Ωϟογϡͷಋೖ 3FWFSTF1SPYZ .Z42- ϦΫΤετ 3FEJT OHJOY OHY@NSVCZ ᶃ ᶅ ᶄ

    ᶃ3FEJT͔Β৘ใΛऔಘ ᶄᶃͰଘࡏ͠ͳ͚Ε͹.Z42-͔Β৘ใΛऔಘ ᶅᶄͰऔಘͨ͠৘ใΛ࣍ճϦΫΤετͷͨΊʹ 3FEJTʹॻ͖ࠐΈ
  37. 102.

    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"
  38. 103.

    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" ઀ଓ
  39. 104.

    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" ઀ଓ σʔλετΞΛొ࿥
  40. 105.

    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͢Δ
  41. 108.

    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. 109.

    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ͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  43. 110.

    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ͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  44. 111.

    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ͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  45. 112.

    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ͷม਺ʹ֨ೲ͢Δ # ϦΫΤετ։࢝࣌ʹ࣮ߦ͞ΕΔ
  46. 113.

    ίωΫγϣϯΛ࢖͍ճ͢ 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;
  47. 116.

    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ͷίωΫγϣϯΛ֨ೲ ൺֱత҆શʹάϩʔόϧม਺ʹΦϒδΣΫτΛ֨ೲͰ͖Δ
  48. 119.

    OHJOY XPSLFS 3FEJT 8PSLFSىಈ࣌ʹ઀ଓͨ͠3FEJTͷίωΫγϣϯΛ࢖͏ ϦΫΤετ ΞΫηε mruby_access_handler_code " Userdata.new.redis.get('hoge') ";

    8PSLFSىಈ࣌ʹ઀ଓͨ͠ίωΫγϣϯΛऔΓग़ͯ͠ɺར༻͢Δɻ NSVCZͷΠϯλϓϦλ͕8PSLFS಺Ͱ࢖͍ճ͞Ε͍ͯΔͨΊΞΫηε͕Մೳ ͦͷͨΊɺผͷ8PSLFS͔Β͸ผͷΠϯλϓϦλͳͷͰࢀরͰ͖ͳ͍
  49. 120.

    OHJOY XPSLFS 3FEJT 8PSLFSىಈ࣌ʹ઀ଓͨ͠3FEJTͷίωΫγϣϯΛ࢖͏ ϦΫΤετ ΞΫηε mruby_access_handler_code " Userdata.new.redis.get('hoge') ";

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

    3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS ϓϩΩγ͕ਖ਼ৗͳαʔόΛೝࣝͯ͠ ಈతʹϓϩΩγઌΛܾΊΔ
  51. 130.

    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*ʹΞΫηε͢ΔͱαʔϏεʹଐ͢Δ ϊʔυΛಘΔ͜ͱ͕Ͱ͖Δɻ ϔϧενΣοΫ݁Ռ΋ಘΔ͜ͱ͕Ͱ͖Δɻ αʔϏεʹଐ͢ΔϊʔυͷҰཡ΍ϔϧενΣοΫ݁ՌΛಘΒΕΔ
  52. 133.

    3FWFSTF1SPYZ OHJOY XJUIOHY@NSVCZ DPOTVM DPOTVM DBDIFTFSWFS DPOTVM DBDIFTFSWFS TFSWJDFDBDIFTFSWFS DPOTVMUFNQMBUF

    {{ range service "cache-server|passing" }} - {{ .Address }} {{ end }} servers.yml.ctmpl DPOTVMUFNQMBUFΛ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ ςϯϓϨʔτϑΝΠϧ
  53. 134.

    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Λ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ ςϯϓϨʔτϑΝΠϧ
  54. 135.

    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Λ࢖ͬͯɺಈతʹϑΝΠϧΛੜ੒͢Δ ϩʔυ औಘ ੜ੒ ςϯϓϨʔτϑΝΠϧ
  55. 136.

    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 ςϯϓϨʔτϑΝΠϧ
  56. 137.

    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 αʔό͕μ΢ϯͨ͠ͱ͖ ϔϧενΣοΫ ςϯϓϨʔτϑΝΠϧ
  57. 140.

    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
  58. 141.

    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Λ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ
  59. 142.

    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Λ૊Έ߹ͤͯಈతʹઃఆΛಡΈࠐΉ
  60. 147.

    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. 148.

    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
  62. 149.

    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
  63. 150.

    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
  64. 151.

    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. 152.

    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
  66. 153.

    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
  67. 154.

    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
  68. 155.

    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
  69. 156.

    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
  70. 157.

    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
  71. 160.

    ޮ཰తͳΩϟογϡ ୯७ʹ$BDIF4FSWFSΛฒ΂ͯ෼ࢄ͢Δͱ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

    4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS  8&#4FSWFS Ωϟογϡώοτ཰௿Լ σΟεΫྖҬͷফඅ FYBNQMFDPN FYBNQMFDPN
  72. 161.

    ޮ཰తͳΩϟογϡ υϝΠϯຖʹॲཧ͢Δ$BDIF4FSWFSΛݶఆ͍ͨ͠ 3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

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

    3FWFSTF1SPYZ $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF 4FSWFS $BDIF

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

    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$**ίʔυΛऔಘ υϝΠϯͷઌ಄͔Β̑จࣈநग़
  75. 167.

    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$**ίʔυΛ଍͢ υϝΠϯͷઌ಄͔Β̑จࣈநग़
  76. 168.

    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
  77. 169.

    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
  78. 170.

    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
  79. 172.

    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
  80. 173.

    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
  81. 174.

    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
  82. 176.