概述
一,Nignx反向代理服务器
(1)一个请求从客户端传来。首先nginx启动之后就会解析配置文件,然后得到需要监听的端口以及IP地址,然后在nginx里面,master进程里面呢,会先初始化好这个需要监听的socket(创建socket,设计相关的属性等,然后绑定到相关的ip地址以及端口然后再进行监听listen等),然后再调用fork()函数创建出多个子进程来,他是在已存在的进程基础上采用fork函数进行的。
注意:fork()函数作用:一个现有进程可以使用fork函数创建一个新的进程,这个新的进程就是原来进程的子进程。然后子进程就会竞争去accept新的进程。此时,客户端就可以向nginx发送连接请求了,当客户端与nginx通过三次握手建立连接之后,然后由一个子进程去accept成功,然后得到这个连接的socket套接字,之后就会创建nginx对连接的封装,也就是ngx-connection-t1结构体。接着nginx设置读写事件函数然后添加读写事件与客户端进行数据的交互。最后nginx或者客户端就会主动关闭连接那么一个连接就是凉凉了。
(2)Nginx的实现原理通过一个连接池进行管理的,每一个worker工作线程都会有自己一个独立的连接池,连接池的大小就是worker-connections的大小。这里的连接池其实不是真实存在的连接,它只是worker-connections大小的nginx-connection-t1结构的数组存在。并且Nginx还会存在一个链表free-connections来保存空闲的nginx-connection-t1结构。每次获取一个连接就会从free-connections里面好去一个,用完之后再归还给空闲链表即可。worker-connections的大小不是nginx所能建立连接的大小,他表示的是每一个worker工线程所能连接的请求个数的大小。因此,可以这么说nginx所能连接的请求的最大值应该为work-connections*work-processes(操作系统中或者是nginx服务器中进程的个数)。
注意:对于反向代理来说,HTTP请求的数量就会变为work-connections*work-processes/2,因为我们知道nginx进行反向代理时nginx服务器既要与客户端建立连接还要与目标服务器进行连接,也就是说需要两个连接。因此他所支持的客户端连接请求的最大值减半。
常见的负载均衡算法
(1)随机散列
(2)轮询以及加权轮询
(3)最小连接数
(4)hash算法
(5)URL散列
(6)IP地址散列
二,fork()函数详解
fork函数用于创建一个与当前进程映像一样的子进程,所创建的子进程将复制父进程的代码段、数据段、BSS段、堆、栈等所有用户空间信息,在内核中操作系统会重新为其申请一个子进程执行的位置。
fork系统调用会通过复制一个现有进程来创建一个全新的进程,新进程被存放在一个叫做任务队列的双向循环链表中,链表中的每一项都是类型为task_struct的进程控制块PCB的结构。
一个现有的线程可以使用fork()函数创建一个新的线程,这个线程就是原线程的一个子线程(child process)。然后每当调用一次fork()函数,那么就会返回两次。依次是父进程和子进程的。唯一的区别就是父进程返回的是子进程的id而子进程返回的是0。子进程其实就是父进程的副本,子进程会获取到父进程的数据空间,堆,栈等资源副本。值得注意的是由于子进程持有父进程的变量副本(数据空间,堆,栈等)。因此可以知道父子进程是不会共享这些存储空间的。
UNIX将会复制父进程的地址空间内容给子进程,因此子进程就会具有独立的地址空间。在不同的UNIX系统下并不知道,到底是子进程先运行还是父进程先运行,只依赖于系统的实现。
子进程与父进程的区别:
(1)父进程具有进程锁而子进程不会继承这个进程锁。
(2)父进程的进程id与子进程的进程id不相等。
(3)子进程未决告警被清除
(4)子进程未决信号集设计未空集。
fork函数的函数原型是pid_t fork(void);
fork函数的执行流程:(1)当进程调用fork函数之后,控制就会转入内核,然后执行四件事
(1)分配新的进程块以及内核数据空间给子进程。
(2)将父进程的部分数据结构(堆,栈等)拷贝给子进程。
(3)添加子进程进入进程列表中。
(4)fork返回开始调度器调度。
为什么·会返回两次呢?fork方法调用需要注意的问题
(1)父进程和子进程在操作系统中是交替进行的,而且父子进程它们的运行空间是不一样的。
(2)fork函数调用一次会有两个返回,此时父进程和子进程它们运行时会有自己得1参数以及运行空间。
最后
以上就是优雅心锁为你收集整理的Nginx是如何处理一个请求的全部内容,希望文章能够帮你解决Nginx是如何处理一个请求所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复