作者回复: www是“主机名”,也就是表示这台主机用于提供万维网服务。
但现在大部分互联网上的主机都是http服务器,所以www现在只是一个“历史习惯”了,比如极客时间的网站“time.geekbang.org”,虽然不是www,但也是http服务。
不带www是域名的一种简化,通常会使用重定向跳转到其他的域名。
作者回复: 英文是I/O multiplexing,就是指多个I/O请求“复用”到一个进程或线程里处理,而不是开多个进程、线程处理。
可以看示意图再体会一下。
作者回复: 对。
作者回复:
1.基本正确,但同步阻塞的时候是这个线程被阻塞了,操作系统会把这个线程切换出去干别的,不会耗cpu,相当于这个线程没有充分利用cpu给它的资源。
2.同步非阻塞,是线程自己主动切换cpu给其他任务,但并没有让出cpu给其他线程或进程,因为在用户态,所以成本低,底层是epoll和Nginx的事件机制。
3.有超时机制,超时就会任务执行失败,不会死锁。
4.OpenResty的代码都是同步非阻塞的。
作者回复: 可以看实体书《OpenResty完全开发指南》。
作者回复: good
作者回复: 基本正确。不过Nginx里没有使用协程,它使用的是epoll的事件机制,向epoll注册socket的读写事件,当socket可读可写时调用响应的处理函数。
你说的协程是应用在OpenResty的Lua虚拟机里。
作者回复: OpenResty现在已经是一个成熟的Web开发生态体系了,已经有很多商业公司基于OpenResty开发各种业务应用,底层的LuaJIT性能很高,保证了它的运行效率。
njs现在还是处于起步阶段,功能比较弱,Nginx对它的定位是“可编程配置语言”,关注点还是在辅助Nginx,而不是用来开发复杂的业务逻辑。
还有很重要的一点是OpenResty里的LuaJIT支持FFI,可以直接调用C接口,扩展性极高,而njs这方面的能力为零,只能限制在vm里。
作者回复: 说的挺好。
其实Nginx最初的模块设计就是想把配置文件弄成语言的形式,通过模块实现指令来增加语言里的词汇,但Nginx的配置文件修改后必须重启,而且C模块开发太麻烦。
OpenResty引入Lua后C模块开发的就越来越少了,因为脚本语言比简单的指令更灵活,开发的成本也更低。
作者回复: 目前是这样,需要操作系统底层有epoll、kqueue等系统调用,然后基于这些系统调用实现reactor、proactor等模式,也就是多路复用。
作者回复: Android系统不了解,欢迎补充。