• 培养一套学习方法 整理一套完善的体系

  • 不要从main函数开始阅读

  • ./nginx -c conf/nginx.conf 带配置启动

  • 每个 ngx_command_t() 函数里面,都是一个配置关键字

  • 阅读源码的工具: source_insight

  • 从conf入手

    • 找到 worker process,在通过 worker process 设置conf全局变量;主进程启动之后,启动 worker_process
  • 进程开始的地方:ngx_process_cycle.c

  • worker process与server的关系:

    • 每个process都运行所有的server,process同时监听所有server
    • 每个server各自对应一个listenfd,将所有listenfd都加入到 epoll_ctl()中
    • 当多个进程监听同一个端口时,会出现 “惊群” 的问题
      • 什么是 “惊群”?
        • 多个进程监听同一个端口
        • 使用TCP客户端连接主机端口,所有进程全被唤醒,但只有一个进程处理消息
        • 高并发的情况下,进程始终处于 唤醒→挂起 的循环状态,性能大大降低
      • 如何解决“惊群”?
        • 进程之间协商出一种规则:某一时刻,只有一个线程监听端口
        • Nginx具体实现:ngx_event.c → ngx_process_events_and_timers
        • ngx_trylock_accept_mutex
  • 惊群是如何产生的?

  • 惊群的影响是什么?

  • 惊群解决的原理时什么?

  • 解决惊群的具体实现?(谁有资格拿到CAS锁,谁有资格listen)

  • 进程释放锁之后,无需通知

  • 为何多个进程监听事件?为何使用多进程而不是使用多线程?

  • 进程间资源隔离,使用进程更安全

  • 请求与请求之间独立,使用多线程需要加锁,而多进程隔离程度更高

  • CAS Compare and Swap (乐观锁)

  • Nginx作为高性能服务器,日志如何存储?

    • 日志落盘,性能与磁盘性能相关
  • Nginx 线程池

    • 什么是线程池?
    • 线程池的原理
    • 如何获取,并且返回给线程池?
    • 动态伸缩
    • 队列 异步写入 起到了解耦的作用
    • 频繁的写入日志,可以采用线程池进行处理
  • 拿到一个配置文件 深入理解模块

  • conf文件 ngx.modules.c

文章作者: Administrator
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 北溟鱼的博客
nginx源码 Nginx源码阅读指南
喜欢就支持一下吧