山东_朱文鑫 发表于 2023-6-3 23:56

【大白分享】Nginx高性能Web和反向代理服务之整体结构篇一

本帖最后由 山东_朱文鑫 于 2023-6-4 15:28 编辑

大家好,我是大白,百丈之台,其始则一石耳,由是而二石焉,由是而三石,四石以至于千万石焉。依旧感谢各位小伙伴的一路支持与陪伴。
渗透安全之WEB中间件下多漏洞复现:https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=257123

本篇借上篇文章WEB中间件下的多漏洞复现,从中介绍了因为WEB服务中使用Nginx代理配置不规范导致的漏洞出现,从中复现出多个WEB服务问题,那么今天我们就按照里面Nginx的漏洞复现,今天学习一下Nginx是什么?有什么作用?

1259083
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。在众多WEB服务器的部署中拥有较多数的部署占比,对于前端或者全栈的小伙伴会非常的熟悉。

1259121
首先,代理服务器一般指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端。我们的客户端在进行FQ操作的时候,我们使用的正是正向代理,通过正向代理的方式,在我们的客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发。

1259085
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,此时代理服务器对外就表现为一个反向代理服务器。

1259087
并且我们在认识Nginx之前我们或许认识更多的是Apache,Apache作为全世界部署第一的WEB服务器软件相较于Nginx到底有什么不同。

一个网站通常使用一台物理服务器运行一个Apache实例。2000年之后,显然这种单服务器模型已经无法简单扩展来满足日益增长的web服务需求。不适合网站的非线性扩展。

1259091
Nginx基于事件模型,而没有模仿Apache为每个请求派生新进程或线程的做法。最终结果就是即使负载增加了,内存和CPU使用事件始终保持可预期。Nginx使用普通的硬件就能在一个服务器上处理数万的并发连接。

1259093
Nginx的第一个版本发布之后,一般被用来同Apache一同部署,HTML、CSS、JavaScript脚本和图片等静态内容由nginx处理,来降低Apache应用服务器的并发和延时。随着开发演进的过程,nginx增加了FastCGI、uswge和SCGI等协议的支持,以及对分布式内存对象缓存系统如memcached的支持。也增加了其他有用的功能,例如支持负载均衡和缓存的反向代理。这些附加功能使nginx成为一个高效的工具集,用于构建可伸缩的web基础设施。

Nginx的具体功能:
    一、HTTP功能:
1)提供静态文件和index文件,处理静态文件,索引文件以及自动索引,打开文件描述符缓存;
2)使用缓存加速反向代理,反向代理加速(无缓存),简单的负载均衡和容错;
3)使用缓存机制加速远程FastCGI,简单的负载均衡和容错;
4)模块化的结构。过滤器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI过滤器中,到同一5 proxy 或者 FastCGI 的多个子请求并发处理;
6)支持SSL 和 TLS SNI 支持;
7)IMAP/POP3代理服务功能;
8)使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
9)使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端。

    二、其他功能:

1)基于名称和基于IP的虚拟服务器;
2)支持Keep-alive和管道连接;
3)灵活的配置和重新配置、在线升级的时候不用中断客户访问的处理;
4)访问日志的格式,缓存日志写入和快速日志轮循;
5)3xx-5xx错误代码重定向;
6)速度限制

Nginx还有如下优点:

1、热部署:在master管理进程与worker工作进程的分离设计,在7×24小时不间断服务的前提下,升级Nginx的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。

2、可以高并发连接:理论上,Nginx支持的并发连接上限取决于你的内存,10万远未封顶。

3、低的内存消耗:在一般的情况下,10000个非活跃的HTTP Keep-Alive 连接在Nginx中仅消耗2.5M的内存,这也是Nginx支持高并发连接的基础。

4、处理响应请求快:在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。

5、具有很高的可靠性:Nginx是一个高可靠性的Web服务器。高可靠性来自其核心框架代码的优秀设计、模块设计的简单性。

1259107
正常我们在部署Nginx启动后会存在一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程,包含:

接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。worker 进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与 Nginx 的进程模型以及事件处理模型是分不开的。

1259095
Nginx 的进程模型:
1259097
1259099
master-workers 机制的优点:
1. worker 进程来说,不需要加锁,在编程以及问题查找时方便很多。并且可以用 nginx –s reload 热部署,利用 nginx 进行热部署操作。

2.对于每个worker进程来说都是相对独立的,互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。每个woker是独立的进程,如果有其中的一个woker出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断。

关于worker的部署数量:

Nginx 同 redis 类似都采用了 io 多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为合适的。

Nginx的请求处理:

1259137
Nginx在启动时,会解析配置文件,得到需要监听的端口与IP地址,然后在Nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的IP地址端口,再listen),然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的连接。

此时,客户端就可以向Nginx发起连接了。当客户端与Nginx进行三次握手,三次握手,当用户发来一个 SYN 报文时,系统内核会返回一个SYN+ACK确认给客户端,当用户再次发送ACK来的时候,此时就已经建立了三次握手。

完成三次握手后,操作系统会根据系统内的负载均衡算法来选中一个worker线程,它会返回一个建立连接的epoll_wait的句柄。拿到了epoll_wait的连接句柄后找到它监听的端口 80 或 443 等端口。

拿到端口后,开始调用accept方法来分配512字节的连接内存池 (connection_pool_size:512);分配完内存池后,http模块会从事件中接入请求;http模块启动后,ngx_http_init_connection设置并启用一个回调方法: epoll_ctl, 并为这个方法添加定时器 (client_header_timeout:60s) 然后将读事件添加到这个epoll事件中.并开始计时60s. 如果60秒没收到请求就会返回超时。

在接受请求后,nginx会将请求数据读取到用户态中,并在连接内存池中为他分配一个读的缓冲区:clent_header_bufer_size:1k 【之前分配的是512字节,这里是可扩展的分配的1k,这里的1k 是强制占用,无论你现有字节会不会超过1k 都会强行占用1k】

接收请求HTTP模块图示:

1259143

收到请求的URI后,开始分配请求内存池,并做上下文分析,分析每个head和http协议,所以这里需要分配一个默认请求内存池: request_poll_size:4k

此时状态机会解析请求行,如:方法名、url、协议, 解析请求行的过程中 可能会发现有的URL更大,已经超过了我们之前设置的1k了。

此时我们会调用一个大内存: large_client_header_buffers: 4 8k; (最多32k)。

当状态机解析完了请求行后,标识URI用于指向请求行(这里也是nginx强大的原因,他可以指定请求行,不用遍历). 标识结束后,开始接受head,并开始解析header

同时复用large_client_header_buffers: 4 8k;的的内存.接收完整的header后,标识header,并且移除超时定时器 (clent_header_timeout:60s),移除定时器后就开始了 11 个阶段的http请求处理过程。

Nginx高性能Web和反向代理服务之请求处理的11阶段篇二:https://bbs.sangfor.com.cn/forum ... &extra=#/pid3467407

本章就先讲到这里,WEB中间件Nginx高性能Web和反向代理服务主要介绍了Nginx的优点以及功能、Mater-worker机制、还有请求机制。因为11阶段的HTTP请求处理过程比较多,我们作为下一篇文章进行详细讲解。感谢大佬们的参阅,此贴先到这里后续会带上更加优质的帖子,感谢大家!

励志分享超清壁纸语句~~:

1259161
大雪压青松,青松挺且直。要知松高洁,待到雪化时。——陈毅《青松》
好的今天就到这里,老样子,感谢各位大神的参阅,孩子为了挣豆子不容易,孩子家里穷没豆子吃饭了!!!:'(

我是路人甲55 发表于 2023-6-7 07:41

感谢楼主分享,每日学习打卡

韩_鹏 发表于 2023-6-7 08:40

g感谢分享                                                

Mr程 发表于 2023-7-18 13:54


感谢楼主分享,每日学习打卡

dhf 发表于 2023-8-14 11:12

每日打卡学习,感谢分享,学习了!!!

新手378833 发表于 2023-10-19 10:24

有助于学习!!!!!!!!!!

新手626351 发表于 2023-11-12 10:24

感谢分享有助于工资和学习!

小霞米 发表于 2023-11-25 13:10

感谢楼主分享,努力学习中!!!!

蔺嘉宾 发表于 2023-11-25 13:10

感谢楼主分享,努力学习中!!!!

朱墩2 发表于 2023-11-25 13:10

感谢楼主分享,努力学习中!!!!
页: [1] 2 3
查看完整版本: 【大白分享】Nginx高性能Web和反向代理服务之整体结构篇一