240 发简信
IP属地:福建
  • 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 unresolved import "xxx"(转)

    仅以本人遇到的情况为例,在VS code 中编写 python 的程序时,会遇“unresolved import XXX” 的情况,经查阅资料,是VS code 中自带的 ...

  • Vscode配置linux下的C开发环境

    安装基础插件 c/c++, c/c++ Extension Pack, find all reference 安装gun globals 参考链接:让VSCode支持 "Fi...

  • Python离线安装第三方库

    参考链接: pip的基本使用和离线安装Python第三方库 https://blog.csdn.net/Hanniel/article/details/81086459[ht...

  • Python2离线安装python2,pip

    参考链接: Linux安装python2.7、pip和setuptools: https://www.cnblogs.com/xiaowenshu/p/10239834.ht...

  • sftp同步代码到远程服务器

    参考链接:vscode+sftp开发模式环境的同步,https://segmentfault.com/a/1190000011844958 安装sftp插件 打开一个目录, ...

  • 120
    Vscode配置GDB调试Nginx环境

    配合remote-ssh,可以很好地使用gdb直接调试远程服务器上的程序 比如我们此次使用GDB来直接调试nginx 配置gcc和gdb的路径 配置此次项目的一些特殊配置 配...

  • 120
    Vscode离线安装插件

    官网下载链接: https://marketplace.visualstudio.com/ 搜索之后下载: 下载插件 安装插件 使用命令行安装: 图形化界面安装:

  • Vscode配置Remote远程开发环境

    [TOC] 1. Vscode配置Remote远程开发环境 分为服务器可以连网和不能连网的两种情况。首先服务器有网插件基本都可以装,就很方便了。这里重点说一上断网的情况下要如...

  • 120
    TIME_WAIT

    为什么需要三次握手 1、保证全双工通信2、防止失效的连接请求到服务器,让服务器错误地打开连接,浪费资源2原因: 谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文...

  • 120
    C/C++程序内存分配

    程序的内存分配 转载链接:https://blog.csdn.net/LG1259156776/article/details/52627565 https://blog.c...