【Nginx系列】(一)Nginx基础概念

2023-09-20 08:56:13

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址

文章更新计划

系列文章地址


Nginx的三个主要应用场景

alt

静态资源服务通过本地文件系统提供服务

静态资源服务是指通过本地文件系统提供静态文件(如HTML、CSS、JavaScript、图片等)的服务。这种服务通常由Web服务器来提供,比如Nginx、Apache等。

静态资源服务的实现原理很简单,当客户端请求静态资源时,服务器会根据请求的URL路径找到对应的文件,并将文件内容返回给客户端。这个过程不需要进行动态处理,因此可以提高服务的性能和响应速度。

在Nginx中配置静态资源服务非常简单,只需要在配置文件中指定静态资源的根目录即可。例如,以下是一个简单的Nginx配置示例:

server {
    listen 80;
    server_name example.com;

    root /path/to/static/files;

    location / {
        try_files $uri $uri/ =404;
    }
}

上述配置中,root指定了静态资源的根目录,location /表示所有请求都会被该配置块处理。try_files 指令用于尝试查找请求的文件,如果找到则返回文件内容,否则返回404错误。

反向代理服务

反向代理是一种服务器架构模式,它将客户端的请求转发给后端的多个服务器进行处理,并将处理结果返回给客户端。与正向代理不同,反向代理是对服务器端的资源进行代理,客户端并不知道请求的资源实际上是由哪个服务器提供的。

反向代理的主要作用是负载均衡和提高系统的可靠性和安全性。通过将请求分发给多个后端服务器,可以均衡服务器的负载,提高系统的并发处理能力。同时,反向代理还可以隐藏后端服务器的真实IP地址,增加系统的安全性。

Nginx是一款常用的反向代理服务器,它具有高性能、高并发处理能力和灵活的配置选项。在Nginx中配置反向代理非常简单,只需要在配置文件中指定后端服务器的地址即可。以下是一个简单的Nginx反向代理配置示例:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
    }
}

上述配置中,proxy_pass指令用于指定后端服务器的地址,可以是IP地址或域名。当客户端发送请求时,Nginx会将请求转发给后端服务器,并将后端服务器的响应返回给客户端。

缓存

Nginx具有强大的性能缓存功能,可以有效提高网站的访问速度和性能。Nginx的性能缓存主要包括两个方面:静态文件缓存和反向代理缓存。

静态文件缓存是指将静态文件(如HTML、CSS、JavaScript、图片等)缓存到内存中,当客户端请求这些文件时,直接从缓存中返回,而不需要再次读取文件。这样可以大大减少文件的读取时间,提高网站的响应速度。

反向代理缓存是指将后端服务器的响应结果缓存到内存中,当客户端发送相同的请求时,直接从缓存中返回响应结果,而不需要再次请求后端服务器。这样可以减少对后端服务器的访问压力,提高系统的并发处理能力。

Nginx的缓存配置非常灵活,可以根据需要进行配置。可以设置缓存的有效期、缓存的大小、缓存的存储位置等。以下是一个简单的Nginx缓存配置示例:

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            proxy_cache_bypass $http_cache_control;
            proxy_no_cache $http_pragma $http_authorization;
            proxy_pass http://backend_server;
        }
    }
}

上述配置中,proxy_cache_path指令用于指定缓存的存储位置和大小。proxy_cache指令用于启用缓存,proxy_cache_valid 指令用于设置缓存的有效期。proxy_cache_use_stale指令用于指定在后端服务器不可用时是否使用过期的缓存。proxy_cache_bypassproxy_no_cache指令用于控制缓存的使用条件。

负载均衡

负载均衡是指将客户端的请求分发给多个服务器进行处理,以达到均衡服务器负载、提高系统性能和可靠性的目的。负载均衡可以通过多种方式实现,包括硬件负载均衡器、软件负载均衡器和DNS负载均衡等。

Nginx是一款常用的软件负载均衡器,它具有高性能、高并发处理能力和灵活的配置选项。在Nginx中配置负载均衡非常简单,只需要在配置文件中指定后端服务器的地址即可。以下是一个简单的Nginx负载均衡配置示例:

http {
    upstream backend_servers {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
        }
    }
}

上述配置中,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服务时,需要考虑以下几个方面:

  1. 接口设计:定义API的资源和操作,包括URL路径、HTTP方法、请求参数、响应格式等。
  2. 授权认证:保护API的安全性,限制只有授权用户才能访问API。
  3. 数据传输:API服务通常需要与数据库或其他系统进行数据交互,需要考虑数据传输的方式和格式。
  4. 错误处理:处理API请求过程中可能出现的错误,返回合适的错误码和错误信息。

在实际开发中,可以使用框架来简化API服务的实现。例如,使用Spring Boot可以快速搭建RESTful API服务,使用Express可以快速搭建Node.js API服务。

OpenResty

OpenResty是一个基于Nginx的高性能Web应用服务器,它将Nginx与Lua脚本语言集成在一起,提供了强大的扩展能力和灵活的配置选项。

OpenResty的主要特点包括:

  1. 高性能:OpenResty基于Nginx,具有高性能和高并发处理能力。
  2. 扩展能力:OpenResty使用Lua脚本语言作为扩展语言,可以通过编写Lua脚本来实现自定义的功能和逻辑。
  3. 灵活配置:OpenResty的配置文件采用Nginx的配置语法,可以灵活配置各种功能和选项。
  4. 动态模块:OpenResty支持动态加载模块,可以根据需要加载和卸载模块,提高系统的灵活性和可维护性。

使用OpenResty可以实现各种功能,包括反向代理、负载均衡、API服务、静态资源服务等。通过编写Lua脚本,可以实现自定义的功能和逻辑,如访问控制、请求转发、数据处理等。

OpenResty的安装和配置相对简单,可以根据官方文档进行操作。在实际开发中,可以根据需求选择合适的功能和配置选项,编写Lua脚本来实现自定义的功能。

Nginx出现的历史背景

Nginx之所以出现,是因为互联网的数据量快速增长以及互联网的快速普及、全球化和物联网的发展。这些因素导致了对网络服务器的性能和效率要求越来越高。

在过去,Apache是最常用的Web服务器软件之一。然而,Apache的架构是基于每个连接对应一个进程的模型,这种模型在面对大量并发连接时效率较低。由于摩尔定律的存在,硬件性能不断提升,但Apache的架构并没有跟上硬件性能的发展。

Nginx的出现正是为了解决Apache的性能问题。Nginx采用了事件驱动的异步非阻塞架构,可以处理大量并发连接而不会消耗过多的系统资源。它使用少量的线程来处理多个连接,而不是为每个连接创建一个进程。这种架构使得Nginx在高并发场景下表现出色,能够更好地应对互联网数据量的快速增长。

此外,Nginx还具有高度可扩展性和灵活性,可以作为反向代理服务器、负载均衡器和静态文件服务器等多种用途。它还支持动态模块的扩展,可以根据实际需求进行功能扩展和定制。

总结来说,Nginx之所以出现,是为了满足互联网数据量快速增长和高并发连接的需求,以及解决Apache在处理大量并发连接时的性能问题。它的异步非阻塞架构和高度可扩展性使得它成为了互联网领域中非常重要的服务器软件之一。

为什么用Nginx?

alt
  1. 「高并发,高性能」 :Nginx采用了事件驱动的异步非阻塞架构,能够处理大量并发连接,而且在高负载情况下仍然能够保持较低的资源消耗。它的事件驱动模型使得它能够更好地处理并发请求,提供更高的吞吐量和更低的延迟。主流的32核心64G内存的服务器,可以轻松达到数千万并发请求连接,处理静态资源可以达到一千万的RPS。

  2. 「可扩展性好」:Nginx的设计使得它非常适合构建可扩展的系统。它可以作为负载均衡器,将请求分发到多个后端服务器上,从而实现水平扩展。此外,Nginx还支持动态模块加载,可以根据需要添加或删除模块,方便扩展功能。

  3. 「高可靠性」 :Nginx具有出色的稳定性和可靠性。它采用了多进程或多线程的工作模式,每个进程或线程都是独立的,一个进程或线程的崩溃不会影响其他进程或线程的正常工作。此外,Nginx还具有自动故障恢复和自动重启功能,可以在出现故障时保持服务的可用性。

  4. 「热部署」:Nginx支持热部署,即在不停止服务的情况下更新配置文件或模块。这意味着可以在不影响用户访问的情况下进行系统配置的更改或升级。

  5. 「BSD许可证」:Nginx采用BSD许可证,这意味着它可以免费使用,并且可以自由修改和分发。BSD许可证还允许将Nginx用于商业目的,而无需公开源代码。

综上所述,Nginx具有高并发、高性能、可扩展性好、高可靠性和热部署等优点,使得它成为构建高性能、可靠的Web应用程序和服务的理想选择。

Nginx的组成

alt
  1. Nginx 二进制可执行文件:这是Nginx的核心组件,它是一个独立的可执行文件,负责接收和处理客户端的请求,并将请求转发给后端的服务器。Nginx的二进制可执行文件通常位于操作系统的可执行文件路径中,比如/usr/sbin/nginx

  2. Nginx.conf配置文件:这是Nginx的主要配置文件,用于配置Nginx服务器的各种参数和行为。Nginx.conf文件包含了全局配置、http模块配置、server模块配置等多个部分,可以通过编辑该文件来定制Nginx服务器的行为。

  3. access.log访问日志:Nginx会将每个客户端的请求记录到access.log文件中,该文件记录了客户端的IP地址、访问时间、请求的URL、HTTP状态码等信息。通过查看access.log文件,可以了解到Nginx服务器的访问情况,对于排查问题和分析性能非常有帮助。

  4. error.log错误日志:Nginx会将服务器的错误信息记录到error.log文件中,该文件记录了Nginx服务器在处理请求过程中出现的错误,比如请求超时、后端服务器连接失败等。通过查看error.log文件,可以及时发现和解决服务器的问题。

除了以上几个组成部分,Nginx还可以通过加载各种模块来扩展其功能,比如HTTP模块、SSL模块、缓存模块等。这些模块可以通过在Nginx.conf配置文件中进行配置和加载。

Nginx版本

  1. Nginx 0.1.0:这是Nginx的第一个版本,发布于2004年10月4日。这个版本只支持基本的HTTP功能。

  2. Nginx 0.2.0:发布于2004年10月10日,这个版本增加了对FastCGI的支持。

  3. Nginx 0.3.0:发布于2004年10月26日,这个版本增加了对代理服务器的支持。

  4. Nginx 0.4.0:发布于2004年11月9日,这个版本增加了对SSL的支持。

  5. Nginx 0.5.0:发布于2005年1月4日,这个版本增加了对虚拟主机的支持。

  6. Nginx 0.6.0:发布于2006年4月4日,这个版本增加了对缓存的支持。

  7. Nginx 0.7.0:发布于2008年5月6日,这个版本增加了对HTTP流的支持。

  8. Nginx 0.8.0:发布于2010年6月8日,这个版本增加了对异步文件IO的支持。

  9. Nginx 1.0.0:发布于2011年4月12日,这个版本是Nginx的第一个稳定版本。

  10. Nginx 1.2.0:发布于2012年4月24日,这个版本增加了对IPv6的支持。

  11. Nginx 1.4.0:发布于2013年4月24日,这个版本增加了对SPDY的支持。

  12. Nginx 1.6.0:发布于2014年4月24日,这个版本增加了对HTTP/1.1的支持。

  13. Nginx 1.8.0:发布于2015年4月21日,这个版本增加了对HTTP/2的支持。

  14. Nginx 1.10.0:发布于2016年4月26日,这个版本增加了对TLS SNI的支持。

  15. Nginx 1.12.0:发布于2017年4月12日,这个版本增加了对TLS 1.3的支持。

  16. Nginx 1.14.0:发布于2018年4月17日,这个版本增加了对动态模块的支持。

  17. Nginx 1.16.0:发布于2019年4月23日,这个版本增加了对gRPC的支持。

  18. Nginx 1.18.0:发布于2020年4月21日,这个版本增加了对HTTP/3的支持。

  19. Nginx 1.19.1:发布于2020年7月7日。

  20. Nginx 1.20.0:发布于2021年4月20日。

  21. Nginx 1.21.0:发布于2021年7月12日。

  22. Nginx 1.22.1:发布于2022年5月24日。

Nginx的版本号由三个数字组成,格式为主版本号.次版本号.修订版本号。例如,1.18.0是一个典型的Nginx版本号。

  • 主版本号:当Nginx的主要功能发生重大变化或者有不兼容的改动时,主版本号会增加。这意味着新版本可能需要用户进行一些修改或者配置调整才能正常使用。
  • 次版本号:当Nginx的功能有较大的增强或者有一些新特性添加时,次版本号会增加。这些新特性通常不会破坏现有的配置和使用方式。
  • 修订版本号:当Nginx进行一些错误修复、性能优化或者其他小的改动时,修订版本号会增加。这些改动通常不会引入新的功能或者破坏现有的配置。

通常情况下,我们可以通过查看Nginx的版本号来了解其功能和改动情况。比如,如果版本号的主版本号发生了变化,那么可能需要注意一些不兼容的改动;如果版本号的次版本号增加了,那么可能有一些新的功能或者特性可以使用;如果版本号的修订版本号增加了,那么可能有一些错误修复或者性能优化。

如何选择Nginx版本

  1. 开源免费版Nginx:

    • 这是最常见的Nginx版本,也是最广泛使用的版本。
    • 它是一个高性能的HTTP和反向代理服务器,可以用于负载均衡、静态资源缓存、反向代理等场景。
    • 开源免费版Nginx具有稳定性高、性能优越、配置简单等特点。
    • 它提供了丰富的模块和插件,可以满足大部分的需求。
    • 如果你只需要基本的HTTP和反向代理功能,并且对商业支持没有特别的需求,那么开源免费版Nginx是一个不错的选择。
  2. 商业版Nginx Plus:

    • 商业版Nginx Plus是由Nginx官方提供的增强版Nginx。
    • 它在开源版本的基础上增加了一些高级功能和工具,如负载均衡算法、健康检查、实时监控、高级缓存等。
    • 商业版Nginx Plus还提供了商业支持和服务,包括技术支持、紧急修复、性能优化等。
    • 如果你需要更高级的功能和更可靠的商业支持,可以考虑使用商业版Nginx Plus。
  3. 阿里巴巴Tengine:

    • Tengine是由阿里巴巴集团开发的Nginx衍生版本。
    • 它在官方主干版本的基础上进行了一些修改和优化,以适应阿里巴巴的特定需求。
    • Tengine在性能和稳定性方面与官方版本相当,但可能会有一些额外的功能和特性。
    • 如果你是阿里巴巴的用户,或者对Tengine的特定功能有需求,可以考虑使用阿里巴巴Tengine。
  4. OpenResty:

    • OpenResty是一个基于Nginx和Lua的Web应用服务器。
    • 它将Nginx作为核心,通过Lua脚本扩展了Nginx的功能,使其可以处理动态请求和业务逻辑。
    • OpenResty适用于需要在Nginx上编写复杂的业务逻辑的场景,如API网关、微服务架构等。
    • 如果你需要在Nginx上编写复杂的业务逻辑,可以考虑使用OpenResty。

综上所述,选择哪个版本的Nginx取决于你的具体需求和使用场景。如果你只需要基本的HTTP和反向代理功能,开源免费版Nginx是一个不错的选择。如果你需要更高级的功能和商业支持,可以考虑商业版Nginx Plus。如果你是阿里巴巴的用户或对Tengine的特定功能有需求,可以考虑使用阿里巴巴Tengine。如果你需要在Nginx上编写复杂的业务逻辑,可以考虑使用OpenResty。

本文由 mdnice 多平台发布

更多推荐

如何实现不同MongoDB实例间的数据复制?

作为一种SchemaFree文档数据库,MongoDB因其灵活的数据模型,支撑业务快速迭代研发,广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中,会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整合、数据库拆分、容灾等业务场景,存在MongoDB迁移或同步的业务诉求。在M

【CV、数据分析、AI产品经理】2024届校招岗位汇总

CV计算机视觉岗位数量公司岗位名称岗位职责截止日期1网易雷火人工智能算法工程师(虚拟交互/图形学和动画方向)岗位描述1.负责面向虚拟角色/虚拟人的创建(捏脸)和驱动(表情合成、动作捕捉和重定向、动作合成、舞蹈合成、物理模拟)等系统的设计和实现2.深度参与上述能力在游戏和泛娱乐产品(短视频、直播、虚拟偶像、VTuber)

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台,但对SaaS的了解还不是完全全面,对于一些产品的定位以及设计还在探索中本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题,核心是产品设计,主要从需求定义、方案设计和开发交付3方面,共计讨论10个问题点。一、Why为什么要用SaaS

小谈设计模式(3)—策略模式

小谈设计模式(3)—策略模式专栏介绍专栏地址专栏介绍策略模式主要角色环境(Context)抽象策略(Strategy)具体策略(ConcreteStrategy)角色总结核心思想封装算法定义抽象策略使用环境类思想总结Java代码实现——以一个游戏角色攻击方式的例子首先,我们定义一个抽象策略类AttackStrategy

竞赛选题 基于机器视觉的手势检测和识别算法

0前言🔥优质竞赛项目系列,今天要分享的是基于深度学习的手势检测与识别算法该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🧿更多资料,项目分享:https://gitee.com/dancheng-senior/postgraduate1实现效果废话不多说,先看看学长实现的效果吧2技术原理2.1手部检测主流的手势

Linux内核源码分析 (B.1)深入理解 Linux 虚拟内存管理

Linux内核源码分析(B.1)深入理解Linux虚拟内存管理文章目录Linux内核源码分析(B.1)深入理解Linux虚拟内存管理写在本文开始之前....1.到底什么是虚拟内存地址2.为什么要使用虚拟地址访问内存3.进程虚拟内存空间4\.Linux进程虚拟内存空间4.132位机器上进程虚拟内存空间分布4.264位机器

二刷力扣--二叉树(2)

226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。使用递归解决。确定函数参数和返回值函数参数为当前节点cur。无返回值。defdd(cur):确定终止条件。当前节点为空则终止。ifnotcur:return单层逻辑反转当前节点的左右,然后递归调用cur.left,cur.rightdef

企业中 Docker 的 Swarm 使用及作用详解

企业中Docker的Swarm使用及作用详解本文将详细介绍企业中Docker的Swarm使用及其在企业中的作用。通过使用Java代码示例,我们将演示Swarm的基本概念、创建Swarm集群以及部署和管理服务等操作。Docker的Swarm功能可帮助企业实现容器编排和集群管理,提供高可用性、可伸缩性和负载均衡等特性。在当

【数据结构】结构实现:顺序存储模式实现堆的相关操作

🚩纸上得来终觉浅,绝知此事要躬行。🌟主页:June-Frost🚀专栏:数据结构🔥该文章着重讲解了使用顺序结构实现堆的插入和删除等操作。目录:🌍二叉树的顺序结构🔭堆🌏代码实现✉️堆的插入✉️堆的删除✉️其他部分❤️结语🌍二叉树的顺序结构二叉树的顺序存储是指将二叉树中的所有节点按照一定的顺序(一层一层)存储

作为公司测开岗的面试官,我是怎么选人的....

最近一段时间面试了不少人,主要是一些测试开发岗,中高级的初级的也都有;也有一些偏业务测试岗的候选人。总结出了一些方法论,或者说更多的是个人作为面试官所遵守的一套面试准则。1.什么是面试?面试不仅仅是你问我答,更多的是一场信息交流,也是一个双方学习的过程。你作为面试官,应聘者的简历要仔细对待,这也是对人家的尊重。从TA的

怒刷LeetCode的第4天(Java版)

#【中秋征文】程序人生,中秋共享#目录第一题题目来源题目内容解决方法方法一:遍历字符串方法二:有限状态机(FiniteStateMachine)方法三:正则表达式第二题题目来源题目内容解决方法方法一:反转数字比较第三题题目来源题目内容解决方法方法一:动态规划方法二:递归回溯第一题题目来源8.字符串转换整数(atoi)-

热文推荐