Nginx模块结构

Nginx主要是用于Http服务器,反向代理服务器,邮件服务器前端
Nginx由多个模块组成,每一个请求的完成都是由一个或多个模块共同完成的。nginx
Nginx 默认采用守护模式启动,守护模式让master进程启动后在后台运行。在Nginx运行期间主要由一个master主进程和多个worker进程(数目通常与cpu数目相同)算法
master主进程主要是管理worker进程,对网络事件进行收集和分发:编程
- 接收来自外界的信号
- 向各worker进程发送信号
- 监控worker进程的运行状态,当worker进程退出后(异常状况下),会自动从新启动新的worker进程
nginx用一个独立的worker进程来处理一个请求,一个worker进程能够处理多个请求:后端
- 当一个worker进程在accept这个链接以后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开链接。
- 一个请求,彻底由worker进程来处理,并且只在一个worker进程中处理。采用这种方式的好处:
- 节省锁带来的开销。对于每一个worker进程来讲,独立的进程,不须要加锁,因此省掉了锁带来的开销,同时在编程以及问题查上时,也会方便不少
- 独立进程,减小风险。
- 采用独立的进程,可让互相之间不会影响,一个进程退出后,其它进程还在工做,服务不会中断,master进程则很快从新启动新的worker进程。
- 在一次请求里无需进程切换

Nginx主要经过加锁来解决惊群现象浏览器
- 惊群效应就是当一个fd的事件被触发时,全部等待这个fd的线程或进程都被唤醒。通常都是socket的accept()会致使惊群,不少个进程都block在server socket的accept(),一但有客户端进来,全部进程的accept()都会返回,可是只有一个进程会读到数据,就是惊群。
- Nginx 采用accept-mutex来解决惊群问题:当一个请求到达的时候,只有竞争到锁的worker进程才会惊醒处理请求,其余进程会继续等待,结合 timer_solution 配置的最大的超时时间继续尝试获取accept-mutex
Nginx的IO一般使用epoll,epoll函数使用了I/O复用模型。与I/O阻塞模型比较,I/O复用模型的优点在于能够同时等待多个(而不仅是一个)套接字描述符就绪。Nginx的epoll工做流程以下:缓存
- master进程先建好须要listen的socket后,而后再fork出多个woker进程,这样每一个work进程均可以去accept这个socket
- 当一个client链接到来时,全部accept的work进程都会受到通知,但只有一个进程能够accept成功,其它的则会accept失败,Nginx提供了一把共享锁accept_mutex来保证同一时刻只有一个work进程在accept链接,从而解决惊群问题
- 当一个worker进程accept这个链接后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开链接,这样一个完成的请求就结束了
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后端。)
Nginx主要经过nginx.conf文件进行配置使用。在nginx.conf文件中主要分为:网络
- 全局块:一些全局的属性,在运行时与具体业务功能(好比http服务或者email服务代理)无关的一些参数,好比工做进程数,运行的身份等
- event块:参考事件模型,单个进程最大链接数等
- http块:设定http服务器
- server块:配置虚拟主机
- location块:配置请求路由及页面的处理状况等
Nginx 经常使用功能
Nginx支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。而且支持不少第三方的模块扩展。
Nginx做为Http代理、反向代理:session
- Nginx经过配置实现灵活的转发功能:Nginx能够根据不一样的正则匹配,采起不一样的转发策略。
- Nginx能够对返回结果进行错误页跳转,异常判断等。
- 若是被分发的服务器存在异常,它能够将请求从新转发给另一台服务器,而后自动去除异常服务器。

Nginx做为负载均衡器:
- Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
- 内置策略为轮询,加权轮询,Ip hash。
- 扩展策略由第三方实现。
- 轮询与加权轮询:

- Ip hash算法,对客户端请求的ip进行hash操做,而后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,能够解决session不共享的问题。

Nginx做为Web缓存
- 能够把静态资源放在Nginx服务器上(好比前端页面资源)
- Nginx能够对不一样的文件作不一样的缓存处理,配置灵活。
- 配合着第三方的ngx_cache_purge,对指定的URL缓存内容能够的进行增删管理。
Nginx社区分支
Openresty:做者agentzh(章宜春),最大特色是引入ngx_lua模块,支持使用lua开发插件,而且集合了不少丰富的模块以及lua库.
Tengine:主要是淘宝团队开发,特色是融入了淘宝自身业务带来的新功能,支持使用lua扩展功能
Nginx:官方版本,更新速度比较快,而且提供免费版(nginx)和商业版本(nginx plus)