Nginx是如何实现高并发的?
Nginx 采用的是多进程(单线程) & 多路IO复用模型,,异步,非阻塞.
一个主进程master,多个工作进程worker,每个工作进程可以处理多个请求
master进程主要负责收集、分发请求。每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。同时master进程也负责监控woker的状态,保证高可靠性
在nginx中的work进程中,为了应对高并发场景,采取了Reactor模型(也就是I/O多路复用,NIO):
每一个worker进程通过I/O多路复用处理多个连接请求;
为了减少进程切换(需要系统调用)的性能损耗,一般设置worker进程数量和CPU数量一致。
**I/O 多路复用模型:**在 I/O 多路复用模型中,最重要的系统调用函数就是 select(其他的还有epoll等),该方法的能够同时监控多个文件描述符的可读可写情况(每一个网络连接其实都对应一个文件描述符),当其中的某些文件描述符可读或者可写时,select 方法就会返回可读以及可写的文件描述符个数。
nginx work进程使用 I/O 多路复用模块同时监听多个 FD(文件描述符),当 accept、read、write 和 close 事件产生时,操作系统就会回调 FD 绑定的事件处理器,这时候work进程再去处理相应事件,而不是阻塞在某个请求连接上等待。这样就可以实现一个进程同时处理多个连接。
nginx和apache的区别?
轻量级,同样起web 服务,比apache 占用更少的内存及资源
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx 的 upstream支持的负载均衡方式?
轮询(默认)
weight :指定权重
ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
第三方: fair、url_hash
Nginx常见的优化配置有哪些?
调整worker_processes : 指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程
最大化worker_connections :
启用Gzip压缩 : 压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度
为静态文件启用缓存
禁用access_logs : 访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能