Nginx两大做用:1.轻量web容器 2.反向代理服务器。前端
在Java领域中,Nginx更多的被用做在前端提供负载均衡的反向代理服务。nginx
因此本文仅简要介绍下反向代理概念和负载均衡的实现。程序员
是指以代理服务器来接受internet上的链接请求,而后将请求转发给内部网络上的服务器,并将从服务器上获得的结果返回给internet上请求链接的客户端,此时代理服务器对外就表现为一个反向代理服务器。web
随便画了个流程图以下:算法
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。后端
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。服务器
nginx -s reload 因改变了Nginx相关配置,须要从新加载配置而重载。网络
nginx -s reopen 从新打开日志文件。session
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。并发
nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v 显示 nginx 的版本。
nginx -V 显示 nginx 的版本,编译器版本和配置参数。
即上面配置中的upstream可选的四种负载均衡算法
nginx进程
启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程和Worker进程。
Master-Worker模式
nginx.conf
Master进程的做用是?
读取并验证配置文件nginx.conf;管理worker进程;
Worker进程的做用是?
每个Worker进程都维护一个线程(避免线程切换),处理链接和请求;注意Worker进程的个数由配置文件决定,通常和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
所谓热部署,就是配置文件nginx.conf修改后,不须要stop Nginx,不须要中断请求,就能让配置文件生效!(nginx -s reload 从新加载/nginx -t检查配置/nginx -s stop)
经过上文咱们已经知道worker进程负责处理具体的请求,那么若是想达到热部署的效果,能够想象:
方案一:
修改配置文件nginx.conf后,主进程master负责推送给woker进程更新配置信息,woker进程收到信息后,更新进程内部的线程信息。(有点valatile的味道)
方案二:
修改配置文件nginx.conf后,从新生成新的worker进程,固然会以新的配置进行处理请求,并且新的请求必须都交给新的worker进程,至于老的worker进程,等把那些之前的请求处理完毕后,kill掉便可。
Nginx采用的就是方案二来达到热部署的!
上文已经说起Nginx的worker进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。
做为专业的程序员,咱们能够开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...
要同时处理那么多的请求,要知道,有的请求须要发生IO,可能须要很长时间,若是等着它,就会拖慢worker的处理速度。
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它能够监控多个事件是否准备完毕,若是OK,那么放入epoll队列中,这个过程是异步的。worker只须要从epoll队列循环处理便可。