【Nginx】核心概念与安装配置解释

文章目录

  • 1. 概述
  • 2. 核心概念
    • 2.1.Http服务器
    • 2.2.反向代理
    • 2.3. 负载均衡
  • 3. 安装与配置
    • 3.1.安装
    • 3.2.配置文件解释
      • 3.2.1.全局配置块
      • 3.2.2.HTTP 配置块
      • 3.2.3.Server 块
      • 3.2.4.Location 块
      • 3.2.5.upstream
      • 3.2.6. mine.type文件
    • 3.3.多虚拟主机配置
  • 4. 总结

1. 概述

Nginx是我们常用的一款Http和反向代理服务器,同时可以作为负载均衡器、邮件代理、HTTP缓存服务。它以其轻量级、高并发的特点广泛应用于各种场景。作为一名研发人员,掌握Nginx的应用和实践非常重要。
本节主要解释一下Nginx中的几个常用核心概念,并聊一聊如何进行安装和配置。

2. 核心概念

下面先对核心概念做一下解释

2.1.Http服务器

最常见的就是作为前端服务的Http服务器,我们的前端项目在发布的时候往往会打包成一组静态文件,而Nginx 可以直接作为一个静态资源(如 HTML 文件、图片、CSS 样式表、JavaScript 脚本等)的 Web 服务器来使用。它能高效地处理对这些静态资源的请求,快速响应客户端,减轻后端应用服务器的负担,提升网站整体的访问速度。
例如vue3+vite项目的打包和配置过程,可以参考我这篇博客:【Vue3实践】(六)Vue3使用vite处理环境变量、打包部署、nginx配置

2.2.反向代理

所谓的代理,就是客户端与服务端不直接交互,而是在中间加入了一层代理层,由代理层对服务请求和相应做转发。我们常说的代理包含两种,正向代理反向代理

  • 正向代理:代理层代理的是客户端,由代理层与服务端做交互,并将信息转发给客户端。
  • 反向代理:代理层代理的是服务端,客户端与代理层交互,而不知道服务端的具体情况。

下面有一幅图来表示正向代理和反向代理的区别:
在这里插入图片描述
简单的说,正向代理就是服务端不知道发起请求的客户端是谁,反向代理就是客户端不知道提供服务的服务端是谁。

2.3. 负载均衡

负载均衡往往是和反向代理共同使用的,当后端有多个服务器在提供相同的服务,Nginx可以按照一定的负载均衡策略,将客户端的请求合理的分配到不同的服务端处理,避免单个服务器负载过高而其他的服务器又非常空闲,从而提高架构整体性能和可用性。

Nginx中常用的负载均衡策略有3种:轮询、加权轮询、IP Hash

  • 轮询:适用于各个服务器性能相近的场景,就是按服务器的顺序,将请求依次转发到不同的服务器处理,假如有ABC三台服务,请求就会按照A,B,C,A,B,C…的顺序依次执行。。
  • 加权轮询:适用于各个服务器性能不同的场景,在轮询的基础上给按性能给服务器分配权重。后续的请求就会趋近于这个权重来进行访问,比如服务器 A 权重为 3,服务器 B 权重为 2,服务器 C 权重为 1,那么在分配请求时,每 6 个请求中,A 会分配到 3 个,B 会分配到 2 个,C 会分配到 1 个,以此体现不同服务器的处理能力差异,将更多请求分配给性能更强的服务器。
  • IP Hash:常用于有状态服务(如需要保持会话状态的应用)的场景,根据客户端的 IP 地址通过哈希算法计算出一个值,然后根据这个值来决定将请求分配到哪台后端服务器上,这样能保证来自同一个 IP 的请求始终被分配到同一台后端服务器。

3. 安装与配置

3.1.安装

Nginx的安装很简单,ubantu可以通过apt,CentOS可以使用yum来进行安装,当然也可以使用Docker安装。Docker的安装方式参考《【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置文件》,里面讲了如何通过Docker安装Nginx并将配置文件挂载出来。

接下来看一下CentOS的安装方式,运行以下脚本:

sudo yum install nginx

执行完成后nginx,就安装好了,可以通过nginx -V(V是大写的)来查看Nginx的信息。
在这里插入图片描述
注:图中高亮显示的部分,就是Nginx的配置文件所在的位置,接下来可以通过nginx指令来启动Nginx。

nginx
# 查看进程
ps -ef | grep nginx

在这里插入图片描述
查看进程后可以看到,有1个master节点和4个worker节点,worker节点数和当前服务器的CPU核心数有关在下面的配置文件解释中会讲到。

3.2.配置文件解释

解释一下nginx.conf这个配置文件中的常用配置项的含义:

3.2.1.全局配置块

全局配置块位于文件的顶部,定义 Nginx 的全局设置,影响整个服务。
在这里插入图片描述

  • user:用户名,自己随便写
  • worker_processes:工作线程数,设置为auto之后,会按照CPU核心数来设置工作线程
  • error_log:保存错误日志的路径
  • pid:记录主进程 PID 的文件路径
  • incluede:引入其他.conf配置文件的位置

事件配置块中:

  • worker_connections:每个工作进程允许的最大连接数

3.2.2.HTTP 配置块


HTTP 块是 Nginx 配置的核心,定义了 Web 服务的行为,包括服务器、路由、缓存等

  • include:加载其他配置文件,实现配置分离。
  • log_format:日志打印的格式
  • access_log:访问日志的路径
  • sendfile:启用高效文件传输模式,用于减少 CPU 和内存占用
  • tcp_nopush:优化 TCP 包的传输,减少网络延迟
  • default_type:未匹配文件类型时的默认 MIME 类型

3.2.3.Server 块

在这里插入图片描述
Server 块用于定义虚拟主机,每个 Server 块对应一个站点。

  • listen:监听的端口号
  • server_name:绑定的域名,可用通配符
  • location:定义 URL 路径规则及对应处理方式
  • root:文件根目录,在直接访问Nginx的虚拟主机端口时,会默认的访问根目录下的index.html
  • index:修改默认访问html文件,一般是index index.html index.htm;
  • error_page:定义错误码及重定向的文件名。

我们打开根目录可以看到,里面就有默认的index.html,404.html,50x.html等文件
在这里插入图片描述

3.2.4.Location 块

Location 是 Server 块的子配置,匹配 URL 路径并定义处理规则。
下面是一个拓展的location块:

location /api/ {proxy_pass http://backend_server; # 转发到后端服务器。proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
}location ~* \.(jpg|jpeg|png|gif|ico)$ {root /usr/share/nginx/images;     # 图片文件存放目录。expires 30d;                      # 缓存时间。
}
  • proxy_pass:设置反向代理目标地址,大多数时候是配合upstream一起使用,upstream可以配置负载均衡策略。
  • proxy_set_header:传递自定义请求头给后端。
  • ~*:正则表达式匹配,不区分大小写。
  • expires:设置客户端缓存过期时间。

location中的各种通配符按优先级,如下所示:

  • 精确匹配 (=)。
  • 前缀匹配加通配符 (^~)。
  • 正则表达式匹配 (~ 和 ~*),多个正则时,按照配置文件中先后顺序匹配。
  • 普通前缀匹配(默认,无符号),按路径长度优先。

3.2.5.upstream

upstream 是定义后端服务器组的模块,用于负载均衡和请求分发。它允许您在多个后端服务之间分配请求流量。

  • 轮询配置:
    upstream backend_servers {server 192.168.1.101:8080;  # 后端服务器1server 192.168.1.102:8080;  # 后端服务器2server 192.168.1.103:8080;  # 后端服务器3
    }
    
  • 加权轮询配置:
    upstream backend_servers {server 192.168.1.101:8080 weight=3;server 192.168.1.102:8080;
    }
    
  • IP HASH 配置:
    upstream backend_servers {ip_hash;server 192.168.1.101:8080;server 192.168.1.102:8080;
    }
    

upstream一般是写在http块中的,例如:

http {upstream backend_servers {server 192.168.1.101:8080;server 192.168.1.102:8080;}server {location /api/ {proxy_pass http://backend_servers;proxy_cache cache_zone;       # 启用缓存proxy_cache_valid 200 302 10m; # 缓存 10 分钟proxy_cache_valid 404 1m;     # 404 错误缓存 1 分钟}}
}

3.2.6. mine.type文件

mime.types 文件用于定义 MIME 类型(Multipurpose Internet Mail Extensions),即文件的内容类型。
Nginx 会根据请求的文件扩展名匹配 mime.types 中定义的 MIME 类型,然后在 HTTP 响应头中包含 Content-Type 字段,告知客户端正确的文件类型
在这里插入图片描述

3.3.多虚拟主机配置

上面我们提到了每个server就是一个虚拟主机,在实际的工作中,我们往往会给不同的业务配置不同的虚拟主机,也就是在Nginx.conf中配置多个server,但是在实践中我们还有一个更优雅的方式。
上面的http块中有这么一行配置include /etc/nginx/conf.d/*.conf;,也就是在conf.d文件夹下导入所有以.conf结尾文件。所以我们就可以针对不同的业务在conf.d目录下新建不同.conf文件就可以了。

4. 总结

本篇讲述了Nginx的核心概念、安装,以及如何修改Nginx的配置文件,涵盖了Nginx入门相关的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp开发微信小程序笔记8-uniapp使用vant框架

前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是我之前维…

IDEA2024创建一个spingboot项目

以下是创建一个基本的 Spring Boot 项目的步骤和示例: 初始化一个springboot工程其实有许多方法,笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台(start.spring.io)进行配置,然后下载压缩包就可以获取…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…

北京航空航天大学多模态自适应攀岩机器人:突破复杂地形挑战

近年来,地外天体探测任务的需求显著增加,尤其是在月球、火星等崎岖地形的探索中,攀岩机器人凭借其灵活性和稳定性成为重要工具。然而,传统攀爬技术在面对复杂地形时仍面临诸多挑战,如附着装置的适应性不足、柔顺性较低…

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 🌹:喜欢做梦 二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树 一🍝、树型结构 1🍨.什么是树型结构? 树是一种非线性的数据结构&…

深度学习基础01_深度学习概述参数初始化激活函数

目录 一、深度学习概述 二、神经网络 1、感知神经网络 2、人工神经元 1.构建 2.组成 3.数学表示 3、深入神经网络 1.基本结构 2.网络构建 3.全连接神经网络 三、数据处理 四、参数初始化 1、固定值初始化 1.全零初始化 2.全1初始化 3.任意常数初始化 2、随机…

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝,转眼间六年过去了,六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目,铁蛋也从最开始做CRUD转行去了大数据平台开发,混迹包装开源的业务,机缘巧合下做了实时…

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目: 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口(同向双指针) 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目: 无重复字符的最长子串 1. 题目解析 题目截图: 此题所说的…

【pyspark学习从入门到精通19】机器学习库_2

目录 估计器 分类 回归 聚类 管道 估计器 估计器可以被看作是需要估算的统计模型,以便对您的观测值进行预测或分类。 如果从抽象的 Estimator 类派生,新模型必须实现 .fit(...) 方法,该方法根据在 DataFrame 中找到的数据以及一些默认或…

JAVA---IO

目录 IO流 一 字节流 1 FileOutStream 1 书写: 2 换行书写与续写: 2 FileInputStream 1 读取数据 2 循环读取: 二 字符流 1 FileReader 1 空参的read()方法读取数据: 2 有参的read()方法读取数据: 3 指定字…

4.6 JMeter HTTP信息头管理器

欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 HTTP信息头管理器的位置2 常见的HTTP请求头3 添加 HTTP 信息头管理器4 应用场景 前言 在 JMeter 中,HTTP信息头管理器(HTTP Header Manager&#xff09…

C语言解析命令行参数

原文地址:C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数,可以对命令行进行解析,下面给出一个示例,用的时候可以直接copy过去修改,很方便…

Android 11 三方应用监听关机广播ACTION_SHUTDOWN

前言 最近有项目过程中,有做app的同事反馈,三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。 1.原因:发送关机广播的类是ShutdownThread.java,添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER…

【Python】九大经典排序算法:从入门到精通的详解(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、基数排序、桶排序)

文章目录 1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 归并排序(Merge Sort)5. 快速排序(Quick Sort)6. 堆排序&…

计算机毕业设计Hadoop+Spark音乐推荐系统 音乐预测系统 音乐可视化大屏 音乐爬虫 HDFS hive数据仓库 机器学习 深度学习 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

深入理解 Java 基本语法之运算符

(一)研究背景 在 Java 编程中,运算符是处理数据和变量的基本工具,掌握各种运算符的使用方法对于提高编程效率至关重要。 (二)研究目的 深入理解 Java 基础运算符的概念、分类和作用,通过具体…

【微服务】 Eureka和Ribbon

一、Eureka 服务调用出现的问题:在远程调用另一个服务时,我们采用的解决办法是发送一次http请求,每次环境的变更会产生新的地址,所以采用硬编码会出现很多麻烦,并且为了应对并发问题,采用分布式部署&#…

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

QT QToolButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

[SWPUCTF 2021 新生赛]error

[SWPUCTF 2021 新生赛]error 报错注入:?idand updatexml(1,concat(0x7e,database(),0x7e),1) -- 爆出了数据库名称 test_db 爆表名:?idand updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_sc…