完全掌握Nginx的终极指南:这篇文章让你对Nginx洞悉透彻

news2025/7/21 9:42:26

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少(一个worker进程只占用10-12M内存),启动极快,高并发能力强,在互联网项目中广泛应用。

36a231d4d446e10806bc838ae1b4b0a5.jpeg

上图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道。

反向代理服务器

经常听人说到一些术语,如反向代理,那么什么是反向代理,什么又是正向代理呢?下面是一个简单的总结。

正向代理

由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。

e840dd8b46c5d21e8bf809ae11dbc54f.jpeg

正向代理示意图

反向代理

当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。

14b2b3dd23f8906870e0f7b0bff8d59e.jpeg

反向代理示意图

Nginx的Master-Worker模式

要启动nginx,只需要输入命nginx,其中xxx是你nginx的安装目录。

4eca5af691097bca446a89dab98e2eff.jpeg

nginx进程

启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程。

18969c784cd19fa7b1d3ad647ce23fb1.jpeg

Master-Worker模式

Master进程的作用:读取并验证配置文件nginx.conf;管理worker进程;

Worker进程的作用:每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程,上面的例子只有1个Worker进程。

思考1:Nginx如何做到热部署?

所谓热部署,就是配置文件nginx.conf修改后,不需要stop Nginx,不需要中断请求,就能让配置文件生效!(nginx -s reload 重新加载/nginx -t检查配置/nginx -s stop)

通过上文我们已经知道worker进程负责处理具体的请求,那么如果想达到热部署的效果,可以想象:

方案一:修改配置文件nginx.conf后,主进程master负责推送给worker进程更新配置信息,worker进程收到信息后,更新进程内部的线程信息。

方案二:修改配置文件nginx.conf后,重新生成新的worker进程,当然会以新的配置进行处理,而且新的请求都必须交给新的worker进程,至于老worker进程,等把那些以前的请求处理完毕,kill掉即可。

Nginx采用的就是方案二来达到热部署的!

思考2:Nginx如何做到高并发下的高效处理?

上文已经提及Nginx的worker进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。

作为专业的程序员,我们可以开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...

要同时处理那么多的请求,要知道,有的请求需要发生IO,可能需要很长时间,如果等着它,就会拖慢worker的处理速度。

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。

思考3:Nginx挂了怎么办?

Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。答案是:Keepalived+Nginx实现高可用。

Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合)

Keepalived+Nginx实现高可用的思路:

第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)

第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)

b0369475a49dfb861ef0c1ea7f96fa44.jpeg

Keepalived+Nginx

我们的主战场:nginx.conf

很多时候,在开发、测试环境下,我们都得自己去配置Nginx,就是去配置nginx.conf。nginx.conf是典型的分段配置文件,下面我们来分析下。在 Nginx 内部,你可以指定多个虚拟服务器,每个虚拟服务器用 server{} 上下文描述。

虚拟主机

nginx的配置文件主要由指令构成,指令主要包括名称和参数,以分号;结束。如下是一个虚拟服务器的配置:listen 指令来指定该虚拟主机在监听给定的 IP 端口组合;server_name指令检测 Host 头以决定请求到底匹配到哪个虚拟主机...nginx的配置项很多,具体可以查阅网上资料。

dcaf5a8dcf7565c91a69dad9d8a04e65.jpeg

http的server段

a6085c8beb29aa6a3e4bd60b6cf68e8c.jpeg

访问结果

其实这是把Nginx作为web server来处理静态资源,

1:location可以进行正则匹配,应该注意正则的几种形式以及优先级。(这里不展开)

2:Nginx能够提高速度的其中一个特性就是:动静分离,就是把静态资源放到Nginx上,由Nginx管理,动态请求转发给后端。

3:我们可以在Nginx下把静态资源、日志文件归属到不同域名下(也即是目录),这样方便管理维护。

4:Nginx可以进行IP访问控制,有些电商平台,就可以在Nginx这一层,做一下处理,内置一个黑名单模块,那么就不必等请求通过Nginx达到后端在进行拦截,而是直接在Nginx这一层就处理掉。

反向代理---proxy_pass

所谓反向代理,很简单,其实就是在location这一段配置中的root替换成proxy_pass即可。root说明是静态资源,可以由Nginx进行返回;而proxy_pass说明是动态请求,需要进行转发,比如代理到Tomcat上。

反向代理,上面已经说了,过程是透明的,比如说request -> Nginx -> Tomcat,那么对于Tomcat而言,请求的IP地址就是Nginx的地址,而非真实的request地址,这一点需要注意。不过好在Nginx不仅仅可以反向代理请求,还可以由用户自定义设置HTTP HEADER。

负载均衡---upstream

上面的反向代理中,我们通过proxy_pass来指定Tomcat的地址,很显然我们只能指定一台Tomcat地址,那么我们如果想指定多台来达到负载均衡呢?

1:通过upstream来定义一组Tomcat,并指定负载策略(IPHASH、加权论调、最少连接),健康检查策略(Nginx可以监控这一组Tomcat的状态)等。

2:将proxy_pass替换成upstream指定的值即可。

负载均衡需要注意的问题:选择不同的负载均衡算法,可能会带来不同的问题,如果选择轮询方式,那么一个请求,可以到A server,也可以到B server,我们得注意用户状态的保存问题,如Session会话信息,不能在保存到服务器上。

如果选择散列,没有了上面的问题,但是又得考虑,什么样的散列算法尽可能均匀打到后端的服务器上,总之实际应用中需要根据场景权衡选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考系统架构设计师考试冲刺攻略

系统架构冲刺攻略 上篇为综合知识,介绍了系统架构设计师应熟练掌握的基本知识,主要包括绪论、计算机系统、信息系统、信息安全技术、软件工程、数据库设计、系统架构设计、系统质量属性与架构评估、软件可靠性、软件架构的演化和维护、未来信息综合技术等…

贪心算法:猫粮兑换最大数量的五香豆

小老鼠存了一些猫粮,他想到猫猫库房兑换最大数量的五香豆。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不…

凉鞋的 Unity 笔记 201. 第三轮循环:引入变量

201. 第三轮循环:引入变量 在这一篇,我们进行第三轮 编辑-测试 循环。 在之前我们编写了 输出 Hello Unity 的脚本,如下: using System.Collections; using System.Collections.Generic; using UnityEngine;public class FirstGameObject …

低代码加速软件开发进程

IT 团队依靠笨重的软件开发流程和密集型的手工编码来构建可靠的现代应用程序的时代即将结束。随着新自动化技术的兴起、开发人员的短缺,以及渴望创新的客户和最终用户的需求迅速提高,软件行业被迫寻求替代方法,要求不仅提供服务和产品&#x…

那些你面试必须知道的JS知识点

目录 1、JS数据类型有哪些?2、延迟加载JS有哪些方式?3、 和 有什么不同?4、null和undefined的区别5、JS微任务和宏任务6、作用域考题7、JS对象考题8、JS作用域this指向原型考题9、JS判断变量是不是数组,你能写出哪些方法&#xff…

四、Node Exporter

一、Exporter结束 可以通过一个 metrics 接口为 Prometheus 提供监控指标,最好的方式就是直接在目标应用中集成该接口,但是有的应用并没有内置支持 metrics 接口,比如 linux 系统、mysql、redis、kafka 等应用,这种情况下就可以单…

数字孪生技术如何提高仓储效率?

随着科技的不断演进,数字孪生技术已然成为仓储管理领域的一股强大力量,带来了前所未有的变化和机遇。数字孪生技术的出现,为仓储行业带来了前所未有的智能化和高效化,从仓库布局到库存管理,从人员配备到安全控制&#…

基于马尔可夫随机场的图像去噪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、马尔可夫随机场的基本原理 4.2、基于马尔可夫随机场的图像去噪算法 5.算法完整程序工程 1.算法运行效果图预览 原图: 加入噪声的图像: 滤波后的图像 迭代过程…

人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍,随着人工智能和深度学习技术的飞速发展,文本到视频生成已经成为计算机视觉领域中一个重…

【网络安全】php代码审计-sql注入进阶篇

前言 现在各大网站都在使用waf对网站或者APP的业务流量进行恶意特征识别及防护,,避免网站服务器被恶意入侵。所以我们就需要绕过waf,这篇文章就用代码审计的方式给大家讲解一些sql的绕过技巧。 点击此处即可领取282G网络安全学习籽料 关键…

FlashAttention计算过程梳理

FlashAttention 的速度优化原理是怎样的? 从 FlashAttention 到 PagedAttention, 如何进一步优化 Attention 性能 FlashAttention图解(如何加速Attention) FlashAttention开源代码 Transformer Block运算量解析 在self-attention模块中&#…

【UE】安装下载的插件文件夹到虚幻引擎

比如我淘宝上购买了一个插件文件夹,解压后内容如下: 找到电脑上虚幻引擎(这里以UE5.1为例)的位置,可以看到里面有一个名字为“Plugins”的文件夹 在此文件夹中找到“Marketplace”文件夹 然后将下载的插件文件夹放到“…

智慧远程医疗服务:从零开始搭建互联网医院APP

互联网医院APP作为远程医疗服务的一部分,正在为患者和医生带来更便捷的医疗体验。本文将探讨如何从零开始构建一个互联网医院APP,包括关键步骤、技术要点和挑战。 一、确定项目目标和范围 在开始之前,您需要明确定义您的互联网医院APP的目标…

AI_Neural Network_Note (二)

NN Predict logistic regression 预测的过程其实只是based on 一个简单的逻辑回归logistic regression公式 z dot(w,x) b (x1 * w1 x2 * w2 x3 * w3) b dot(a,b): 向量a和向量b的点积(内积)运算。 点积是两个向量的对应分量相乘,并将…

什么是接口测试,接口测试怎么玩,接口自动化测试怎么玩?

前言 最近在找工作,因为是做纯服务端测试的,所以面试过程中面试官难免会问,怎么设计接口测试用例,怎么做接口自动化测试?会象征性的考一下基本功。 下面就接口测试,或者说服务端测试,梳理一下我…

Spring framework Day19:Spring AOP xml配置示例二

一、开始学习 1、新建项目&#xff0c;结构如下 2、添加 spring 依赖 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework&l…

2023,简历石沉大海?软件测试岗位真的已经饱和了....

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。 另一面企业招人真的…

Redis数据结构之ziplist

前言 Redis 为了提高内存效率&#xff0c;设计了一种特殊的数据结构 ziplist&#xff08;压缩列表&#xff09;。ziplist 本质是一段字节数组&#xff0c;采用了一种紧凑的、连续存储的格式&#xff0c;可以有效地压缩数据&#xff0c;提高内存效率。 hash、zset 在数据量比较…

CSS 基础知识-01

CSS 基础知识 1.CSS概述2. CSS引入方式3. 选择器4.文字控制属性5. 复合选择器6. CSS 特性7.背景属性8.显示模式9.选择器10.盒子模型 1.CSS概述 2. CSS引入方式 3. 选择器 4.文字控制属性 5. 复合选择器 6. CSS 特性 7.背景属性 8.显示模式 9.选择器 <!DOCTYPE html> <…