-
全部指令目录(淘宝翻译):http://tengine.taobao.org/nginx_docs/cn/docs/dirindex.html
-
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 采用的进程模型有什么好处呢?
- 对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
- 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,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)。没有移除,就两者会交替出现。