非分叉Web服务器如何工作?

Lud*_*erl 9 algorithm

select()像lighttpd或nginx这样的非分叉(也称为单线程或基于)的网络服务器越来越受欢迎.

虽然有大量文档解释分叉服务器(各种详细程度),但非分叉服务器的文档很少.

我找了一个鸟的眼睛怎么一个非分叉的Web服务器的作品.(伪)代码或状态机图,剥离到最低限度,将是伟大的.

我知道以下资源,并发现它们很有帮助.

但是,我对原则感兴趣,而不是实现细节.

特别:

  • 为什么这种类型的服务器有时称为非阻塞,select()基本上是块?

  • 处理请求可能需要一些时间.在没有特定侦听器线程或进程的情况下,新请求会发生什么?请求处理是以某种方式中断还是时间切片?

编辑: 据我所知,在处理请求(例如文件读取或CGI脚本运行)时,服务器无法接受新连接.这不意味着如果CGI脚本运行,比如2秒左右,这样的服务器可能会错过很多新的连接吗?

dwc*_*dwc 8

基本伪代码:

setup
while true
    select/poll/kqueue
    with fd needing action do
        read/write fd
        if fd was read and well formed request in buffer
            service request
        other stuff
Run Code Online (Sandbox Code Playgroud)
  • 虽然select()和朋友阻止,但套接字I/O没有阻塞.只有在你有趣的事情发生之前,你才被阻止.
  • 处理单个请求通常涉及从文件(静态资源)或进程(动态资源)读取文件描述符,然后写入套接字.这可以轻松完成而不需要保持很多状态.
  • 所以service request上面通常意味着打开一个文件,将其添加到列表中select,并注意从那里读取的东西会转到某个套接字.适当时用FastCGI代替文件.

编辑:

  • 不确定其他人,但nginx有2个进程:主人和工人.主设备进行监听,然后将接受的连接提供给工作人员进行处理.