【发布时间】:2013-09-06 01:15:42
【问题描述】:
我有一个使用 Phusion 乘客 + Apache Web 服务器部署的 Ruby on Rails 应用程序。每个请求是否在 Phusion Passenger 产生的自己的线程中运行?
【问题讨论】:
我有一个使用 Phusion 乘客 + Apache Web 服务器部署的 Ruby on Rails 应用程序。每个请求是否在 Phusion Passenger 产生的自己的线程中运行?
【问题讨论】:
Passenger(以及大多数其他应用程序服务器)每个线程运行的请求不超过一个。通常每个进程也只有一个线程。来自Phusion Passenger docs:
Phusion Passenger 支持两种并发模型:
进程:单线程、多进程 I/O 并发。 每个应用进程只有一个线程,一次只能处理一个请求。这是 Ruby 应用程序传统上使用的并发模型。它具有出色的兼容性(可以与并非设计为线程安全的应用程序一起使用),但不适合应用程序必须等待大量外部 I/O(例如 HTTP API 调用)的工作负载,并且使用更多内存,因为每个进程都有很大的内存开销。
线程:多线程、多处理 I/O 并发。每个应用程序进程都有多个线程(可通过PassengerThreadCount 自定义)。该模型提供了更好的 I/O 并发性并使用更少的内存,因为线程在同一进程中彼此共享内存。但是,如果应用程序并非设计为线程安全的,则使用此模型可能会导致兼容性问题。
(强调我自己的)
【讨论】:
Passenger 开源版本每个应用程序仅使用一个线程,如您的 apache 虚拟主机文件中所列(不确定 nginx)。所以你可以想象你的应用程序的多个实例在同一个 apache 服务器上运行,但是你必须将你的应用程序安装到多个目录中,并将 vhosts 条目指向它们,并在其前面放置某种负载均衡器。 客运企业可以更好地控制并发。
编辑:清晰度。
【讨论】: