Nginx
Nginx ,是一个 Web 服务器和反向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。不仅可以实现负载均衡,还可以做接口限流,缓存等功能
使用Nginx的优势点
-
Nginx由于使用了epoll和kqueue网路I/O模型,在实际生产环境能够支撑3万左右并发连接。
-
Nginx内存消耗低。
-
Nginx跨平台,而且配置相对来说难度较低。
-
Nginx内置健康检查功能,如果负载均衡其中一个服务器宕机了,则接受到的请求会发送给其他服务器去处理。
-
支持Gzip压缩,可以添加浏览器本地缓存的Header头。
-
Nginx支持热部署,可以在不间断服务的情况下平滑进行配置的更改。
-
Nginx异步接收用户请求,减轻了Web服务器的压力。
Nginx如何实现高并发
这个问题出来可能懂一点Nginx的朋友们都是浮现出5个字:异步非阻塞。实际上Nginx就是异步非阻塞,使用了epoll模型并对底层代码进行大幅度优化。之前其实有讲过Nginx是采用1个master进程,多个worker进程的模式,每次接收到一个请求,master会将请求按照一定策略分发给一个worker进程去进行处理请求。worker进程数一般设置为和CPU核心数一致,异步非阻塞模式就会使得worker线程在等待请求callback的空闲时间可以接收处理新的请求,当接收到旧请求的callback时再回去继续处理该请求,这样就完成了少数几个worker进程却实现了高并发的问题
Nginx为何不使用多线程?
众所周知,没创建一个新的线程,都需要为其分配cpu和内存。当然,创建进程也是一样,但是由于线程过多会导致内存消耗过多。所以Nginx采用单线程异步处理用户请求,这样不需要不断地为新的线程分配cpu和内存,减轻服务器内存消耗,所以使得Nginx性能方面更为高效。
Nginx如何处理请求?
Nginx启动后,首先进行配置文件的解析,解析成功会得到虚拟服务器的ip和端口号,在主进程master进程中创建socket,对addrreuse选项进行设置,并将socket绑定到对应的ip地址和端口并进行监听。然后创建子进程worker进程,当客户端和Nginx进行三次握手,则可以创建成功与Nginx的连接。当有新的请求进入时,空闲的worker进程会竞争,当某一个worker进程竞争成功,则会得到这个已经成功建立连接的socket,然后创建ngx_connection_t结构体,接下来设置读写事件处理函数并添加读写事件用来与客户端进行数据交换。当请求结束Nginx或者客户端主动关闭连接,此时一个请求处理完毕。
为什么要做动静分离?
在日常开发中,前端请求静态文件比如图片资源是不需要经过后端服务器的,但是调用API这些类型的就需要后端进行处理请求,所以为了提高对资源文件的响应速度,我们应该使用动静分离的策略去做架构。我们可以将静态文件放到Nginx中,将动态资源的请求转发到后端服务器去进行进一步的处理。
Nginx正向代理
一句话来概括就是正向代理代理的是客户端,是一个位于客户端和Google服务器之间的服务器,为了从Google服务器取得数据,客户端向代理服务器发送一个请求并指定目标(Google服务器),然后代理向原始服务器转交请求并将获得的数据返回给客户端。总结正向代理的几个作用:
- 访问国外无法访问的网站做缓存,加速访问资源
- 对客户端访问授权,上网进行认证代理
Nginx反向代理
多个客户端给服务器发送的请求,Nginx服务器接收到请求以后,按照一定的规则转发到不同的服务器进行业务逻辑处理,也就是我们刚才讲到的负载均衡的策略。此时请求来源于哪个客户端是确定的,但是请求由哪台服务器处理的并不明确,Nginx扮演的就是一个反向代理角色。可以这样来理解,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。反向代理代理的是服务端,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。总结下反向代理的两个作用:
-
在正向代理中,隐藏了请求来源的客户端信息;
-
在反向代理中,隐藏了请求具体处理的服务端信息;