(一)Nginx 基础概念 Part1
(一)Nginx 基础概念 Part1
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
Nginx 的三个主要应用场景
静态资源服务通过本地文件系统提供服务
静态资源服务是指通过本地文件系统提供静态文件(如 HTML、CSS、JavaScript、图片等)的服务。这种服务通常由 Web 服务器来提供,比如 Nginx、Apache 等。
静态资源服务的实现原理很简单,当客户端请求静态资源时,服务器会根据请求的 URL 路径找到对应的文件,并将文件内容返回给客户端。这个过程不需要进行动态处理,因此可以提高服务的性能和响应速度。
在 Nginx 中配置静态资源服务非常简单,只需要在配置文件中指定静态资源的根目录即可。例如,以下是一个简单的 Nginx 配置示例:
1 | server { |
上述配置中,root
指定了静态资源的根目录,location /
表示所有请求都会被该配置块处理。try_files
指令用于尝试查找请求的文件,如果找到则返回文件内容,否则返回 404 错误。
反向代理服务
反向代理是一种服务器架构模式,它将客户端的请求转发给后端的多个服务器进行处理,并将处理结果返回给客户端。与正向代理不同,反向代理是对服务器端的资源进行代理,客户端并不知道请求的资源实际上是由哪个服务器提供的。
反向代理的主要作用是负载均衡和提高系统的可靠性和安全性。通过将请求分发给多个后端服务器,可以均衡服务器的负载,提高系统的并发处理能力。同时,反向代理还可以隐藏后端服务器的真实 IP 地址,增加系统的安全性。
Nginx 是一款常用的反向代理服务器,它具有高性能、高并发处理能力和灵活的配置选项。在 Nginx 中配置反向代理非常简单,只需要在配置文件中指定后端服务器的地址即可。以下是一个简单的 Nginx 反向代理配置示例:
1 | server { |
上述配置中,proxy_pass
指令用于指定后端服务器的地址,可以是 IP 地址或域名。当客户端发送请求时,Nginx 会将请求转发给后端服务器,并将后端服务器的响应返回给客户端。
缓存
Nginx 具有强大的性能缓存功能,可以有效提高网站的访问速度和性能。Nginx 的性能缓存主要包括两个方面:静态文件缓存和反向代理缓存。
静态文件缓存是指将静态文件(如 HTML、CSS、JavaScript、图片等)缓存到内存中,当客户端请求这些文件时,直接从缓存中返回,而不需要再次读取文件。这样可以大大减少文件的读取时间,提高网站的响应速度。
反向代理缓存是指将后端服务器的响应结果缓存到内存中,当客户端发送相同的请求时,直接从缓存中返回响应结果,而不需要再次请求后端服务器。这样可以减少对后端服务器的访问压力,提高系统的并发处理能力。
Nginx 的缓存配置非常灵活,可以根据需要进行配置。可以设置缓存的有效期、缓存的大小、缓存的存储位置等。以下是一个简单的 Nginx 缓存配置示例:
1 | http { |
上述配置中,proxy_cache_path
指令用于指定缓存的存储位置和大小。proxy_cache
指令用于启用缓存,proxy_cache_valid
指令用于设置缓存的有效期。proxy_cache_use_stale
指令用于指定在后端服务器不可用时是否使用过期的缓存。proxy_cache_bypass
和 proxy_no_cache
指令用于控制缓存的使用条件。
负载均衡
负载均衡是指将客户端的请求分发给多个服务器进行处理,以达到均衡服务器负载、提高系统性能和可靠性的目的。负载均衡可以通过多种方式实现,包括硬件负载均衡器、软件负载均衡器和 DNS 负载均衡等。
Nginx 是一款常用的软件负载均衡器,它具有高性能、高并发处理能力和灵活的配置选项。在 Nginx 中配置负载均衡非常简单,只需要在配置文件中指定后端服务器的地址即可。以下是一个简单的 Nginx 负载均衡配置示例:
1 | http { |
上述配置中,upstream
指令用于定义后端服务器的地址,可以是 IP 地址或域名。proxy_pass
指令用于将请求转发给后端服务器。当客户端发送请求时,Nginx 会根据一定的负载均衡算法选择一个后端服务器进行处理。
Nginx 支持多种负载均衡算法,包括轮询、IP 哈希、最少连接数等。可以根据实际需求选择合适的负载均衡算法。
API 服务
API(Application Programming Interface)服务是指通过接口提供的一组功能和服务,用于与其他软件系统进行交互和通信。API 服务通常用于实现不同系统之间的数据传输和功能调用。
API 服务可以通过多种方式实现,包括 RESTful API、SOAP API、GraphQL 等。其中,RESTful
API 是一种常用的 API 设计风格,它使用 HTTP 协议进行通信,通过 URL 和 HTTP 方法来表示资源和操作。
在实现 API 服务时,需要考虑以下几个方面:
- 接口设计:定义 API 的资源和操作,包括 URL 路径、HTTP 方法、请求参数、响应格式等。
- 授权认证:保护 API 的安全性,限制只有授权用户才能访问 API。
- 数据传输:API 服务通常需要与数据库或其他系统进行数据交互,需要考虑数据传输的方式和格式。
- 错误处理:处理 API 请求过程中可能出现的错误,返回合适的错误码和错误信息。
在实际开发中,可以使用框架来简化 API 服务的实现。例如,使用 Spring Boot 可以快速搭建 RESTful API 服务,使用 Express 可以快速搭建 Node.js
API 服务。
OpenResty
OpenResty 是一个基于 Nginx 的高性能 Web 应用服务器,它将 Nginx 与 Lua 脚本语言集成在一起,提供了强大的扩展能力和灵活的配置选项。
OpenResty 的主要特点包括:
- 高性能:OpenResty 基于 Nginx,具有高性能和高并发处理能力。
- 扩展能力:OpenResty 使用 Lua 脚本语言作为扩展语言,可以通过编写 Lua 脚本来实现自定义的功能和逻辑。
- 灵活配置:OpenResty 的配置文件采用 Nginx 的配置语法,可以灵活配置各种功能和选项。
- 动态模块:OpenResty 支持动态加载模块,可以根据需要加载和卸载模块,提高系统的灵活性和可维护性。
使用 OpenResty 可以实现各种功能,包括反向代理、负载均衡、API 服务、静态资源服务等。通过编写 Lua 脚本,可以实现自定义的功能和逻辑,如访问控制、请求转发、数据处理等。
OpenResty 的安装和配置相对简单,可以根据官方文档进行操作。在实际开发中,可以根据需求选择合适的功能和配置选项,编写 Lua 脚本来实现自定义的功能。
Nginx 出现的历史背景
Nginx 之所以出现,是因为互联网的数据量快速增长以及互联网的快速普及、全球化和物联网的发展。这些因素导致了对网络服务器的性能和效率要求越来越高。
在过去,Apache 是最常用的 Web 服务器软件之一。然而,Apache 的架构是基于每个连接对应一个进程的模型,这种模型在面对大量并发连接时效率较低。由于摩尔定律的存在,硬件性能不断提升,但 Apache 的架构并没有跟上硬件性能的发展。
Nginx 的出现正是为了解决 Apache 的性能问题。Nginx 采用了事件驱动的异步非阻塞架构,可以处理大量并发连接而不会消耗过多的系统资源。它使用少量的线程来处理多个连接,而不是为每个连接创建一个进程。这种架构使得 Nginx 在高并发场景下表现出色,能够更好地应对互联网数据量的快速增长。
此外,Nginx 还具有高度可扩展性和灵活性,可以作为反向代理服务器、负载均衡器和静态文件服务器等多种用途。它还支持动态模块的扩展,可以根据实际需求进行功能扩展和定制。
总结来说,Nginx 之所以出现,是为了满足互联网数据量快速增长和高并发连接的需求,以及解决 Apache 在处理大量并发连接时的性能问题。它的异步非阻塞架构和高度可扩展性使得它成为了互联网领域中非常重要的服务器软件之一。
为什么用 Nginx?
高并发,高性能
:Nginx 采用了事件驱动的异步非阻塞架构,能够处理大量并发连接,而且在高负载情况下仍然能够保持较低的资源消耗。它的事件驱动模型使得它能够更好地处理并发请求,提供更高的吞吐量和更低的延迟。主流的 32 核心 64G 内存的服务器,可以轻松达到数千万并发请求连接,处理静态资源可以达到一千万的 RPS。可扩展性好:Nginx 的设计使得它非常适合构建可扩展的系统。它可以作为负载均衡器,将请求分发到多个后端服务器上,从而实现水平扩展。此外,Nginx 还支持动态模块加载,可以根据需要添加或删除模块,方便扩展功能。
高可靠性
:Nginx 具有出色的稳定性和可靠性。它采用了多进程或多线程的工作模式,每个进程或线程都是独立的,一个进程或线程的崩溃不会影响其他进程或线程的正常工作。此外,Nginx 还具有自动故障恢复和自动重启功能,可以在出现故障时保持服务的可用性。热部署:Nginx 支持热部署,即在不停止服务的情况下更新配置文件或模块。这意味着可以在不影响用户访问的情况下进行系统配置的更改或升级。
BSD 许可证:Nginx 采用 BSD 许可证,这意味着它可以免费使用,并且可以自由修改和分发。BSD 许可证还允许将 Nginx 用于商业目的,而无需公开源代码。
综上所述,Nginx 具有高并发、高性能、可扩展性好、高可靠性和热部署等优点,使得它成为构建高性能、可靠的 Web 应用程序和服务的理想选择。
Nginx 的组成
- Nginx
二进制可执行文件:这是 Nginx 的核心组件,它是一个独立的可执行文件,负责接收和处理客户端的请求,并将请求转发给后端的服务器。Nginx 的二进制可执行文件通常位于操作系统的可执行文件路径中,比如/usr/sbin/nginx
。
Nginx.conf 配置文件:这是 Nginx 的主要配置文件,用于配置 Nginx 服务器的各种参数和行为。Nginx.conf 文件包含了全局配置、http 模块配置、server 模块配置等多个部分,可以通过编辑该文件来定制 Nginx 服务器的行为。
access.log 访问日志:Nginx 会将每个客户端的请求记录到 access.log 文件中,该文件记录了客户端的 IP 地址、访问时间、请求的 URL、HTTP 状态码等信息。通过查看 access.log 文件,可以了解到 Nginx 服务器的访问情况,对于排查问题和分析性能非常有帮助。
error.log 错误日志:Nginx 会将服务器的错误信息记录到 error.log 文件中,该文件记录了 Nginx 服务器在处理请求过程中出现的错误,比如请求超时、后端服务器连接失败等。通过查看 error.log 文件,可以及时发现和解决服务器的问题。
除了以上几个组成部分,Nginx 还可以通过加载各种模块来扩展其功能,比如 HTTP 模块、SSL 模块、缓存模块等。这些模块可以通过在 Nginx.conf 配置文件中进行配置和加载。
Nginx 版本
- Nginx 0.1.0:这是 Nginx 的第一个版本,发布于 2004 年 10 月 4 日。这个版本只支持基本的 HTTP 功能。
- Nginx 0.2.0:发布于 2004 年 10 月 10 日,这个版本增加了对 FastCGI 的支持。
- Nginx 0.3.0:发布于 2004 年 10 月 26 日,这个版本增加了对代理服务器的支持。
- Nginx 0.4.0:发布于 2004 年 11 月 9 日,这个版本增加了对 SSL 的支持。
- Nginx 0.5.0:发布于 2005 年 1 月 4 日,这个版本增加了对虚拟主机的支持。
- Nginx 0.6.0:发布于 2006 年 4 月 4 日,这个版本增加了对缓存的支持。
- Nginx 0.7.0:发布于 2008 年 5 月 6 日,这个版本增加了对 HTTP 流的支持。
- Nginx 0.8.0:发布于 2010 年 6 月 8 日,这个版本增加了对异步文件 IO 的支持。
- Nginx 1.0.0:发布于 2011 年 4 月 12 日,这个版本是 Nginx 的第一个稳定版本。
- Nginx 1.2.0:发布于 2012 年 4 月 24 日,这个版本增加了对 IPv6 的支持。
- Nginx 1.4.0:发布于 2013 年 4 月 24 日,这个版本增加了对 SPDY 的支持。
- Nginx 1.6.0:发布于 2014 年 4 月 24 日,这个版本增加了对 HTTP/1.1 的支持。
- Nginx 1.8.0:发布于 2015 年 4 月 21 日,这个版本增加了对 HTTP/2 的支持。
- Nginx 1.10.0:发布于 2016 年 4 月 26 日,这个版本增加了对 TLS SNI 的支持。
- Nginx 1.12.0:发布于 2017 年 4 月 12 日,这个版本增加了对 TLS 1.3 的支持。
- Nginx 1.14.0:发布于 2018 年 4 月 17 日,这个版本增加了对动态模块的支持。
- Nginx 1.16.0:发布于 2019 年 4 月 23 日,这个版本增加了对 gRPC 的支持。
- Nginx 1.18.0:发布于 2020 年 4 月 21 日,这个版本增加了对 HTTP/3 的支持。
- Nginx 1.19.1:发布于 2020 年 7 月 7 日。
- Nginx 1.20.0:发布于 2021 年 4 月 20 日。
- Nginx 1.21.0:发布于 2021 年 7 月 12 日。
- Nginx 1.22.1:发布于 2022 年 5 月 24 日。
Nginx 的版本号由三个数字组成,格式为 主版本号. 次版本号. 修订版本号
。例如,1.18.0 是一个典型的 Nginx 版本号。
- 主版本号:当 Nginx 的主要功能发生重大变化或者有不兼容的改动时,主版本号会增加。这意味着新版本可能需要用户进行一些修改或者配置调整才能正常使用。
- 次版本号:当 Nginx 的功能有较大的增强或者有一些新特性添加时,次版本号会增加。这些新特性通常不会破坏现有的配置和使用方式。
- 修订版本号:当 Nginx 进行一些错误修复、性能优化或者其他小的改动时,修订版本号会增加。这些改动通常不会引入新的功能或者破坏现有的配置。
通常情况下,我们可以通过查看 Nginx 的版本号来了解其功能和改动情况。比如,如果版本号的主版本号发生了变化,那么可能需要注意一些不兼容的改动;如果版本号的次版本号增加了,那么可能有一些新的功能或者特性可以使用;如果版本号的修订版本号增加了,那么可能有一些错误修复或者性能优化。
如何选择 Nginx 版本
开源免费版 Nginx:
- 这是最常见的 Nginx 版本,也是最广泛使用的版本。
- 它是一个高性能的 HTTP 和反向代理服务器,可以用于负载均衡、静态资源缓存、反向代理等场景。
- 开源免费版 Nginx 具有稳定性高、性能优越、配置简单等特点。
- 它提供了丰富的模块和插件,可以满足大部分的需求。
- 如果你只需要基本的 HTTP 和反向代理功能,并且对商业支持没有特别的需求,那么开源免费版 Nginx 是一个不错的选择。
商业版 Nginx Plus:
- 商业版 Nginx Plus 是由 Nginx 官方提供的增强版 Nginx。
- 它在开源版本的基础上增加了一些高级功能和工具,如负载均衡算法、健康检查、实时监控、高级缓存等。
- 商业版 Nginx Plus 还提供了商业支持和服务,包括技术支持、紧急修复、性能优化等。
- 如果你需要更高级的功能和更可靠的商业支持,可以考虑使用商业版 Nginx Plus。
阿里巴巴 Tengine:
- Tengine 是由阿里巴巴集团开发的 Nginx 衍生版本。
- 它在官方主干版本的基础上进行了一些修改和优化,以适应阿里巴巴的特定需求。
- Tengine 在性能和稳定性方面与官方版本相当,但可能会有一些额外的功能和特性。
- 如果你是阿里巴巴的用户,或者对 Tengine 的特定功能有需求,可以考虑使用阿里巴巴 Tengine。
OpenResty:
- OpenResty 是一个基于 Nginx 和 Lua 的 Web 应用服务器。
- 它将 Nginx 作为核心,通过 Lua 脚本扩展了 Nginx 的功能,使其可以处理动态请求和业务逻辑。
- OpenResty 适用于需要在 Nginx 上编写复杂的业务逻辑的场景,如 API 网关、微服务架构等。
- 如果你需要在 Nginx 上编写复杂的业务逻辑,可以考虑使用 OpenResty。
综上所述,选择哪个版本的 Nginx 取决于你的具体需求和使用场景。如果你只需要基本的 HTTP 和反向代理功能,开源免费版 Nginx 是一个不错的选择。如果你需要更高级的功能和商业支持,可以考虑商业版 Nginx
Plus。如果你是阿里巴巴的用户或对 Tengine 的特定功能有需求,可以考虑使用阿里巴巴 Tengine。如果你需要在 Nginx 上编写复杂的业务逻辑,可以考虑使用 OpenResty。