我有一个使用 Phusion 乘客 + Apache Web 服务器部署的 Ruby on Rails 应用程序。每个请求是否在 Phusion Passenger 产生的自己的线程中运行?
2 回答
乘客(以及大多数其他应用程序服务器)每个线程运行的请求不超过一个。通常每个进程也只有一个线程。来自Phusion 乘客文档:
Phusion Passenger 支持两种并发模型:
process:单线程、多处理的 I/O 并发。每个应用程序进程只有一个线程,一次只能处理一个请求。这是 Ruby 应用程序传统上使用的并发模型。它具有出色的兼容性(可以与并非设计为线程安全的应用程序一起使用),但不适用于应用程序必须等待大量外部 I/O(例如 HTTP API 调用)的工作负载,并且使用更多内存,因为每个进程都有很大的内存开销。
thread:多线程、多处理的 I/O 并发。每个应用程序进程都有多个线程(可通过PassengerThreadCount 自定义)。此模型提供了更好的 I/O 并发性并使用更少的内存,因为线程在同一进程中彼此共享内存。但是,如果应用程序不是设计为线程安全的,则使用此模型可能会导致兼容性问题。
(强调我自己的)
Passenger open source edition only uses one thread per application, as listed in your apache virtual hosts files (not sure about nginx). So you could conceivably have multiple instances of your app running on the same apache server, but you would have to install your app into multiple directories and point vhosts entries at them, and put some kind of load-balancer in front of it. Passenger enterprise enables much more control over concurrency.
EDIT: clarity.