目前典型的 rails 服务器的构成都是这样一种模型:
Nginx(web server) ----> Passenger/unicorn/puma等(app server) -----> rails(App)
- Nginx 服务器一般是用来作为反向代理以及负载均衡来使用的,它是一个单独的进程(相对于 os 来说),能够监听在某个端口上,提供 http 的 request/response 服务,当 nginx 服务器接收到一个 http 请求的时候,会立马转发给下一层的服务器,例如 passenger,将这个请求原封不动的转给 passenger, 他们之间的通信一般用的是 socket;
- Passenger 服务器,独立运行在操作系统的环境下,启动之后,在 OS 里面可以查看到其 Pid,典型的服务器模型(被启动之后,初始设置完成后,监听在某个端口,进入 while true 死循环来处理请求,当一个 http 请求到来的时候,passenger 服务器会将这个请求转发给一个 worker 进程来处理这个请求,passenger 这个服务器是由很多个进程组成的,这些进程共同实现了服务器的基本功能-----转发请求,等待回应,将 rsponse 转发给上层的 nginx 服务器;
- 当 worker 将请求转发给 rails 处理的时候......就不明白了。。。。。。。
问题:
- rails 是怎样运行起来的?是个单独的进程吗?是个服务器模型的进程吗?如果是个单独的进程,那么它是怎么样运行起来的?里面有个 while true 之类的死循环来检测事件的到来以便处理吗?
- rails 直接面对的是 passenger 之类的中间层服务器,他们是怎样进行数据通信的?passenger 是怎么样把自己的请求转发给 rails 的?rack?
- rack?rack 是个常住进程吗?为什么 rack 这个接口规范却可以传递数据?怎样做到的?
- passenger 在启动 worker 进程的时候,会把 rails 加载到 worker 的进程空间里面,怎么做到的?
补充:
我们其实完全不用这么麻烦,用那么多的中间件一起来构成一个 Web server。也可以完全使用纯的 ruby 来实现一个 web server:自己启动之后,监听在一个端口上面,等待 http 请求的到来,解析 http,自己处理,然后回复。这样的话,这个用纯 ruby 写成的 web server 在操作系统的眼里就是一个普通的进程而已。那么 rails 这个框架,从操作系统的角度看,它是什么呢?