Nginx问题汇总

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Nginx问题汇总

为什么Nginx性能这么高?

  • 主要是因为他的事件处理机制:异步非阻塞事件处理机制(事件驱动的异步模型):运用了epoll模型,Nginx 会创建一些事件对象,然后将这些事件对象注册到事件驱动器中。当事件发生时,事件驱动器会通知 Nginx 处理该事件,从而实现异步处理用户请求的目的。
  • 同时提供了一个事件队列队列,逐个处理队列中的事件。这种方式可以确保 Nginx 能够高效地处理大量的连接请求,同时保持较低的系统负载。
  • 某个 I/O 事件阻塞了,那么它不会影响其他 I/O 事件的处理,因为 Nginx 是基于事件驱动的模型,可以同时处理多个事件。当某个 I/O 事件被阻塞时,Nginx 会将该事件从 epoll 监听队列中移除,并将其放入一个新的队列中,等待下一次 epoll 监听到该事件的可用状态时再次处理。这种方式可以确保 Nginx 在高并发场景下保持稳定性和可靠性。

什么是正向代理和反向代理?

  1. 正向代理代理的是客户端,客户端发送请求会指定服务端地址和端口,nginx收到请求,会将数据直接发送到目标的服务器,收到响应后,nginx在返回给客户端。正向代理可以隐藏实际的客户端,对于服务器来说,nginx就是客户端。
  2. 反方代理代理的是服务端,客户端发送的请求(不用指定服务端地址和端口)统一被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限流

  1. 限制访问频率

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就会拒绝处理该用户请求。

  1. 或者限制突发流量
location/seckill.html{
      limit_req zone=zone burst=5 nodelay;
      proxy_pass http://lj_seckill;
    }

多了一个 burst=5 nodelay; 多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求

  1. 限制并发连接数

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模块。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
缓存 应用服务中间件 nginx
nginx(四)
nginx(四)
|
6月前
|
负载均衡 应用服务中间件 网络安全
Nginx详解
Nginx详解
81 2
|
6月前
|
缓存 负载均衡 应用服务中间件
2.nginx
2.nginx
46 1
|
6月前
|
缓存 负载均衡 应用服务中间件
Nginx(一)
Nginx(一)
56 0
|
6月前
|
负载均衡 JavaScript 应用服务中间件
nginx使用
nginx使用
|
6月前
|
缓存 前端开发 JavaScript
Nginx
Nginx
79 0
|
6月前
|
缓存 负载均衡 应用服务中间件
nginx 就该这么用
nginx 就该这么用
43 0
|
负载均衡 应用服务中间件 nginx
|
缓存 负载均衡 JavaScript
Nginx 简单入门指北不指南
Nginx 简单入门指北不指南
132 0
|
负载均衡 应用服务中间件 nginx
五分钟进步系列之nginx(一)
五分钟进步系列之nginx(一)