Upgrade to Pro — share decks privately, control downloads, hide ads and more …

インフラエンジニアのWEBアプリ入門

 インフラエンジニアのWEBアプリ入門

y8c 2017の発表資料です。

Shuhei Ozawa

May 26, 2017
Tweet

More Decks by Shuhei Ozawa

Other Decks in Programming

Transcript

  1. ΠϯϑϥΤϯδχΞͷ
    WEBΞϓϦೖ໳
    1 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  2. ࣗݾ঺հ
    • খ୔पฏ
    • @oza_shu
    • Sler→WEBۀք
    2 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  3. ࿩͢͜ͱ
    • ࡞੒͍ͯ͠ΔΞϓϦ(Ԍ্த)
    • ΞϓϦ࡞੒Λ࢝ΊͯΑ͔ͬͨ͜ͱ
    • ΞϓϦ։ൃ͕ϓϩάϥϛϯάೖ໳ʹ͓͢͢Ίͳཧ༝
    ࿩͞ͳ͍͜ͱ
    • ϓϩάϥϛϯάݴޠ
    • ϑϨʔϜϫʔΫ
    3 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  4. ฉ͍ͯ΄͍͠ਓ
    • ͜Ε͔Βϓϩάϥϛϯάษڧ͍ͨ͠ਓ
    • ษڧͯ͠Δ͚ͲԿΛ࡞ͬͨΒ͍͍͔Θ͔Βͳ͍ਓ
    • ίʔυॻ͚ΔΑ͏ʹͳΓ͍ͨΠϯϑϥΤϯδχΞ
    • ϓϩάϥϛϯάॻ͚ΔΑ͏ʹͳΓ͍ͨͱ૬ஊ͞ΕΔਓ
    4 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  5. ϓϩάϥϛϯά͕Ͱ͖Δͱ͸
    Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ΁
    5 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  6. WEBΞϓϦ͕͓͢͢Ίͷཧ༝
    • ೲظ΍ٛ຿͕ͳ͍
    • ඞཁͳٕज़͕ଟذʹ౉Δ
    • αʔό্Ͱಈ͍͍ͯΔΞϓϦͷಈ͖͕Θ͔Δ
    • ো֐ରԠͰΞϓϦͷιʔείʔυΛ௥͑ΔΑ͏ʹͳΔ
    • ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂ
    6 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  7. ࡞͍ͬͯΔ΋ͷ
    Collect-Qiita
    ཁ݅
    • Qiitaͷ࠷৽هࣄऔಘͱݕࡧ
    • ϩάΠϯػೳ
    • ηογϣϯอ࣋
    • ͓ؾʹೖΓػೳ(Ԍ্த)
    7 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  8. DEMO
    ׬੒ؒʹ߹Θͳ͔ͬͨ!
    ΞΧ΢ϯτ࡞੒ʙهࣄͷݕࡧ·Ͱ
    ͏͍ͯ͝!
    8 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  9. Collect-QiitaͰඞཁͱͳΔٕज़
    • Qiitaͷ࠷৽هࣄऔಘͱݕࡧ
    • GET,POST,ϧʔςΟϯά,ςϯϓϨʔτ,FORMॲཧ
    • ϩάΠϯػೳ
    • DB࿈ܞ, ηΩϡϦςΟ
    • ηογϣϯอ࣋
    • Ωϟογϡ, HTTPϓϩτίϧ
    • ͓ؾʹೖΓػೳ
    • DB࿈ܞ, Ajax??
    9 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  10. ΞϓϦΛ࡞Γ࢝ΊΔͱ
    ػೳΛ௥Ճͨ͘͠ͳΔ
    • APIΛୟ͍ͯهࣄΛͱͬͯ͜Εͨʂ
    • هࣄΛ͓ؾʹೖΓొ࿥͍ͨ͠ʂ
    • ϩάΠϯೝূ͠ͳ͍ͱͩʂ
    • ηογϣϯ؅ཧ΋ඞཁͳΜͩɻRedisͰอଘ͍ͨ͠ͳ!
    • DockerͰίϯςφʹͯ͠Έ͍ͨʂ
    • ྲྀߦΓͩ͠k8sͰϚΠΫϩαʔϏεʹ͢Δ??
    10 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  11. ࣍ͷҰา͕Θ͔Δ!
    Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ΁
    11 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  12. WEBΞϓϦ͕͓͢͢Ίͷཧ༝
    • ೲظ΍ٛ຿͕ͳ͍
    • ػೳ௥Ճͯ͠Ԍ্ͯ͠΋͍͍
    • ඞཁͳٕज़͕ଟذʹ౉Δ
    • ৭Μͳٕज़ֶ͕΂ָ͍ͯ͠ʂ
    • αʔό্Ͱಈ͍͍ͯΔ෺͕ͳΜͳͷ͔஌ΕΔ
    • ͲΜͳٕज़͕࢖ΘΕ͍ͯΔͷ͔஌Δͷָ͍͠ʂ
    • ॻ͘ͱಈ͘ʂ͢͝ʔ͍ʂͨͷ͠ʔ͍ʂ
    ɹ- !
    12 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  13. ࣗ෼ͷ࡞ͬͨΞϓϦ͸Ͳ͏΍ͬͯ
    ಈ͍͍ͯΔΜͩΖ͏?
    - ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭͯ΋ͬͱ஌Γ͍ͨ
    - Ͳ͏΍ͬͯΞϓϦʹΞΫηε͍ͯ͠Δͷ͔஌Γ͍ͨ
    13 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  14. ΞϓϦΛಈ͔͍ͯ͠Δϓϩηεʹ͍ͭ
    ͯ΋ͬͱ஌Γ͍ͨ
    • Χʔωϧ͸ϓϩηεΛׂΓৼΒΕͨPIDΛΈͯ਺஋ͱͯ͠ѻ͏
    • ࣮ߦதͷϓϩηε͕ϦιʔεΛ։͘ͱϑΝΠϧσΟεΫϦϓλ
    ׂ͕Γ౰ͯΒΕΔ
    14 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  15. ίʔυྫ(1) PIDΛΈͯΈΑ͏
    # ݱࡏͷϓϩηεΛฦ͢
    import os
    print ("My pid:", os.getpid())
    $ python3 3_processes_have_pid.py
    My pid: 10592
    15 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  16. ίʔυྫ(2) ϑΝΠϧσΟεΫϦϓλ
    # ϑΝΠϧσΟεΫϦϓλׂ͕Γ౰ͯΒΕ͍ͯΔ͔ΈͯΈΑ͏
    if __name__ == "__main__":
    with open("/etc/passwd") as passwd:
    print(passwd.fileno())
    passwd.closed
    try:
    print(passwd.fileno())
    except ValueError:
    print("The file already has closed")
    # ϑΝΠϧΛด͡Δͱফ͑Δ
    $ python3 5_processes_have_file_descriptors_closed_file.2.py
    3
    The file already has closed
    16 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  17. ϑΝΠϧσΟεΫϦϓλʹ͸੍ݶ͕͋
    Δ
    ϑΝΠϧ͕։͚ͳͯ͘ো֐ରԠΛͨ͜͠ͱ͕͋ͬͨͳ
    ιϑτϦϛοτΛ্͛ͨ͜ͱΛࢥ͍ग़ͨ͠
    PythonͰopenͰϑΝΠϧΛ։͍ͨΒด͡Α͏ͱॻ͍ͯ͋ͬͨʂ
    withจΛ࢖͏ͷΛ͓͢͢Ί͞Εͨཧ༝͕Θ͔ͬͨʂ
    17 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  18. fork()ؾʹͳͬͯ͘Δ
    ϓϩηε͕Fork͞ΕΔͬͯͲ͏͍͏͜ͱ͚ͩͬ?
    ࢠϓϩηε͸਌ϓϩηεͰ࢖ΘΕ͍ͯΔશͯͷϝϞϦͷίϐʔΛҾ͖ܧ͙
    ϑΝΠϧσΟεΫϦϓλ(ιέοτ)΋
    • prefork
    • ίϐʔɾΦϯɾϥΠτʢCoWɺCopy on Writeʣ
    • ԿͰκϯϏϓϩηεͬͯͳΔΜ͚ͩͬ
    • ϓϩηεؒ௨৴
    • ύΠϓॲཧ,ετϦʔϜ,ϝοηʔδ
    • γάφϧॲཧ
    • ϓϩηεάϧʔϓ,ηογϣϯάϧʔϓ
    18 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  19. Ͳ͏΍ͬͯΞϓϦʹ
    ΞΫηε͍ͯ͠Δͷ͔஌Γ͍ͨ
    • HTTP͸ΞϓϦέʔγϣϯ૚ϓϩτίϧ
    • HTTP͸TCP(UDP)্Ͱ࢖༻͞Εɺ
    ΫϥΠΞϯτͱαʔόͰ΍ΓͱΓ͞ΕΔ
    19 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  20. HTTPϓϩτίϧ
    • HTTP͸Ͳ͏͍͏ϓϩτίϧʁ
    • ͲΜͳϔομ͕͋Δʁ
    • KeepAliveΊͪΌͪ͘ΌศརͰ͸
    • HTTPͱHTTP2ͷҧ͍͸?
    • requestsϞδϡʔϧ͕ศར
    20 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  21. WEBαʔόͷಈ͖
    • αʔό͸WEBϖʔδʹΞΫηε͠ʹ͘ΔΫϥΠΞϯτͷTCPϙʔ
    τΛLISTEN͢Δ
    • ΫϥΠΞϯτ͸αʔόʹ઀ଓͯ͠ϦΫΤετΛ౤͛Δ
    • αʔό͸WEBϖʔδΛϦΫΤετͯ͠ฦ͢
    21 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  22. TCPαʔόͷ࣮૷
    • echoαʔόͷ࣮૷͸؆୯
    • socketϞδϡʔϧ͕ศར
    • ෳ਺ͷΫϥΠΞϯτ͔Βͷ઀ଓʹରԠͤͯ͘͞
    • Ϛϧνϓϩηε΍ϚϧνεϨουɺΠϕϯτۦಈ
    • I/O(C10K໰୊)
    • thread,queue,select(),epoll()
    • GunicornͷίʔϧυϦʔσΟϯά
    22 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  23. ֶशͷґଘ॥؀
    • ಈ͘ͱָ͍͠
    • αϯϓϧίʔυ΍ιʔείʔυΛಡΜ
    Ͱಈ͔ͯ͠ΈΔ
    • RFC΋ಡΜͰ࢓༷΋ಡΉΑ͏ʹͳΔ
    • πʔϧʹৼΓճ͞Εͣීวతͳٕज़Λ
    ௥͑Δ
    • Կॻ͍͍͍͔ͯͳΜͯ೰·ͳ͘ͳΔ
    23 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  24. ෳ਺ͷϨΠϠɺ෼໺ʹߦ͚Δ
    Ҿ༻: 20ࡀΛա͔͗ͯΒϓϩάϥϛϯάΛֶ΅͏ͱܾΊͨਓͨͪ΁
    24 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide

  25. ·ͱΊ
    • ϓϩάϥϛϯάͷ࣍ͷҰา͕Θ͔Δ
    • ো֐ରԠͰιʔείʔυϨϕϧͰಈ࡞Λ௥͑Δ
    • ϓϩτίϧ΍௿ϨΠϠͳීวతͳٕज़ֶ͕΂Δ
    • ٕज़Λ௥͏॥؀
    • ٕज़Λ௥͏͜ͱ͸ͨͷ͍͠ʂ
    • ٕज़ͷ࿩୊ͰϑϨϯζ΋Ͱ͖Δʂ
    • ٕज़ͷ࿩Λ͠ͳ͕Βɺ͓ञΛҿΉͷͨͷ͍͠ʂ
    25 Y8 2017 2017/05/27 - Ozawa Shuhei ( @oza_shu )

    View Slide