1. apache,nginx一般用来做http静态资源服务器,前者是同步IO,来一个请求就拿一个线程去处理;后者是基于epoll的异步IO,用一个线程"接待"所有请求。所以前者稳定但是对机器要求较高,后者不适合计算密集型工作但是单机即可有很强的并发能力。
注意接待这个词。一个请求过程包括:请求,处理,响应,这三个阶段。这里的接待是指第1,3阶段,至于第2阶段依然是多个线程去处理
2. tomcat一般是配合java技术栈使用,它本身是一个http容器,就是替你基于http协议文本生成http的req/res对象,并把这些对象交给java servlet来实现动态能力。至于IO,基于tomcat的java服务器,除了动态性,跟apache没啥区别。
3. nodejs自身就可以实现一个http服务器,不需要借助外部容器。另外它的事件循环也是基于epoll的,所以它可以理解成内嵌v8 js引擎的nginx,兼具动态性和单机高并发,但是问题也很nginx一样。(另外,node_modules可能也算是问题)
4. 另外漏了一个,netty,它是java的异步IO工具,这样java也可以实现单机高并发。
所以,总的看来,
1. 静态资源服务器,优先使用nginx
2. 计算密集型服务器,java
3. IO密集型服务器,java或者nodejs都行