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)。没有移除,就两者会交替出现。

posted on 2017-10-17 18:38  cag2050  阅读(167)  评论(0编辑  收藏  举报

导航