Nginx
yang_oh
90后小学生
展开
-
Nginx系列(一):HTTP处理流程概述
accept阶段(ngx_http_init_connection):分配ngx_http_connection_t结构体;根据fd的端口和地址,为hc->addr_conf赋值,以供后续server块查询;新的fd加入epoll,设置读超时,超时时间为post_accept_timeout,设置连接可重用。rev:ngx_http_wait_request_handle...原创 2019-06-10 16:34:19 · 1629 阅读 · 1 评论 -
Nginx系列(十四):支持通配符的散列表
大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理。这个处理起来比较麻烦。而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候。我们就需要构建三个hash表,一个包含普通的key的hash表,一个包含前向通配符的hash表,一个包含后向通配符的hash表(或者也可以把这三个hash表组合成一个ngx_hash_combined...原创 2019-06-11 13:58:04 · 454 阅读 · 0 评论 -
Nginx系列(十五):epoll机制
nginx的epoll默认是边缘触发。即epoll_ctrl都会传入NGX_CLEAR_EVENT(EPOLLET)参数对于监听套接字,触发方式为水平触发。for (i = 0; i < cycle->listening.nelts; i++) { c = ls[i].connection; if (c == NULL || c->read->acti...原创 2019-06-11 20:45:59 · 1643 阅读 · 0 评论 -
Nginx系列(十六):HTTP Vary机制
一、概念apache在响应头中返回了一个vary:Accept-encoding ,则squid在存储缓存文件时需要将“我的浏览器”发出的请求头信息中的Accept-encoding字段的值(大多情况就是gzip,deflate之类的)作为缓存key的一部分,因此对于不同的Accept-encoding字段值,都需要保存不同的文件。二、请求阶段在通过key值获取到缓存文件后(ngx_http...原创 2019-06-11 20:46:21 · 2122 阅读 · 0 评论 -
Nginx系列(十七):HTTP subrequest子请求
一个主请求无论产生多少子请求,epoll中始终只包含一个连接的写事件,当该连接的可写事件触发时,该连接所有父子请求都会被处理一遍。c->data 始终指向后序遍历的首个节点位置。顺序从下往上,从左往右,即先产生的子请求要求先发送。一、子请求建立ngx_http_subrequestr->postponed:该请求子请求和已产生数据的树状结构。r->posted_req...原创 2019-06-11 20:46:36 · 1168 阅读 · 0 评论 -
Nginx(十八):DNS模块
一、请求阶段ngx_resolve_start(1)分配ctx结构体;(2)赋值DNS结束后的回调函数。ngx_resolve_name->ngx_resolve_name_locked如果该域名在resolver中已存在节点:a.如果该节点仍有效,则更新node超时时间,将resolver中的DNS解析结果赋值给ctx,调用ctx的回调;b.如果该节点已失效。若因DNS...原创 2019-06-11 20:46:51 · 846 阅读 · 0 评论 -
Nginx:“惊群”和负载均衡
一、“惊群”问题概念Nginx的master进程开始监听web端口,fork出多个worker子进程,这些子进程开始监听同一个端口,假定一段时间没有用户连入服务器,某一时刻恰好所有的子进程都进入休眠等待新连接的到来(阻塞在epoll_wait),这时有一个用户向服务器发来了连接,内核在收到SYN包后激活所有子进程,但是此时只有一个进程成功执行accept建立新连接,其它子进程accept失败,...转载 2019-06-11 20:47:22 · 247 阅读 · 0 评论 -
Nginx系列(十九):URI转义机制(部分转载)
一、URI和特殊字符源文档 https://www.cnblogs.com/upyun/p/8267334.html1. URIURI,全称是 Uniform Resource Identifiers,即统一资源标识符,用于在互联网上标识一个资源,比如 https://www.upyun.com/products/cdn 这个 URI,指向的是一张漂亮的,描述又拍云 CDN 产品特性的网...原创 2019-06-11 20:47:37 · 13181 阅读 · 1 评论 -
Nginx系列(二十):HTTP Store机制
一、配置location / { //这里的location是要换成自己经过精确匹配的location, ...原创 2019-06-11 20:47:53 · 612 阅读 · 0 评论 -
Nginx系列(二十一):HTTP Cache机制
一、配置proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;proxy_cache_path 缓存文件路径levels 设置缓存文件目录层次;levels=1:2 表示两级目录keys_zone 设置缓存名字和共享内存大小inactive 在...原创 2019-06-11 20:48:40 · 2833 阅读 · 0 评论 -
零拷贝和Nginx的阻塞处理
工作原因,这几天将注意力重新放在了Nginx的文件发送上。在下游使能request_body_no_buffering的情况下,又或者,Nginx提供静态文件缓存的情况下,Nginx如何在保证并发的基础上,将磁盘文件高效的传给对端?Linxu的零拷贝代理和负载均衡中常出现TCP粘合的概念,当需要根据连接的七层数据(比如一个HTTP GET请求)进行负载均衡时,负载均衡器不得不和客户端建立连接,...原创 2019-06-28 20:29:28 · 2500 阅读 · 0 评论 -
Nginx系列(十三):变量机制
1. 内部变量:preconfiguration阶段,调用ngx_http_variables_add_core_vars:1)初始化cmcf->variables_keys结构体;2)遍历ngx_http_core_variables核心变量数组,创建ngx_http_variable_t结构体作为value,变量名为key加入cmcf->variables_keys-&g...原创 2019-06-11 13:48:12 · 572 阅读 · 0 评论 -
Nginx系列(十二):script脚本机制
脚本可分为两类,一类是赋值类,即将变量值放入e->sp;另一类是操作类,常见的是获取e->sp中的值,并进行处理。1. ngx_http_script_compile_t 复杂变量typedef struct { ngx_conf_t *cf; //配置信息 ngx_str_t *source; /...原创 2019-06-11 13:32:38 · 1760 阅读 · 0 评论 -
Nginx系列(二):HTTP头部处理
一、请求头conf->headers->hash将proxy_set_header指令设置的头字段,以及ngx_http_proxy_headers结构体指定的字段,形成哈希表,用于头字段查找。如果两者内容冲突,以proxy_set_header为准。自定义部分,必须发送。conf->headers->lengths:形成nginx脚本,计算上述头字段长度。con...原创 2019-06-10 17:01:23 · 2166 阅读 · 0 评论 -
Nginx系列(三):rewrite重写模块
一、配置rewrite目的为“http://”或“https://”:rewrite的handler结束后将直接返回302临时重定向。last:具有last的一行指令解析结束后,会在codes数组最后填充NULL,所以同一块区域后面的rewrite相关指令都不再生效。break:r->uri_changed会被赋值为0,在POST_REWRITE阶段,执行r->phase_ha...原创 2019-06-10 17:40:58 · 1223 阅读 · 0 评论 -
Nginx系列(四):upstream模块
配置解析阶段init_main阶段在init_upstream时,因为upstream的每个server在DNS后可能存在多个IP,所以init_upstream生成的peer是所有解析结果的集合,例如,一个server的权值为10,解析后由5个IP,那么,将申请5个rrp,每个的权值都是10。调用kcf->original_init_upstream(ngx_http_upstre...原创 2019-06-10 18:09:12 · 2133 阅读 · 0 评论 -
Nginx系列(五):HTTP响应发送-下游网速优先
响应报文接收:ngx_http_upstream_process_non_buffered_request()n = upstream->recv(upstream, b->last, size);保存于u->buffer(proxy_buffer_size指令大小)中。u->free_bufs申请:1)分配ngx_chain_t;2)分配ngx_bu...原创 2019-06-11 10:09:52 · 426 阅读 · 0 评论 -
Ngxin系列(六):HTTP响应发送-上游网速优先
一、READ阶段preread_bufs预读取的响应包体,在读响应头时获取到,存放在u->buffer;接收空间的分配从free_raw_bufs中获取。single_buf:为1时只获取一个chain,为0时获取所有chain。重新分配。(1)申请的内存块数量和大小受p->bufs(proxy_buffers指令大小)的限制;(2)分配ngx_chain_...原创 2019-06-11 11:24:47 · 235 阅读 · 0 评论 -
Nginx系列(七):HTTP请求释放
upstream资源释放(ngx_http_upstream_finalize_request)调用u->peer.free释放上游TCP连接,详见upstream文档;删除上游响应的文件缓存;发送r->out中缓存的内容。无论是non_buffer或pipe进行上游响应的发送,都使用r->pool分配的内存(u->buffer/u->pipe->...原创 2019-06-11 11:55:16 · 1696 阅读 · 1 评论 -
Nginx系列(八):server快速查询
一、基于名字的虚拟主机Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:server { listen 80; server_name example.org www.example.org; ...} server { listen 80; server_n...原创 2019-06-11 12:06:43 · 740 阅读 · 0 评论 -
Nginx系列(九):location快速查询
一、location解析location共分为三种:1)exact_match:“=”类型,全匹配;2)noregx:“^~”类型,前缀匹配;3)regex:“”或“*”类型,正则匹配;4)named:“@”类型,内部跳转匹配。对于存在父子关系的location:1)父只能是noregex或regex类型;2)子不能使named类型;3)子的name不能包含父。二...原创 2019-06-11 12:11:26 · 544 阅读 · 0 评论 -
Nginx系列(十):启动流程
一、主启动流程流程图主要函数ngx_get_options解析命令参数ngx_process_options配置前缀、前缀、配置文件、配置参数等字符串ngx_add_inherited_sockets在进行平滑升级时,将通过“NGINX”环境变量将监听的fd传递给新的进程,用于初始化新进程的cycle->listening结构体。ngx_init_cycle更...原创 2019-06-11 13:08:20 · 752 阅读 · 0 评论 -
Nginx系列(十一):互斥锁的实现
数据结构typedef struct {#if (NGX_HAVE_ATOMIC_OPS) ngx_atomic_t *lock;#if (NGX_HAVE_POSIX_SEM) ngx_atomic_t *wait; ngx_uint_t semaphore; sem_t sem;#endif#else ngx_fd...原创 2019-06-11 13:18:50 · 644 阅读 · 0 评论 -
解析Nginx对HTTP2的支持
HTTP2协议:https://httpwg.org/specs/rfc7540.htmlHTTP2关键词:分帧,多路复用,HPACK,优先级,应用层流控,等文章相关的Nginx版本为1.12.2,该版本Nginx支持下游HTTP2卸载。一、数据结构数据结构图重点结构体ngx_http_v2_connection_t元素含义*connection下游连接...原创 2019-09-26 00:33:26 · 4788 阅读 · 0 评论