示例:
示例:
sort | uniq -c
深入理解nginx学习记录
规则简单总结就是优先级从高到低依次为(序号越小优先级越高):
链接: https://zhuanlan.zhihu.com/p/130819099
1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的,都会匹配这里处理
负载均衡
链接:
1. Nginx学习---负载均衡的原理、分类、实现架构,以及使用场景, https://www.cnblogs.com/ftl1012/p/9570846.html
2. Nginx四层负载均衡概述, https://zhuanlan.zhihu.com/p/380727659
二层负载均衡(mac)
三层负载均衡(ip)
四层负载均衡(tcp)
用 ip + port 接收请求,再转发到对应的机器
七层负载均衡(http)
根据虚拟的 url 或 ip ,主机名接收请求,再转向相应的处理服务器
nginx怎么避免惊群?
accept 锁和 epoll 锁: https://zhuanlan.zhihu.com/p/51251700
accept
1. 内核 2.6 以上,自然修复
2. 加锁
epoll
加锁 -> 支持原子操作的锁,如 mmap,以及不支持原子操作的文件锁
控制某个进程的连接数量
ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n;
边缘触发还是水平触发:
链接: https://blog.csdn.net/mrpre/article/details/80595540
ngx_add_conn 使用边缘触发(ET)
ngx_add_event 默认使用水平触发(LT)
ngx_handle_read_event 监听使用的是边缘触发
深入理解nginx学习记录
ngx_conf_handler 处理单个配置:
比对所有模块的 commands ,取第一条匹配的 command (module_type 类型也要一致), cmd->set()
每个配置都有一个偏移,这个 cmd->conf ,用来决定是要存在哪一级别的配置里面
```c
#define NGX_HTTP_MAIN_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, main_conf)
#define NGX_HTTP_SRV_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, srv_conf)
#define NGX_HTTP_LOC_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, loc_conf)
```
解析 http {} -> ngx_http_block()
创建 ngx_http_module 模块的 http->ctx:
提取所有的 NGX_HTTP_MODULE 模块,并创建 ctx->main_conf, ctx->srv_conf, ctx->loc_conf
再次提取,并且每个模块都再次调用对应的 create 函数 ctx->main_conf[mi] = module->create_main_conf(cf)
=> 再执行每个模块的 preconfiguration
=> 再执行每个模块的 init_main_conf
再执行每个模块 main 配置和 server 级别的配置合并 ngx_http_merge_servers
module->merge_srv_conf
module->merge_loc_conf
再执行每个模块所有的 locations ngx_http_merge_locations -> 对每个server的location进行排序和分类处理
对每个 server 进行 locations 排序和优化
按匹配字符串进行排序 -> ngx_http_init_locations
快速地构建静态的三叉查找树 -> ngx_http_init_static_location_trees
初始化阶段钩子(引擎) phases -> ngx_http_init_phases
预设的一些头部先计算 hash 值 -> ngx_http_init_headers_in_hash
=> 再执行每个模块 的 postconfiguration
初始化变量: ngx_http_variables_init_vars
设置每个阶段的 checker() 函数: ngx_http_init_phase_handlers
给每个阶段添加 handler 函数, checker() 函数主要是对于 handler 返回结果之后的校验以及是否走下个阶段做判断
优化端口信息 -> ngx_http_optimize_servers
通配符等处理
深入理解nginx学习记录
main 函数:
解析参数
=> 平滑升级: ngx_add_inherited_sockets
对模块进行编号和统计模块数量
读配置,并初始化 cycle : ngx_init_cycle
守护进程模式判断
创建 pid 文件
=> 单进程模式: ngx_single_process_cycle
ngx_set_environment
init_process
ngx_process_events_and_timers
=> 考虑惊群效应, https://cloud.tencent.com/developer/article/1341088
=> 多进程模式: ngx_master_process_cycle
初始化信息相关信息
主进程名: master_process
子进程名: ngx_argc
启动 worker 进程: ngx_start_worker_processes
启动cache manager, cache loader进程: ngx_start_cache_manager_processes
=> 平滑升级
进行热代码替换,这里是调用execve来执行新的代码: ngx_exec_new_binary
设置环境变量
把监听的 fd 写到环境变量中
修改旧的 pid 文件
=> ngx_execute()
ngx_spawn_process()
socketpair 父进程和子进程通信管道,ngx_processes[s].channel
fork()
所有子进程不再接受处理新的连接,实际相当于对所有的予进程发送QUIT信号量 => ngx_signal_worker_processes
ngx_init_cycle 核心步骤:
先初始化 core 核心模块(框架只关心核心模块): NGX_CORE_MODULE -> module->create_conf
创建一个 ngx_conf_t 结构,要开始解析 conf->ctx
解析命令行参数信息到内存结构中: ngx_conf_param -> ngx_conf_parse(NULL)
==> 解析配置: ngx_conf_parse
解析完所有配置, core 核心模块进行综合性处理, module->init_conf
创建 pid 文件: ngx_create_pidfile ,并加锁: ngx_test_lockfile
创建相关的目录,日志,文件,共享内存
监听 socket : ngx_open_listening_sockets
==> 调用所有 NGX_CORE_MODULE 模块的 init_conf
创建主进程名: -> ngx_create_pidfile
创建所有文件路径的文件夹: ngx_create_paths
==> 这个时间更换掉 log -> cycle->log = &cycle->new_log
初始化共享内存
设置监听的 ip 和端口信息,并启动监听: ngx_open_listening_sockets
==> 调用所有模块的 init_module
一些清理操作,如清理掉旧进程没有用到的文件等
深入理解nginx学习记录
优点:
优秀的模块设计
事件驱动架构
请求的多阶段异步处理
master-worker 的管理设计
平台无关的代码实现
内存池的设计
使用统一管道过滤器模式的 HTTP 过滤模块
缺点:
1. 动态处理差
2. rewrite 弱
3. 启用状态下,调试日志不好打印; HOOK 多,调试不方便; 多进程同时监听一个端口,不能控制是哪个进程来 accept
平滑升级:
新的 master 进程
读环境变量中的 socket : ngx_add_inherited_sockets
把旧的 socket 还原值,保存到结构体中(这里还没有开始监听): ngx_set_inherited_sockets
深入理解nginx学习记录
MEAELZILYQVAHULL
Python离线安装第三方库参考链接: pip的基本使用和离线安装Python第三方库 https://blog.csdn.net/Hanniel/article/details/81086459[ht...
仅以本人遇到的情况为例,在VS code 中编写 python 的程序时,会遇“unresolved import XXX” 的情况,经查阅资料,是VS code 中自带的 ...
安装基础插件 c/c++, c/c++ Extension Pack, find all reference 安装gun globals 参考链接:让VSCode支持 "Fi...
参考链接: pip的基本使用和离线安装Python第三方库 https://blog.csdn.net/Hanniel/article/details/81086459[ht...
参考链接: Linux安装python2.7、pip和setuptools: https://www.cnblogs.com/xiaowenshu/p/10239834.ht...
参考链接:vscode+sftp开发模式环境的同步,https://segmentfault.com/a/1190000011844958 安装sftp插件 打开一个目录, ...
配合remote-ssh,可以很好地使用gdb直接调试远程服务器上的程序 比如我们此次使用GDB来直接调试nginx 配置gcc和gdb的路径 配置此次项目的一些特殊配置 配...
官网下载链接: https://marketplace.visualstudio.com/ 搜索之后下载: 下载插件 安装插件 使用命令行安装: 图形化界面安装:
[TOC] 1. Vscode配置Remote远程开发环境 分为服务器可以连网和不能连网的两种情况。首先服务器有网插件基本都可以装,就很方便了。这里重点说一上断网的情况下要如...
为什么需要三次握手 1、保证全双工通信2、防止失效的连接请求到服务器,让服务器错误地打开连接,浪费资源2原因: 谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文...
程序的内存分配 转载链接:https://blog.csdn.net/LG1259156776/article/details/52627565 https://blog.c...