我知道Nginx是事件驱动而不是基于分离进程的。同时Nginx可以通过uWSGI,FastCGI等协议来Hold住PHP/Py/RoR构建的Web App。请问当这种情况下,业务逻辑本身怎么能够变成事件驱动呢?还是说只能用C写一个业务逻辑的Module,集成进Nginx里面才行?本人刚刚接触Web Server等概念,对此一直想不通。
1
Septembers 2015-05-10 17:48:32 +08:00
你需要先了解Event Loop
see http://en.wikipedia.org/wiki/Event_loop |
2
KyL OP @Septembers 你的意思是Nginx是一个Dispatcher,Web App是Callback function?
|
3
ryd994 2015-05-10 23:06:36 +08:00 via Android
Nginx都已经处理好了,为什么要把后端也事件驱动?要是那样的话要Nginx何用?
|
4
Septembers 2015-05-11 00:01:17 +08:00 via Android
@ryd994 nginx作为 前端 能起到 流量整形 的作用
|
5
holulu 2015-05-11 09:33:41 +08:00
nginx 只负责前台请求的处理和转发,和后台没有关系的。如果后台用 PHP/Py/RoR ,还是按照它们自身的方式来运行,也就是本来是多进程就还是多进程,本来是多线程就还是多线程,不会因为用了 nginx 就改变的。
|
6
KyL OP @holulu 也就是说有多少个Requests进来,后天的PHP就会开多少个进程来处理Requests?那么Nginx本身的优势是什么?仅仅是转发的话,应该也消耗不了多少资源吧?
|
7
luciferlu 2015-05-11 10:32:14 +08:00
后端是单节点时,多进程能够充分利用CPU多核的资源。当后端是多节点时,Nginx可以将request按照配置的负载均衡策略分发到后端多个节点上,当然多节点时,每节点可以运行多个进程。反向代理本身的逻辑很简单,是重度网络IO的应用。基于事件的异步IO,Nginx能够比同步IO多得多的并发。后端的应用可以根据应用的特性以及开发的难度,来决定是否使用事件驱动。我认为如果重点是业务逻辑及计算,没有必要为了事件驱动而增加开发的复杂度,带来更多的不定因素。如果是处理大量并发,IO的应用,事件处理能够提高单进程的处理能力,节省硬件资源
|
8
holulu 2015-05-11 10:52:47 +08:00
@KyL 就是做转发。如果后台是多机器了,也可以做负载均衡。还可以限制请求速率,对请求和响应做些修改等等。其实这些都是转发附带的功能了。
nginx 的优势就是解决 C10K 问题,同时接受大量请求。例如做负载均衡的时候,就是一台 nginx 的机器就可以负责给后台几十机器做转发了。 |
9
KyL OP @holulu 如果是单机Server的话,每个Request,PHP都要开一个进程的话,那么Nginx相对于Apache有什么优势呢?还是差不多?
|
10
holulu 2015-05-11 14:24:00 +08:00
@KyL 如果 PHP 的话,看用什么方式吧,可以是 Apache 一起来处理 PHP ,也可以 Apache 转发给 PHP 来处理。如果 Apache 处理的话,如果 PHP 程序有问题 ,就连累到 Apache ;如果是转发的话,除了 PHP 开一个进程来处理之外,Apache 也要开一个进程来处理这个连接,而 nginx 则是一个 worker 进程可以处理多个连接
|
11
julyclyde 2015-05-11 17:02:13 +08:00
不存在“它运行的”什么东西。它只是通信转发而已,通信这部分是event loop的
|
13
mkeith 2015-05-20 15:01:31 +08:00
woker 约等于 CPU的个数
|