Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Máy chủ Web so với Máy chủ Ứng dụng: Hướng dẫn rõ ràng cho triển khai Rails

Khi bạn tìm hiểu cách triển khai ứng dụng Rails, bạn sẽ thấy nhiều tên: Apache, Unicorn, Puma, Phusion Passenger, Nginx, Rainbows, và nhiều hơn nữa. Chúng dường như đều thuộc danh mục "triển khai Rails" phần mềm, 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à những cái khác là "máy chủ ứng dụng."

Một khi bạn hiểu cái nào là cái nào, và mỗi danh mục phù hợp ở đâu trong hệ thống của bạn, triển khai sẽ có ý nghĩa nhiều hơn. 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ể dùng cái này mà không cần cái kia? Và Rack phù hợp ở đâu?

Máy chủ web là gì?

Một máy chủ web là một chương trình nhận request đến trang web của bạn từ người dùng và làm một chút xử lý trên nó. Sau đó, nó có thể chuyển request cho ứng dụng Rails của bạn. Nginx và Apache là hai máy chủ web lớn bạn sẽ gặp.

Nếu request là cho thứ gì không thay đổi thường xuyên, như CSS, JavaScript, hoặc hình ảnh, ứng dụng Rails của bạn có thể không cần thấy nó. Máy chủ web có thể xử lý request chính nó, mà không cần nói chuyện với ứng dụng của bạn. Nó thường sẽ nhanh hơn cách đó.

Máy chủ web có thể xử lý request SSL, phục vụ file tĩnh và asset, nén request, và làm rất nhiều thứ khác mà hầu như mọi trang web đều cần. Và nếu ứng dụng Rails của bạn cần xử lý request, máy chủ web sẽ chuyển nó cho 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 nạp mã của bạn và giữ ứng dụng của bạn trong bộ nhớ. Khi máy chủ ứng dụng nhận request từ máy chủ web, nó báo cho ứng dụng Rails của bạn về nó. Sau khi ứng dụng của bạn xong xử lý request, máy chủ ứng dụng gửi phản hồi ngược lại máy chủ web (và cuối cùng đến người dùng).

Bạn có thể chạy hầu hết máy chủ ứng dụng bằng chính nó, không cần máy chủ web phía trước. Đó có thể là những gì bạn làm ở chế độ development! Trong production, tuy nhiên, bạn thường sẽ có máy chủ web phía trước. Nó sẽ xử lý nhiều ứng dụng cùng lúc, render asset của bạn nhanh hơn, và xử lý nhiều việc bạn làm trên mỗi request.

Có rất nhiều máy chủ ứng dụng cho ứng dụng Rails, bao gồm Mongrel (không còn dùng nhiều), Unicorn, Thin, Rainbows, và Puma. Mỗi cái có lợi thế và triết lý khác nhau. Nhưng cuối cùng, chúng đều hoàn thành cùng một việc – giữ ứng dụng Rails của bạn chạy và xử lý request.

Passenger thì sao?

Phusion Passenger hơi đặc biệt. Ở "standalone mode," nó có thể hành động giống như một máy chủ ứng dụng. Nhưng nó cũng có thể được xây dựng ngay vào máy chủ web, vậy bạn không cần một máy chủ ứng dụng riêng để chạy ứng dụng Rails của bạn.

Điều này có thể thực sự tiện lợi. Đặc biệt nếu bạn dự định chạy một đống ứ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 cái. Sau khi cài Passenger, bạn chỉ cần trỏ máy chủ web trực tiếp tại ứng dụng Rails của bạn (thay vì máy chủ ứng dụng), và ứng dụng Rails của bạn sẽ bắt đầu xử lý request!

Passenger là một lựa chọn hay, nhưng có máy chủ ứng dụng riêng vẫn có thể tốt. Giữ máy chủ ứng dụng riêng cho bạn sự linh hoạt để chọn máy chủ ứng dụng phù hợp nhất với nhu cầu, và bạn có thể chạy và scale nó riêng. Tuy nhiên, tôi sẽ thử nó lại lần sau khi triển khai ứng dụng nhỏ mới. Tôi hy vọng nó sẽ làm cho triển khai ứng dụng sau trên cùng máy chủ dễ dàng hơn.

Rack thì sao?

Rack là phép màu cho phép bất kỳ máy chủ ứng dụng nào chạy ứng dụng Rails của bạn. (Hoặc Sinatra, hoặc Padrino, hoặc...)

Bạn có thể nghĩ Rack như một ngôn ngữ chung mà các framework web Ruby (như Rails) và máy chủ ứng dụng đều nói. Bởi vì mỗi bên biết cùng ngôn ngữ, nó có nghĩa là Rails có thể nói với Unicorn và Unicorn với Rails, mà không cần Rails hay Unicorn biết bất cứ gì về nhau.

Chúng liên quan như thế nào?

Vậy, tất cả này phù hợp như thế nào?

Khỏi các mảnh này, một web request sẽ chạm máy chủ web của bạn trước. Nếu request là thứ Rails có thể xử lý, máy chủ web sẽ làm một chút xử lý trên request, và chuyển nó cho máy chủ ứng dụng. Máy chủ ứng dụng dùng Rack để nói với ứng dụng Rails của bạn. Khi ứng dụng của bạn xong với request, ứng dụng Rails của bạn gửi phản hồi ngược lại qua máy chủ ứng dụng và máy chủ web đến người dùng ứng dụng của bạn.

Cụ thể hơn, Nginx có thể chuyển request cho Unicorn. Unicorn đưa request cho Rack, Rack đưa cho Rails router, router đưa cho controller đúng. Sau đó, phản hồi của bạn chỉ đi ngược lại đường đó.

Tổng quan này có thể được đơn giản hóa. Nhưng ngay cả chỉ biết các danh mục này sẽ giúp bạn đặt phần mềm bạn gặp vào đúng ngăn tư duy.

Sau khi bạn hiểu cách máy chủ ứng dụng và máy chủ web phù hợp nhau, sẽ dễ dàng hơn nhiều để debug vấn đề máy chủ khi bạn có chúng. Bạn sẽ biết tất cả các nơi khác nhau bạn có thể nhìn, và cách chúng tương tác. Và khi máy chủ ứng dụng thú vị tiếp theo đến, sẽ còn dễ dàng hơn cho bạn để thay nó vào!

Nếu bạn muốn học thêm về cách Rails tương tác với web, hãy xem bài này: How Rails Sessions Work.