网站首页 > 精选教程 正文
Nginx框架先对客户端建立好连接,
然后接收用户发来的http请求行,比如:方法, url等。
然后再去接收所有的header。根据这些header信息 我们才能决定选用哪些配置块,决定让http模块怎样处理请求。
我们先来看一下Nginx框架是怎样建立连接,怎样接收http请求的?
首先经过内核三次握手建立连接, 然后经过Nginx负载均衡的算法选中一个worker。
这个worker进程 会调用epoll_wait 返回刚刚建立的连接的句柄fd。
此时这个句柄上实际上是有一个读事件,根据这个读事件,Nginx发现是它监听的80端口,于是就开始accept,这是会分配内存池,前面的文章我们介绍过,Nginx的内存池分为连接内存池和请求内存池2种。这时候分配的是连接内存池,默认值是512个byte。
接下来http模块开始接管请求,accept 新连接的时候 ngx_init_connection的回调方法就会被执行了。
这时会把新建立的读事件 通过epoll_ctl添加到epoll中,并且添加一个默认60s超时的定时器。
这一条龙流程走完,Nginx事件模块就会切到其他的fd去处理了。
当一个真正的post/get请求发来的时候,实际上发来data的。事件模块的epoll_wait又会拿到这个请求了。这次的回调方法则是ngx_http_wait_request_handler,这时候需要分配内存将内核态的data读取到用户态。这里有2个问题,内存是从哪里分配的?分配多少?
答案是从高处的连接内存池上分配的,默认client_header_buffer_size是要分配1k。这里如果配置是1k,就算data只有1个字节也会分配1k,就会存在浪费。那么如果header特别大1k不够怎么办呢?
有一个配置large_client_header_buffers:4 8K
这里的意思是如果1K不够,会分配8K内存,如果8K还不 就继续分配8K 分配到32K。
在接收完URI之后,接着就要接收header,我们注意到接收header这里也有一个分配大内存large_client_header_buffers:4 8K 这里的内存和之前那个是共用的。接收完完整的header就开始标识header了。然后就把之前设置的那个60s的定时器移除了。
最后就要开始http模块的11个处理流程,到底是哪11个处理流程呢?我们明天接着看。
猜你喜欢
- 2024-10-22 Nginx 是如何处理 HTTP 头部的? nginx+是如何处理+http+头部的?举例说明
- 2024-10-22 宝塔面板Nginx如何提高网站访问速度?
- 2024-10-22 Openssl在CentOS下标准安装路径是哪里
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)