Khi bạn nghiên cứu cách triển khai ứng dụng Rails của mình, bạn sẽ thấy rất nhiều cái tên:Apache, Unicorn, Puma, Phusion Passenger, Nginx, Rainbows, v.v. Tất cả chúng đều có vẻ phù hợp với danh mục phần mềm "đang triển khai Rails", nhưng có một sự khác biệt chính giữa chúng. Một số là “máy chủ web” và một số khác là “máy chủ ứng dụng”.
Sau khi bạn hiểu được danh mục nào và vị trí của từng danh mục trong hệ thống của bạn, việc triển khai sẽ có ý nghĩa hơn rất nhiều. Nhưng các danh mục không phải lúc nào cũng rõ ràng.
Máy chủ web là gì và nó khác máy chủ ứng dụng như thế nào? Bạn có thể sử dụng cái này mà không dùng cái kia không? Và Rack phù hợp với vị trí nào?
Máy chủ web là gì?
A máy chủ web là một chương trình nhận yêu cầu đến trang web của bạn từ người dùng và thực hiện một số xử lý trên đó. Sau đó, nó có thể đưa ra yêu cầu cho ứng dụng Rails của bạn. Nginx và Apache là hai máy chủ web lớn mà bạn sẽ sử dụng.
Nếu yêu cầu dành cho thứ gì đó không thường xuyên thay đổi, chẳng hạn như CSS, JavaScript hoặc hình ảnh, thì ứng dụng Rails của bạn có thể không cần xem nó. Máy chủ web có thể tự xử lý yêu cầu mà không cần nói chuyện với ứng dụng của bạn. Theo cách đó thường sẽ nhanh hơn.
Máy chủ web có thể xử lý các yêu cầu SSL, phục vụ các tệp và nội dung tĩnh, nén các yêu cầu và thực hiện nhiều việc khác mà hầu hết mọi trang web đều cần. Và nếu ứng dụng Rails của bạn có cần xử lý một yêu cầu, máy chủ web sẽ chuyển nó đến máy chủ ứng dụng của bạn.
Máy chủ ứng dụng là gì?
Một máy chủ ứng dụng là thứ thực sự chạy ứng dụng Rails của bạn. Máy chủ ứng dụng của bạn tải mã của bạn và giữ ứng dụng của bạn trong bộ nhớ. Khi máy chủ ứng dụng của bạn nhận được yêu cầu từ máy chủ web của bạn, nó sẽ thông báo cho ứng dụng Rails của bạn về điều đó. Sau khi ứng dụng của bạn xử lý xong yêu cầu, máy chủ ứng dụng sẽ gửi phản hồi trở lại máy chủ web (và cuối cùng là cho người dùng).
Bạn có thể tự chạy hầu hết các máy chủ ứng dụng mà không cần có máy chủ web phía trước. Đó có thể là những gì bạn làm trong chế độ phát triển! Tuy nhiên, trong quá trình sản xuất, bạn thường sẽ có một máy chủ web ở phía trước. Nó sẽ xử lý nhiều ứng dụng cùng một lúc, hiển thị nội dung của bạn nhanh hơn và giải quyết rất nhiều quy trình mà bạn sẽ thực hiện theo mọi yêu cầu.
Có một tấn máy chủ ứng dụng cho các ứng dụng Rails, bao gồm Mongrel (không còn được sử dụng nhiều nữa), Unicorn, Thin, Rainbows và Puma. Mỗi loại đều có những ưu điểm khác nhau và triết lý khác nhau. Nhưng cuối cùng, tất cả chúng đều đạt được điều tương tự - giữ cho ứng dụng Rails của bạn chạy và xử lý các yêu cầu.
Còn Hành khách thì sao?
Phusion Passenger có một chút độc đáo. Ở “chế độ độc lập”, nó có thể hoạt động giống như một máy chủ ứng dụng. Nhưng nó cũng có thể được tích hợp ngay vào máy chủ web, vì vậy bạn không cần một máy chủ ứng dụng riêng biệt để chạy các ứng dụng Rails của bạn.
Điều này có thể thực sự thuận tiện. Đặc biệt nếu bạn đang có kế hoạch chạy nhiều ứng dụng và không muốn mất thời gian thiết lập máy chủ ứng dụng cho từng ứng dụng. Sau khi cài đặt Passenger, bạn chỉ cần trỏ máy chủ web trực tiếp vào ứng dụng Rails của mình (thay vì máy chủ ứng dụng) và ứng dụng Rails của bạn sẽ bắt đầu xử lý các yêu cầu!
Hành khách là một lựa chọn tốt, nhưng có một máy chủ ứng dụng riêng vẫn có thể tốt. Giữ máy chủ ứng dụng riêng biệt giúp bạn linh hoạt trong việc chọn máy chủ ứng dụng phù hợp nhất với nhu cầu của mình và bạn có thể tự chạy và mở rộng quy mô của nó. Tuy nhiên, tôi sẽ thử lại vào lần tiếp theo khi tôi triển khai một ứng dụng nhỏ mới. Tôi hy vọng nó sẽ giúp việc triển khai các ứng dụng trong tương lai đến cùng một máy chủ dễ dàng hơn.
Còn Rack thì sao?
Rack là phép thuật cho phép bất kỳ máy chủ ứng dụng nào trong số này chạy ứng dụng Rails của bạn. (Hoặc ứng dụng Sinatra hoặc ứng dụng Padrino, hoặc…)
Bạn có thể coi Rack như một ngôn ngữ chung mà các khuôn khổ web Ruby (như Rails) và các máy chủ ứng dụng đều nói. Bởi vì mỗi bên đều biết cùng một ngôn ngữ, điều đó có nghĩa là Rails có thể nói chuyện với Unicorn và Unicorn với Rails mà không cần Rails hoặc Unicorn biết gì về bên kia.
Chúng liên quan như thế nào?
Vì vậy, làm thế nào để tất cả điều này phù hợp với nhau?
Trong số những phần này, một yêu cầu web sẽ đến máy chủ web của bạn trước tiên. Nếu yêu cầu là thứ mà Rails có thể xử lý, máy chủ web sẽ thực hiện một số xử lý theo yêu cầu và giao nó cho máy chủ ứng dụng. Máy chủ ứng dụng sử dụng Rack để nói chuyện với ứng dụng Rails của bạn. Khi ứng dụng của bạn được thực hiện với yêu cầu, ứng dụng Rails của bạn sẽ gửi lại phản hồi thông qua máy chủ ứng dụng và máy chủ web cho người đang sử dụng ứng dụng của bạn.
Cụ thể hơn, Nginx có thể chuyển một yêu cầu đến Unicorn. Unicorn đưa yêu cầu tới Rack, yêu cầu này sẽ đưa nó đến bộ định tuyến Rails, yêu cầu này sẽ đưa nó đến bộ điều khiển phù hợp. Sau đó, phản hồi của bạn sẽ trở lại theo cách khác.
Tổng quan này có thể được đơn giản hóa. Nhưng ngay cả khi chỉ cần biết những danh mục này cũng sẽ giúp bạn đưa phần mềm mà bạn sử dụng vào đúng nhóm tinh thần.
Sau khi bạn hiểu cách máy chủ ứng dụng và máy chủ web khớp với nhau, việc gỡ lỗi máy chủ khi bạn gặp phải sẽ dễ dàng hơn rất nhiều. Bạn sẽ biết tất cả các địa điểm khác nhau mà bạn có thể tìm và cách chúng tương tác. Và khi máy chủ ứng dụng thú vị tiếp theo xuất hiện, bạn sẽ dễ dàng hoán đổi nó hơn nữa!
Nếu bạn muốn tìm hiểu thêm về cách Rails tương tác với web, hãy xem bài viết này:Cách Rails Sessions hoạt động.