Phân biệt Web server với App server trong Rails
Bài đăng này đã không được cập nhật trong 3 năm
Bài viết này được dịch từ nguồn gốc A Web Server vs. an App Server
Khi chúng ta nghiên cứu cách deploy rails app chúng ta sẽ gặp rất nhiều tên như Apache, Unicorn, Puma, Phusion Passenger, Nginx, Rainbows và nhiều nhơn nữa. Tất cả có vẻ phù hợp với thể loại phân mềm deploying Rails
nhưng có một số đặc điểm khác biệt giữa chúng vì trong đám đó một số cái là web servers
và còn lại là app servers
.
Khi chúng ta hiểu thật rõ những gì là web server, là app server và thứ đó phù hợp trong hệ thống minh muốn build ở thể loại nào vậy việc deploy sẽ đúng đắn và suôn sẻ hơn nhưng thể loại không luôn luôn rõ ràng.
Thế nào là một web server và nó khác biệt với app server như thế nào? Chúng ta có thể dùng một trong hai được không? và Rack phù hợp với gì?
Web server là gì?
Một web server là một chương trình mà đưa một request đến website từ một user và xử lý một số thứ trên request đó. Sau đó nó đưa request đó cho Rails app.
Nginx
và Apache
là hai web server to mà chúng ta thường dùng.
Nếu request là không thay đổi thường xuyên như CSS, Javascript hoặc ảnh thì Rails app có thể không cần check. Web server có thể xử lý request đó mà không cần tương tác với app. Bằng cách đó tóc độ sẽ nhanh hơn. Các web server có thể sử lý các request SSL , phục vụ các static file và assets, các request compress và một số thứ nữa gần như mọi thứ mà website cần và nếu Rails app cần xử lý một request web server sẽ đưa request đó cho bên app server.
App server là gì?
App server là thứ mà thật sự chạy trong Rails app. App server tải code và giữ trong bộ nhớ. Khi app server nhận một request từ web server nó sẽ báo lại cho bên Rails app biết. Sau khi app xử lý xong request app server sẽ gửi lại response cho web server (và thậm chí gửi tới user).
Chúng ta có thể chạy một số app server bằng chính nó mà không cần nhờ web server. Đó là những gì mà làm trong development mode. Trong production, chúng ta thường có một web server để tiên xử lý. Nó sẽ xử lý nhiều app trong một lúc như render assets nhanh hơn và đối mặt với một số việc xử lý mà phải xử lý luôn trên mọi request.
Có rất nhiều app server co Rails app bao gồm Mongrel (không được dùng nhiều nữa), Unicorn, Thin, Rainbows và Puma. Mỗi một app server có đặc tính riêng và quan điểm khác nhau. Nhưng cuối cùng tất cả chúng nó hoàn thành cùng một vấn đề đó là giữ Rails app chạy và xử lý các request.
Passenger là gì?
Phusion Passenger là một cái hơi duy nhất vì trong standalone mode
nó làm việc như một app server. Nhưng nó cũng có thể build thành một web server vậy không cần một app server riêng biệt để chạy Rails app.
Điều này rất tiện lợi đặc biệt khi chúng ta định chạy một đống app và không muốn mất thời gian để cài đặt app server cho mỗi một app. Sau khi install Passenger chúng ta chỉ trỏ web server trực tiếp đến Rails app(thay vì một app server) tiếp theo Rails app sẽ bắt đầu xử lý các request.
Passenger là một lựa chọn tốt nhất nhưng có app server riêng vẫn là lựa chọn tốt. Giữ app server riêng cho phép lựa chọn linh hoạt để chọn app server mà phù hợp với những gì mà móng muốn va chúng ta có thể chạy và quy mô bởi chính nó.
Rack là gì?
Rack là phép thuật cho chép bất kỳ app server kiểu này có thể chạy Rails app (hoặc Sinatra app, or Padrino app, ....). Chúng ta có thể coi Rack là một ngôn ngữ chung mà Ruby web frameworks (như Rails) và app server tương tác với nhau. Tại vì mỗi bên biết cùng một ngôn ngữ có nghĩa là Rails có tương tác tời Unicorn và ngược lại mà không cần Rails hoặc Unicorn biết những thứ gì về nhau.
Làm thế nao để web server và app server liên quan nhau?
Vậy bằng cách nào Web server và app server phù hợp với anh??
Ngắn gọn là một web request sẽ đưa cho web server trước. Nếu như request đó Rails có thể xử lý được thì web server sẽ thực hiện xử lý một số cái trên request và chuyển tiếp cho app server. Khi app xử lý xong request, Rails app gửi response lại qua app server và web server tới người dùng app.
Cụ thể hơn Nginx có thể chuyển tiếp một request tới Unicorn. Unicorn cho request tới Rack thông qua Rails router và cho tới đúng controller. Sau đó response sẽ gửi lại qua các cách khác.
Bài viết này có vẻ tổng quan đơn gian nhưng hiểu biết về thể loại của các server này sẽ giúp đưa phần mềm bạn vào đúng bucket và sau khi hiểu app server và web server phù hợp với nhau như thế nào thì việc debug server khi gặp lỗi sẽ dễ dàng hơn vì minh biết trước những chỗ nào cần đi xem lỗi đó và nó tương tác như thế nào.
All rights reserved