Linux教程网

nginx 初步了解

了解 nginx

nginx 发音为 engine-x,是一个 web 服务器,同时具备反向代理负载均衡静态资源服务的功能,也可以用作邮件代理HTTP 缓存

web 服务器基本功能:基于 REST 架构风格,以 URI 作为沟通依据,通过 HTTP 为浏览器等客户端程序提供各种网络服务。

nginx 设计目标是解决 C10K 问题,它的关键特点包括:占用内存少、并发处理能力强、良好的扩展性和可靠性。

nginx 的竞争对手:ApacheLighttpdTomcatJettyIIS

早期服务器特点

在当时的设计阶段,就受到很多局限,比如互联网规模、网络带宽、产品特点,并且各自的定位与发展方向都不尽相同,使得每款服务器的特点与应用场合比较鲜明。

Apache 优点是稳定、开源、跨平台,但由于时代原因被设计成了一个重量级、不支持高并发的 web 服务器。

nginx 的出现背景

  • 互联网的数据量快速增长:互联网快速普及、全球化、物联网、对硬件性能提出了更高的要求
  • 摩尔定律:摩尔定律失效、使用多核 cpu 性能不会线性提升、操作系统和大量软件没有做好服务于多核架构的准备
  • 低效的 apache 服务器

由于 nginx 基于事件驱动的架构,能够并发处理百万级别的 TCP 连接,高度模块化的设计,自由的许可证使得扩展 nginx 功能的第三方模块层出不穷,优秀的设计带来了极佳的稳定性,因此作为 web 服务器被广泛应用。

为什么选择 nginx

1)更快

表现在 2 方面:

  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 完全不是问题。但是现在长连接业务已经变的很常见,这就成为一个明显的问题了。


专题:

本文发表于 2023-01-04,最后修改于 2024-06-23。

本站永久域名「 golinuxblog.com 」,也可搜索「 Linux教程网 」找到我。


上一篇 « 值得收藏优秀的文章 下一篇 » nginx 准备工作

推荐阅读

Big Image