• nginx的原理


    Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程

    (cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

    主进程主要完成如下工作:

    1. 读取并验正配置信息;

    2. 创建、绑定及关闭套接字;

    3. 启动、终止及维护worker进程的个数;

    4. 无须中止服务而重新配置工作特性;

    5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;

    6. 重新打开日志文件,实现日志滚动;

    7. 编译嵌入式perl脚本;

    worker进程主要完成的任务包括:

    1. 接收、传入并处理来自客户端的连接;

    2. 提供反向代理及过滤功能;

    3. nginx任何能完成的其它任务;

    cache loader进程主要完成的任务包括:

    1. 检查缓存存储中的缓存对象;

    2. 使用缓存元数据建立内存数据库;

    cache manager进程的主要任务:

    1. 缓存的失效及过期检验;

    运行中的Nginx进程间的关系在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker进程,一般情况下,

    worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都是繁忙的,它们在真正地提供互联网服务,master进程则很“清闲”,只负责监控管理

    worker进程。worker进程之间通过共享内存、原子操作等一些进程间通信机制来实现负载均衡等功能

     部署后Nginx进程间的关系如图。Nginx是支持单进程(master进程)提供服务的,那么为什么产品环境下要按照

    master-worker方式配置同时启动多个进程呢?这样做的好处主要有以下两点:

    由于master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程,所以master进程可以是唯一的,

    它仅专注于自己的纯管理工作,为管理员提供命令行服务,包括诸如启动服务、停止服务、重载配置文件、平滑升级程

    序等。

    master进程需要拥有较大的权限,例如,通常会利用root用户启动master进程。worker进程的权限要小于或等于master

    进程,这样master进程才可以完全地管理worker进程。当任意一个worker进程出现错误从而导致coredump时,

    master进程会立刻启动新的worker进程继续服务。

    多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。另外,为什么要把worker进程数量设置得与CPU核心数量一致呢?这正是Nginx与Apache服务器的不同之处。在Apache上每个进程在一个时刻只处理一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置得更多,通常会达到一台服务器拥有几百个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗。而Nginx则不然,一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的

     

     
  • 相关阅读:
    JS转义 escape()、encodeURI()、encodeURIComponent()区别详解
    PHP解决搜索时在URL地址栏输入中文字符搜索结果出现乱码
    CMSPRESS-PHP无限级分类2
    CMSPRESS-PHP无限级分类
    HTML5-CSS3-JavaScript(3)
    HTML5-CSS3-JavaScript(2)
    HTML5-CSS3-JavaScript(1)
    CSS3-Hover 效果 展示
    JAVA Socket地址绑定
    JAVA Socket无参构造方法的使用
  • 原文地址:https://www.cnblogs.com/yaozhiqiang/p/7197946.html
Copyright © 2020-2023  润新知