Nginx

262 阅读4分钟

参考:zhuanlan.zhihu.com/p/31196264

什么是Ngnix

  • Nginx是一个高性能的HTTP和反向代理web服务器
  • Nginx 默认采用守护模式启动,守护模式让master进程启动后在后台运行。在Nginx运行期间主要由一个master主进程和多个worker进程(数目一般与cpu数目相同)
  • master主进程主要是管理worker进程,对网络事件进行收集和分发

Nginx的功能:

  • 静态服务器
  • 正向代理:代理的是用户
  • 反向代理:代理的是服务器
  • 负载均衡
  • 资源缓存

1. Nginx原理

1.1 Http协议

Request Method: GET
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BIDUPSID=6FDCB80C810B35D150145FAB9A30365B;
Host: www.baidu.com
Referer: https://www.baidu.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
X-Requested-With: XMLHttpRequest

HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程

1. 客户与服务器建立连接;
2. 客户向服务器提出请求;
3. 服务器接受请求,并根据请求返回相应的文件作为应答;
4. 客户与服务器关闭连接。

1.2 Nginx工作流程

  • nginx用一个独立的worker进程来处理一个请求,一个worker进程可以处理多个请求
  • 当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
  • 一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处:
    • 节省锁带来的开销。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多
    • 独立进程,减少风险。
    • 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。
    • 在一次请求里无需进程切换

1.3 惊群现象

惊群效应就是当一个fd的事件被触发时,所有等待这个fd的线程或进程都被唤醒。一般都是socket的accept()会导致惊群,很多个进程都block在server socket的accept(),一但有客户端进来,所有进程的accept()都会返回,但是只有一个进程会读到数据,就是惊群。
Nginx采用accept-mutex来解决惊群问题:当以个请求到达的时候,只有竞争到锁的worker进程才会惊醒,处理请求,其他worker进程会继续等待,结合timer_solution配置的最大的超时时间继续尝试获取accept-mutex
Nginx的IO通常使用epoll,epoll使用了I/O复用模型,可以同时等待多个套接字描述符就绪。Nginx的epoll工作流程如下:

  • master进程先建好需要listen的socket后,然后再fork出多个woker进程,这样每个work进程都可以去accept这个socket
  • 当一个client连接到来时,所有accept的work进程都会受到通知,但只有一个进程可以accept成功,其它的则会accept失败,Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept连接,从而解决惊群问题
  • 当一个worker进程accept这个连接后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完成的请求就结束了

1.4 Nginx最大连接数

  • worker_processes:worker角色的进程个数
  • worker_connections:每一个worker进程能并发处理(发起)的最大连接数(包含所有连接数)
  • Nginx作为http服务器的时候:max_clients = worker_processes * worker_connections
  • Nginx作为反向代理服务器的时候:max_clients = worker_processes * worker_connections/4 (/4原因:因为浏览器默认会开启2个连接到nginx server,而且nginx还会为每个连接使用fds(file descriptor)从连接池建立connection到upstream后端。)

1.5 Nginx常用功能

  • Nginx作为负载均衡器: Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
    • 内置策略为轮询,加权轮询,Ip hash。
    • 扩展策略由第三方实现。
    • 轮询与加权轮询:
  • Nginx作为Web缓存
    • 可以把静态资源放在Nginx服务器上(比如前端页面资源)
    • Nginx可以对不同的文件做不同的缓存处理,配置灵活。
    • 配合着第三方的ngx_cache_purge,对指定的URL缓存内容可以的进行增删管理。