为什么Nginx性能这么高?
- 主要是因为他的事件处理机制:异步非阻塞事件处理机制(事件驱动的异步模型):运用了epoll模型,Nginx 会创建一些事件对象,然后将这些事件对象注册到事件驱动器中。当事件发生时,事件驱动器会通知 Nginx 处理该事件,从而实现异步处理用户请求的目的。
- 同时提供了一个事件队列队列,逐个处理队列中的事件。这种方式可以确保 Nginx 能够高效地处理大量的连接请求,同时保持较低的系统负载。
- 某个 I/O 事件阻塞了,那么它不会影响其他 I/O 事件的处理,因为 Nginx 是基于事件驱动的模型,可以同时处理多个事件。当某个 I/O 事件被阻塞时,Nginx 会将该事件从 epoll 监听队列中移除,并将其放入一个新的队列中,等待下一次 epoll 监听到该事件的可用状态时再次处理。这种方式可以确保 Nginx 在高并发场景下保持稳定性和可靠性。
什么是正向代理和反向代理?
- 正向代理代理的是客户端,客户端发送请求会指定服务端地址和端口,nginx收到请求,会将数据直接发送到目标的服务器,收到响应后,nginx在返回给客户端。正向代理可以隐藏实际的客户端,对于服务器来说,nginx就是客户端。
- 反方代理代理的是服务端,客户端发送的请求(不用指定服务端地址和端口)统一被Nginx接收,nginx反向代理服务器接收到之后,**按照一定的规则(负载均衡)**分发给了后端的业务处理服务器进行处理了,nginx收到后端服务器的响应之后,再发回给客户端。反向代理可以做负载均衡,同时也可以隐藏源服务器的存在和特征,比较安全。
Nginx怎么处理请求的?
- worker进程收到请求后,首先会解析请求内容,如果是一个简单的get请求,比如请求80端口,首先后访问nginx配置文件,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; # 提供服务的端口,默认80 server_name localhost; # 提供服务的域名主机名 location / { # 第一个location区块开始 root html; # 站点的根目录,相当于Nginx的安装目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 第一个location区块结果 }
location的作用是什么?
- location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
nginx限流
- 限制访问频率
Nginx中使用ngx_http_limit_req_module模块来限制的访问频率
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; #绑定限流维度 server{ location/seckill.html{ limit_req zone=zone; proxy_pass http://lj_seckill; } }
1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。
- 或者限制突发流量
location/seckill.html{ limit_req zone=zone burst=5 nodelay; proxy_pass http://lj_seckill; }
多了一个 burst=5 nodelay; 多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求
- 限制并发连接数
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能
http { limit_conn_zone $binary_remote_addr zone=myip:10m; limit_conn_zone $server_name zone=myServerName:10m; } server { location / { limit_conn myip 10; limit_conn myServerName 100; rewrite / http://www.lijie.net permanent; } }
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。
这些限流算法都是基于漏桶算法原理实现的。
漏桶流算法和令牌桶算法
漏桶算法:突发流量会进入到一个漏桶,漏桶会按照我们定义的速率依次处理请求,如果水流过大也就是突发流量过大就会直接溢出,则多余的请求会被拒绝。所以漏桶算法能控制数据的传输速率。
令牌桶算法的机制如下:存在一个大小固定的令牌桶,会以恒定的速率源源不断产生令牌。如果令牌消耗速率小于生产令牌的速度,令牌就会一直产生直至装满整个令牌桶。
Nginx负载均衡
• 为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。
均衡算法:
- 轮询
- 权重
- ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,
并且可以有效解决动态网页存在的session共享问题
- **url_hash:**按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
Nginx为什么不使用多线程?
Nginx:
采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。
nginx模块 handler模块,filter过滤器模块,upstream模块;
handler模块是客户端访问nginx,nginx接收到请求时就开始处理,接着返回
filter过滤器模块是后端发给nginx,nginx发送给前端的,后端数据到达nginx这,filter可以对响应头和响应体进行修改,在response基础上加入一些东西
upstream模式是nginx转发给后端的模块,比如fastcgi模块。