Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Web Servers vs App Servers: คู่มือชัดเจนสำหรับการ Deploy Rails

เวลา search วิธี deploy Rails app จะเห็นชื่อเยอะ: Apache, Unicorn, Puma, Phusion Passenger, Nginx, Rainbows และอื่นๆ ทั้งหมดดูอยู่ใน category "deploying Rails" แตมีความแตกต่างสำคัญ บางตัวเป็น "web servers" อีกบางตัวเป็น "app servers"

เข้าใจแล้วว่าตัวไหนเป็นตัวไหน และแต่ละ category อยู่ที่ไหนในระบบ deployment จะเข้าใจง่ายขึ้นมาก แต categories ไม่ได้ชัดเจนเสมอไป

Web server คืออะไร แตกต่างจาก app server ยังไง? ใช้ตัวใดตัวหนึ่งได้ไหม? Rack อยู่ที่ไหน?

Web Server คืออะไร?

Web server คือโปรแกรมที่รับ request ไปยังเว็บไซต์จากผู้ใช้ ทำการประมวลผลบ้าง แล้วอาจส่ง request ให้ Rails app Nginx และ Apache คือ web servers สองตัวใหญ่ที่จะเจอ

ถ้า request เป็นสิ่งที่ไม่เปลี่ยนบ่อย เช่น CSS, JavaScript, images Rails app อาจไม่ต้องเห็น request นั้น Web server จัดการเองได้ โดยไม่ต้องคุยกับ app มักเร็วกว่า

Web servers จัดการ SSL requests, serve static files/assets, compress requests และหลายอย่างที่เว็บไซต์ทุกตัวต้องการ ถ้า Rails app จริงๆ ต้องจัดการ request web server จะส่งต่อให้ app server

App Server คืออะไร?

App server คือตัวที่รัน Rails app จริงๆ App server โหลดโค้ดและเก็บ app ใน memory ตอน app server ได้ request จาก web server จะบอก Rails app พอ app จัดการ request เสร็จ app server ส่ง response กลับไป web server (และสุดท้ายไปยัง user)

รัน app servers ส่วนใหญ่ได้ด้วยตัวเองโดยไม่ต้องมี web server หน้าหน้า น่าจะเป็นสิ่งที่ทำใน development mode! แตใน production ปกติจะมี web server หน้าหน้า มันจัดการหลาย apps พร้อมกัน render assets เร็วกว่า และจัดการ processing ที่ทำทุก request

มี app servers เยอะมากสำหรับ Rails: Mongrel (ไม่ค่อย用แล้ว), Unicorn, Thin, Rainbows, Puma แต่ละตัวมีข้อดีและปรัชญาแตกต่าง แตในสุดท้าย ทำสิ่งเดียวกัน - รัน Rails app และจัดการ requests

Passenger เป็นยังไง?

Phusion Passenger โดดเด่นหน่อย ใน "standalone mode" ใช้ได้เหมือน app server แตก็สามารถ build เข้าไปใน web server ได้เลย ทำให้ไม่ ต้อง มี app server แยก

สะดวกมาก โดยเฉพาะถ้าจะรันหลาย apps และไม่อยาก setup app server ทุกตัว หลังติดตั้ง Passenger แค่ point web server ไปที่ Rails app โดยตรง (แทน app server) และ Rails app จะเริ่มจัดการ requests!

Passenger ตัวเลือกดี แตแยก app server ยังคงมีข้อดี แยกไว้ให้ flexibility เลือก app server ที่เหมาะ และรัน/ scale แยกได้ อยู่ดี ผมจะลองอีกครั้ง deploy app เล็กครั้งหน้า หวังว่าจะทำให้ deploy apps อื่นๆ บน server เดียวกันง่ายขึ้น

Rack เป็นยังไง?

Rack คือ magic ที่ให้ app servers 任何ตัวรัน Rails app ได้ (หรือ Sinatra, Padrino, ...)

คิดว่า Rack คือ common language ที่ Ruby web frameworks (如 Rails) และ app servers พูดร่วมกัน เพราะทั้งสองรู้ภาษาเดียวกัน Rails คุยกับ Unicorn และ Unicorn คุยกับ Rails ได้ โดยไม่ต้องให้ Rails หรือ Unicorn รู้จักกัน

พวกมันเกี่ยวข้องยังไง?

request จากเว็บจะโดน web server ก่อน ถ้าเป็นอย่างที่ Rails จัดการได้ web server ประมวลผลสักหน่อย ส่งต่อให้ app server App server 用 Rack คุยกับ Rails app พอ app จบ request Rails app ส่ง response กลับผ่าน app server และ web server ไปยังผู้ใช้

เฉพาะเจาะจง: Nginx ส่ง request ให้ Unicorn Unicorn ส่งให้ Rack ส่งให้ Rails router ส่งให้ controller ที่ถูกต้อง Response กลับทางเดิม

ภาพรวมนี้อาจ simple แตแค่รู้ categories นี้ จะช่วยใส่ software ที่รันอยู่ใน mental buckets ที่ถูกต้อง

เข้าใจ app servers และ web servers 如何 encajar กัน แล้ว debug server problems จะง่ายขึ้น รู้ทุกที่ที่อาจดู และพวกมัน interact ยังไง และพอ app server ใหม่น่าสนใจมา swap ใส่ได้ง่ายขึ้น!

อยากเรียนรู้เพิ่มว่า Rails interact กับ web ยังไง อ่าน: How Rails Sessions Work