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

猜你喜欢

转载自blog.csdn.net/weixin_44477424/article/details/131565258