zoukankan      html  css  js  c++  java
  • nginx笔记-2

    nginx的请求处理流程

     nginx处理的流量是其他应用服务处理流量的数倍。

     

     nginx的三个状态机:传输层状态机、http状态机、mail状态机。

    核心部分由非阻塞的事件驱动处理引擎(epoll)实现,利用线程池处理阻塞的磁盘调用。最后通过应用层的协议,比如http、mail、stream、FastCGI等协议代理到响应的应用服务器。

    nginx的进程结构

    1.单进程结构

    不适用于生产环境。

    2.多进程结构

    利用服务器多核的特性,实现健壮的nginx。为什么不是多线程呢?因为nginx要保持他的高可用性,高可靠性。进程是资源调度的基本单位,线程之间是共享内存的,容易导致内存错误。

    worker处理真正的请求,master主要是监控worker进程,master和worker之间通过signal进行通信。

    缓存要被cachemanager、cacheloader、多个worker进程之间共享。

    worker进程间通讯都是通过共享内存实现的,每个worker独占一颗cpu内核,减少缓存失效的命中率。

    nginx重新启动配置文件:  nginx -s reload 

    查看本地示例:

    # 查看当前的nginx进程
    ➜ nginx ps -ef | grep nginx 501 13775 1 0 8:42下午 ?? 0:00.00 nginx: master process /Users/xiaohuochai/Desktop/nginx/sbin/nginx 501 13776 13775 0 8:42下午 ?? 0:00.00 nginx: worker process 501 13785 885 0 8:42下午 ttys005 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn nginx # 给父进程发送hup信号(其实结果是会reload
    ➜ nginx
    kill -SIGHUP 13775
    # 查看hup之后的进程结果(worker进程们的pid变了,说明worker们 reload了 子进程无论是新启还是kill 都会给master发送信号 ➜ nginx
    ps -ef | grep nginx 501 13775 1 0 8:42下午 ?? 0:00.00 nginx: master process /Users/xiaohuochai/Desktop/nginx/sbin/nginx 501 13942 13775 0 8:46下午 ?? 0:00.00 nginx: worker process 501 13948 885 0 8:46下午 ttys005 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn nginx ➜ nginx

    nginx使用信号管理父子进程

    (进程间交换数据必须通过内核,常见的多进程间通信方式:共享内存、信号、匿名管道、有名管道、高级管道、消息队列、信号量、套接字) 

    master、worker、nginx命令行都可以发送信号,控制进程。

    linux规定,当子进程终止的时候,会向父进程发送‘chld’ 信号。

    master从worker接收到的消息,分别表示:

    • TERM/INT 表示立刻停止nginx进程
    • QUIT 优雅的停止nginx进程
    • HUP 重载配置文件
    • USR1 重新打开日志文件,做日志文件的切割
    • USR2 热部署使用,见下面热部署流程
    • WINCH  热部署使用

    reload重载配置文件的真相

    当配置文件发生改变的时候,都会nginx -s reload,在不影响现有业务不宕机的情况下,如何平滑的更新nginx配置。

     

    老配置worker如果长时间不优雅退出,也不会影响新worker,但是会占用系统资源。nginx提供了一个配置shutdown_timeout,可以在worker进程timeout时候强制关闭。

    热升级的完整流程 

     

    reload --重新加载,reload会重新加载配置文件,Nginx服务不会中断,master进程不会退出。而且reload时会测试conf语法等,如果出错会rollback用上一次正确配置文件保持正常运行。

    restart --重启(先stop后start),会重启Nginx服务,新启master,关闭旧的master,如果配置文件出错会导致服务启动失败,那就是更长时间的服务中断了。

     优雅的关闭worker进程

    worker关闭连接池的所有连接后,才会退出进程。如果超时,所有链接会被强制关闭。

    网络收发与nginx事件间的对应关系

     

    wireshark和charles抓包有什么优缺点?

    (感觉wireshark复杂一些??

    nginx的事件驱动模型, 事件循环+分发

    当有新事件到达时,push进事件队列,但是如果事件队列中的时间长时间得不到处理,引发恶性循环,大量的cpu计算资源都会消耗在不正常的事件。

    epoll(网络事件收集器模型)的优劣以及原理

     这张图比较了几种常见的事件处理模型,横轴是连接句柄也就是并发数量,纵轴是随着并发增加分发事件所消耗的时间,图中曲线代表着不同的事件分发模型的效率。

    epoll的事件处理时间与句柄数增加几乎是无关的,适合做大并发连接的处理,在linux 2.5.44内核中被引入(深入浅出nodejs里面有讲

    nginx的请求切换

  • 相关阅读:
    tcp 粘包 和 TCP_NODELAY 学习
    分解抓取的包文件代码实现学习
    谨慎使用多线程中的fork 学习!!!!
    面试题
    Java并发编程:Lock
    为什么匿名内部类参数必须为final类型
    sql 面试题
    java hashCode方法返回值
    数组初始化
    Java内存模型
  • 原文地址:https://www.cnblogs.com/catherinezyr/p/13426141.html
Copyright © 2011-2022 走看看