Nginx – 《深入理解Nginx》作者-陶辉 访谈摘要
仅当需要并发处理万级别或以上的TCP连接时,才应当考虑Nginx
- 不要重复开发轮子,尤其Nginx轮子的开发难度还不低
- Nginx.conf里可以玩的花样很多(这由每一个Nginx模块决定,如ngx_lua这样的模块还可以在里面插入lua语法)
- Nginx进程里是拒绝任何阻塞操作的,这是因为模块都运行在IO核心处理线程中的。任何一个边缘化的模块都可能因为自己小小的阻塞调用毁掉Nginx的高性能。
- debug级别的error.log日志非常详尽,仅有它就可以定位出很多你的模块bug,别忘了使用它必须在编译时加入–with-debug
Nginx建议
首先,从最外面看Nginx是什么样的,了解进程模型、配置文件语法、基本功能等
其次,从尝试编写最简单的http模块入手,渐渐地使用到Nginx Http框架的一些高级特性,了解Nginx的内存池、各数据结构的用法等;
再次,系统的了解Nginx框架,包括它如何启动、如何停止、如何升级、如何重载配置,多进程间如何负载均衡,http连接的建立、URL与包头的收取、解析、选用哪些http模块处理请求、如何向客户端回响应等
了解异步事件框架,理解松耦合设计与web请求的处理方式
高性能服务器设计经验
- 单组件的性能提升上,算法最重要:特别是越前沿的技术、场景,通用算法的功效距离期望值就越远
- 能够并行处理的绝对不要串行化,谨慎加锁,提高吞吐量
- 操作系统、设备、TCP协议、内存池、缓存
- 协程是一个很好的方向,通过创建协程栈来伪造线程开发环境提升开发效率,通过改变底层阻塞API的实现来提升吞吐量、运行效率
- 分布式系统的ACP是一个权衡问题,适当的牺牲一致性是常见解决方案
- 开发大型系统时组件间的高内聚松耦合很重要
- 分布式数据库的事务
Ngnix的不足
- 以nginx.conf中的配置来定义web请求的动态处理流程,但只能处理大众化的需求
- nginx模块的开发门槛还挺高,需要开发者对于服务器的非阻塞调用、事件模型有较深的理解
- 开发者不能使用简单的堆分配对象,而要使用nginx_slab管理内存
- 目前nginx最应该完善的应当是二次开发的易用性–能够更方便、快速的开发出高性能的nginx模块
Ngnix的未来
- 服务器资源的效率在企业成本上将占据越发重要的地位,Apache的市场份额被Nginx取代的趋势是不会变的