nginx 初步了解
了解 nginx
nginx 发音为 engine-x
,是一个 web 服务器,同时具备反向代理、负载均衡、静态资源服务的功能,也可以用作邮件代理、HTTP 缓存。
web 服务器基本功能:基于 REST 架构风格,以 URI 作为沟通依据,通过 HTTP 为浏览器等客户端程序提供各种网络服务。
nginx 设计目标是解决 C10K 问题,它的关键特点包括:占用内存少、并发处理能力强、良好的扩展性和可靠性。
nginx 的竞争对手:Apache
、Lighttpd
、Tomcat
、Jetty
、IIS
早期服务器特点
在当时的设计阶段,就受到很多局限,比如互联网规模、网络带宽、产品特点,并且各自的定位与发展方向都不尽相同,使得每款服务器的特点与应用场合比较鲜明。
Apache 优点是稳定、开源、跨平台,但由于时代原因被设计成了一个重量级、不支持高并发的 web 服务器。
nginx 的出现背景
- 互联网的数据量快速增长:互联网快速普及、全球化、物联网、对硬件性能提出了更高的要求
- 摩尔定律:摩尔定律失效、使用多核 cpu 性能不会线性提升、操作系统和大量软件没有做好服务于多核架构的准备
- 低效的 apache 服务器
由于 nginx 基于事件驱动的架构,能够并发处理百万级别的 TCP 连接,高度模块化的设计,自由的许可证使得扩展 nginx 功能的第三方模块层出不穷,优秀的设计带来了极佳的稳定性,因此作为 web 服务器被广泛应用。
为什么选择 nginx
1)更快
表现在 2 方面:
- 在正常情况下,单次请求会得到更快的响应
- 高峰期,可以比其他 web 服务器更快地响应请求
2)高扩展性
- nginx 设计极具扩展性,完全由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。
- 这使得 nginx 生态圈异常丰富,大量的官方和第三方模块,轻松实现各种场景下的定制化需求。
- 功能特性丰富除了 web 服务器基本功能,还支持反向代理、负载均衡、邮件代理、缓存等功能;
3)高可靠性
nginx 高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性。每个 worker 进程相对独立,master 进程在 1 个 worker 进程出错时可以快速拉起新的 worker 子进程提供服务
4)低内存消耗
一般情况下,10000 个非活跃的 http keep-alive 连接在 nginx 中仅消耗 2.5M
内存
5)单机支持 10 万以上的并发连接
nginx 支持的并发连接取决于内存,远不止 10 万,也与业务特点紧密相关的。对硬件和操作系统内核特性的深度挖掘,实现了高并发的同时保持了高吞吐量。软件层面,nginx 没有阻塞进程使之睡眠的代码,完全基于事件驱动
6)跨平台
可运行在 Linux、FreeBSD、Solaris、AIX、MacOS、Windows 等操作系统
7)热部署
nginx 支持热部署功能,可以在 7*24 小时不间断服务前提下,升级 nginx 的可执行文件。也支持不停止服务就更新配置项、更换日志文件等功能。
8)最自由的BSD许可协议
这是 nginx 可以快速发展的强大动力。
选择 nginx 核心的理由:它能在支持高并发请求的同时保持高效的服务。
在低并发压力下,用户可以获得高速体验,而在高并发压力下,更多的用户都能接入,可能访问速度会下降。
为什么学习nginx
在很多大型网站和互联网公司,nginx 被广泛应用,成为互联网公司的标准组件。掌握了 nginx,不管你是做什么类型 IT 工作,都会让你受益匪浅。
基于 nginx 框架开发程序的优势
- nginx 将网络、磁盘、定时器等异步事件的驱动都做了非常好的封装,基于它将可以忽略这些事件处理的细节;
- nginx 封装了许多平台无关的接口、容器,适用于跨平台开发;
- 优秀的模块化设计,使得开发者可以轻易复用各种已有的模块,包括基本的读取配置、记录日志等模块,也包括处理请求的 HTTP、Mail 等高级功能模块;
- nginx 是作为服务器来设计其框架的,在服务器进程的管理上相当出色;
- nginx 充分考虑到各操作系统所擅长的「绝活」,能够使用特殊的系统调用更高效完成任务时,绝不会去使用低效的通用接口,对 Linux 操作系统 nginx 不遗余力地做了大量优化;
完全基于事件驱动的服务器开发效率往往很不理想,它们要处理的事件过于底层化、细节化,使得各功能模块无法聚焦于业务,最终产品的功能都较为单一,不会有丰富的可选功能。
nginx 由于在软件架构上的优秀设计,使得 nginx 完全由许多简单的模块构成,各模块不用介入底层细节,在尽享分阶段、无阻塞的事件驱动架构下,可以专注于业务功能的实现,这样为 nginx 带来了大量的官方、第三方的功能模块,使得功能同样强大的 nginx 在产品核心位置上足以担当重任,经受住海量请求的考验。
从 nginx 可以额外吸收的营养知识
- http协议和服务器是如何实现的
- 网络编程的知识
- 简直就是 c 教科书
- 代码阅读能力
- 良好的开发习惯
- 锻炼逻辑能力
- 学习巧妙的程序设计
- 性能优化是如何做的
使用场景
应用服务要求开发效率特别高,所以运行效率是很低的,qps/tps/并发都是受限的,所以需要把很多这样的应用服务组织成一个集群,向用户提供高可用性;
应用服务构成集群一定会产生两个需求:动态扩容和冗灾;
最终目标
- nginx 架构的深入理解
- nginx 配置的熟练掌握
- nginx 功能的熟练掌握
- nginx 模块的高效开发
- nginx 核心的源码分析
- nginx 问题的故障排查
- nginx 开源的代码贡献
学习路径
掌握高效的学习方法,可以事半功倍。
- 选择优质的学习资料。尽量不看博客、公众号文章,通过源码、官方文档来学习;
- 带着问题去学,更高效。结合当前学习程度,先抛出具体的问题,在问题中学习,多思考、深入思考、多问为什么,这样效果更好、印象更深;
- 理论结合实践。学习的过程中,调试代码、改代码、写模块,验证你的想法和理解;
存在问题
nginx 模块化设计,涌现了很多的第三方模块,推动了社区的发展,但也因为这些让 nginx 的 API 不能轻易改动,更不用说架构了。
20 年前互联网没这么复杂,reload 完全不是问题。但是现在长连接业务已经变的很常见,这就成为一个明显的问题了。