前叉Web服务器模型到底是什么?


94

我想知道当Web服务器将自己描述为前叉Web服务器时的确切含义。我有一些例子,例如独角兽用于红宝石,而古尼康用于python。

更具体地说,这些是问题:

  • 该模型解决什么问题?
  • 最初启动前叉Web服务器时会发生什么?
  • 它如何处理请求?

另外,对于独角兽/独角兽,还有一个更具体的问题:

假设我有一个要与(g)unicorn一起运行的Web应用程序。初始化时,webapp将执行一些初始化工作(例如,填写其他数据库条目)。如果我使用多个工作人员配置(g)unicorn,初始化工作会多次运行吗?

Answers:


102

预分叉基本上是指主服务器创建处理每个请求的分叉。fork是一个完全独立的* nix进程。

根据以下评论进行更新。的prepre-fork单元,其请求到来之前这些过程分叉,它们可以但通常可以增加或减少随着负载上升和下降。

当您的库不是线程安全的时,可以使用预分叉。这也意味着导致问题的请求中的问题只会影响它们所处理的过程,而不会影响整个服务器。

多次运行的初始化都取决于您要部署的内容。但是,通常,每个进程都将存在连接池和这种性质的东西。

在线程模型中,主服务器也会创建重量较轻的线程来分派请求。但是,如果线程导致大量问题,则可能会对主进程产生影响。

使用Nginx,Apache 2.4的Event MPM或gevent(可与Gunicorn一起使用)之类的工具,这些工具是异步的,这意味着一个进程可以处理数百个请求而不会阻塞。


28
我对“ prefork”的含义也有同样的疑问。我本来以为这意味着某种形式的分叉,但是“前”部分使我感到困惑。我在abbreviations.com/prefork处发现,“ pre”部分实际上意味着事先创建了工作进程,因此,仅在需要工作人员时才浪费时间。对我来说很有意义:)
El Ninja Trepador

1
//,@ElNinjaTrepador,为什么不添加单独的答案?至少对我而言,这更容易理解,而且如果该评论变得更加突出,它可能会对其他人有更大的帮助。
内森·巴桑尼斯

2
我已经更新了答案,以在前叉中添加更多的信息。@ElNinjaTrepador感谢您指出这一点,但我没有意识到这并不是众所周知的。
Joe Doherty

1
@NathanBasanese将担任先生;)
El Ninja Trepador '16

4
@JoeDoherty也许是众所周知的,直到那时我才知道:DI将添加另一个答案(按照Nathan的要求),但是由于您已经添加了我所说的内容,所以不再需要了: )
El Ninja Trepador
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.