zoukankan      html  css  js  c++  java
  • nginx 知识点

    nginx -s [signal]
    

    -s,意思是:signal
    signal 可以是下面4个:
    stop — fast shutdown
    quit — graceful shutdown
    reload — reloading the configuration file
    reopen — reopening the log files

    • nginx 启动、停止、重启命令
    命令 作用
    nginx 启动
    ps -ef | grep nginx 查看主进程号
    kill -QUIT <nginx主进程号> 从容停止
    kill -TERM <nginx主进程号> 快速停止
    kill -9 <nginx主进程号> 强制停止
    kill -信号类型(HUP | TERM | QUIT) `cat <存放nginx主进程号的文件>` mac下,默认存放nginx主进程号的文件是:/usr/local/var/run/nginx.pid
    • nginx 命令行参数:
    命令 作用
    -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的。
    -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
    -v 显示 nginx 的版本。
    -V 显示 nginx 的版本,编译器版本和配置参数。
    • nginx控制信号
      可以使用信号系统来控制主进程。
      mac下,nginx 默认将其主进程的 pid 写入到 /usr/local/var/run/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。

    主进程可以处理以下的信号:

    信号 作用
    TERM, INT 快速关闭
    QUIT 从容关闭
    HUP 重载配置:用新的配置开始新的工作进程,从容关闭旧的工作进程
    USR1 重新打开日志文件
    USR2 平滑升级可执行程序。
    WINCH 从容关闭工作进程

    尽管你不必自己操作工作进程,但是,它们也支持一些信号:

    信号 作用
    TERM, INT 快速关闭
    QUIT 从容关闭
    USR1 重新打开日志文件
    • Nginx 默认以多进程的方式来工作,也支持多线程。

    • Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程。而基本的网络事件,则是放在 worker 进程中来处理了。
      多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

    • worker 进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。

    • 我们要控制 Nginx,只需要通过 kill 向 master 进程发送信号就行了。
      比如kill -HUP pid,则是告诉 Nginx,从容地重启 Nginx,我们一般用这个信号来重启 Nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。
      master 进程在接收到 HUP 信号后是怎么做的呢?首先 master 进程在接到信号后,会先重新加载配置文件,然后再启动新的 worker 进程,并向所有老的 worker 进程发送信号,告诉他们可以光荣退休了。新的 worker 在启动后,就开始接收新的请求,而老的 worker 在收到来自 master 的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。

    • 执行命令:./nginx -s reload,是启动了一个新的 Nginx 进程,新的 Nginx 进程在解析到 reload 参数后,就知道我们的目的是控制 Nginx 来重新加载配置文件了,它会向 master 进程发送信号,然后接下来的动作,就和我们直接向 master 进程发送信号一样了。

    • worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。怎么做到的呢?
      首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多个 worker 进程。所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有 worker 进程在注册 listenfd 读事件前抢 accept_mutex,抢到互斥锁的那个进程注册 listenfd 读事件,在读事件里调用 accept 接受该连接。当一个 worker 进程在 accept 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。

    • Nginx 采用的进程模型有什么好处呢?

    1. 对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
    2. 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
    • Nginx 采用异步非阻塞的方式来处理请求

    • 对于一个基本的 Web 服务器来说,事件通常有三种类型:网络事件、信号、定时器。

    • 非阻塞就是,事件没有准备好,马上返回 EAGAIN,告诉你,事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。

    负载均衡模块

    负载均衡模块用于从upstream指令定义的后端主机列表中选取一台主机。Nginx 先使用负载均衡模块找到一台主机,再使用 upstream 模块实现与这台主机的交互。

            upstream test {
                ip_hash; //负载均衡算法的一种
    
                server 192.168.0.1;
                server 192.168.0.2;
            }
    
    • 为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 ETag(Entity Tag)。移除了,就总是 200 OK (from cache)。没有移除,就两者会交替出现。
  • 相关阅读:
    .NET中二进制图片的存储与读取
    mantis基本配置及邮件服务器配置
    搜狗浏览器特性页面JS
    从多个textarea中随机选取一个内容
    JS截取字符串substr 和 substring方法的区别
    MySQL递归的替代方案
    Eclipse去掉对JS文件的Validation
    Hadoop学习笔记二
    es随想二
    Hadoop学习笔记一
  • 原文地址:https://www.cnblogs.com/cag2050/p/7683269.html
Copyright © 2011-2022 走看看