NGINX是什么?
NGINX是一款由俄罗斯人伊戈尔·赛索耶夫使用C语言开发的、支持热部署的、轻量级的WEB服务器/反向代理服务器/电子邮件代理服务器,因为占用内存较少,启动极快,高并发能力强,所以在互联网项目中广泛应用。可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 等操作系统中运行。
- 官网:NGINX官方网站
- 中文:NGINX中文网站
NGINX可以干什么?
NGINX可以作为静态页面的WEB服务器,同时还支持CGI协议的动态语言,比如Perl、PHP等。NGINX专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,NGINX在官方测试中,能够支持五万个平行链接,而在实际的运作中,可以支持二万至四万个平行链接,总结如下:
- 静态页面的WEB服务器
- 动静分离
- 客户端的正向代理
- 服务端的反向代理
- 服务端的负载均衡
什么是简单请求?
请求同时满足以下两个条件,称为简单请求,否则为复杂请求
- 请求方式是HEAD、GET、POST 三种之一;
- 请求头包含但不超过这五个字段:Accept,Accept-Language,content-Language,Last-Event-ID,Content-Type。其中Content-Type的值只能是application/x-www-form-urlencoded,text/plain,multipart/form-data 三种之一。
什么是复杂请求?
凡是不简单请求的,都属于复杂请求,常见的复杂请求:
- 请求方法是 PUT 或 DELETE的请求;
- 请求头的Content-Type 值为application/json的请求
什么是动静分离?
动静分离,其实就是使用NGINX的特性,将客户端发来的请求分为动态请求和静态请求。静态请求直接从NGINX服务器所设定的根目录去获取对应的资源,动态请求则转发给真实的后端服务去处理。这样不仅能够减轻应用服务器的压力,将后台API接口服务化,还能将前后端代码分开并行开发和部署。一般常见于SPRINGBOOT + VUE的项目中。
那么,如何配置呢?
什么是正向代理?
正向代理隐藏了真实的客户端,VPN其实就是一个正向代理工具。当使用VPN访问墙外网站是,VPN将访问请求,代理到一个可以访问该网站的代理服务器上,代理服务器把墙外服务器上获取的请求结果,再转发给客户端,这就是正向代理。
什么是反向代理?
反向代理隐藏了真实的服务端,当我们访问百度时,其实内部会进行一个转发,将请求代理到内网去,但是具体是哪一台,我们不知道,我们也不需要知道,这就是所谓的反向代理,即反向代理“代理”的是服务器端,且这个过程对于客户端而言是透明的。
负载均衡采用的就是反向代理。
什么是负载均衡?
在互联网项目中,当遇到请求爆发式增长的情况时,单个服务器无法处理客户端请求,需要使用多个服务器来分摊压力,这就是负载均衡的初衷。
NGINX是如何工作的?
NGINX采用MASTER-WORKER的模式,NGINX在启动后,会以守候进程的方式在后台运行,启动后包含一个MASTER进程和多个WORKER进程,WORKER进程以非root用户运行,当然也可以在配置文件中配置运行 WORKER进程的用户。
WORKER进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个WORKER进程。
那么,如何配置WORKER的用户以及进程数呢?
NGINX的整体架构
- MASTER进程:不处理请求,主要负责加载和分析配置文件、分配请求给WORKER节点、管理WORKER进程、平滑升级、服务重启、热加载、热部署等;
- WORKER进程:接收客户端请求、将请求一次送入各模块过滤、I/O 调用、数据缓存、发送响应;
- 缓存相关进程:包括cache loader(缓存索引重建) 与 cache manager( 缓存索引管理) 两部分:
- Cache loader ,在NGINX服务启动后由主进程生成,根据本地磁盘上缓存建立索引元数据库后退出;
- Cache manager ,在元数据更新完成后,对元数据是否过期做出判断。
NGINX是如何热加载的?
所谓热部署,就是配置文件nginx.conf修改后,不需要停止NGINX服务,不需要中断请求,就能让配置文件生效!但是,NGINX必须重新加载一下nginx.conf,否则修改不生效。
使用如下命令,重新加载配置文件:
nginx -s reload
当配置文件nginx.conf修改后,需要执行重新加载配置的指令,此时NGINX接收到热加载的信号后,会重新生成新的WORKER进程,当然也是以新的配置进行请求处理的,而且新的请求一定会交给新的WORKER进程。当老的WORKER进程处理完请求后,进程会被杀死。