• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
菩提叶子
博客园    首页    新随笔    联系   管理    订阅  订阅
nginx

一、实现原理

异步,非阻塞,使用了epoll 和大量的底层代码优化。

nginx采用linux的epoll模型,epoll模型基于事件驱动机制,可以监控多个事件是否准备完毕,如果可以,就放入epoll队列,这个过程是异步的。worker进程只需要从epoll队列循环处理即可。

 

 

 

如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。正常情况下,会有很多进程一直在等待中。

 

而nginx采用一个master进程,多个woker进程的模式。

 

 master进程主要负责收集、分发请求。每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。

 

同时master进程也负责监控woker的状态,保证高可靠性

 

woker进程一般设置为跟cpu核心数一致。nginx的woker进程在同一时间可以处理的请求数只受限制,可以处理多个请求。

 

Nginx 的异步非阻塞工作方式正把当中的等待时间利用起来了。在需要等待的时候,这些进程就空闲出来待命了,因此表现为少数几个进程就解决了大量的并发问题。

 

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker很聪明,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。

 

此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

 

 

 二、为什么不使用多线程

创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会耗光服务器资源。

Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

 

三、nginx常见优化配置

1、调整worker_processes

指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程。

了解系统中的CPU核心数,输入$ grep processor / proc / cpuinfo | wc -l

2、最大化worker_connections

Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数

为了最大化Nginx的全部潜力,应将工作者连接设置为核心一次可以运行的允许的最大进程数1024。

3、启用Gzip压缩

压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度

 

4、为静态文件启用缓存

 

为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件:

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}

5、Timeouts

keepalive连接减少了打开和关闭连接所需的CPU和网开销,获得最佳性能需要调整的变量可参考:

 

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

 

6、禁用access_logs

访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能。

完全禁用访问日志记录

access_log off;

如果必须具有访问日志记录,则启用访问日志缓冲

 

 

7、proxy buffer不够

如果你用了Proxying,调整

 

proxy_buffer_size 16k;
proxy_buffers 4 16k;

 

8、脚本时间过长

将脚本时间设置改成一个时间

#将0s改成一个时间
name="request_terminate_timeout">0s

四、nginx负载均衡反向代理简单配置

1、修改nginx配置文件,在server上方添加上游服务器IP地址,location设置proxy pass加上游服务器的字典名称,调用时会采用轮询策略,访问不同的IP地址

 

#设置代理服务器IP地址
upstream rebalance1{
    server 192.168.0.1:80;
    server 192.168.0.2:80;
    server 192.168.0.3:80;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}    

 

2、可在上游服务器添加代理服务器是采用权重值分配,权重越高分配到需要处理的请求越多,适用于服务器配置差别较大

#设置代理服务器IP地址
upstream rebalance1{
    server 192.168.0.1:80 weight 8;
    server 192.168.0.2:80 weight 5;
    server 192.168.0.3:80 weight 1;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

3、设置不参与负载均衡服务器,down :表示这个机器不参与负载均衡,已下线

#设置代理服务器IP地址
upstream rebalance1{
    server 192.168.0.1:80 weight 8 down;
    server 192.168.0.2:80 weight 5;
    server 192.168.0.3:80 weight 1;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

4、设置备用服务器,backup :表示这台机器作为备用,其他的都挂掉之后,这个会起作用

 

#设置代理服务器IP地址
upstream rebalance1{
    server 192.168.0.1:80 weight 8 down;
    server 192.168.0.2:80 weight 5;
    server 192.168.0.3:80 weight 1 backup;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

5、在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。 ip_hash不能与backup同时使用。此策略适合有状态服务,比如session。 当有服务器需要剔除,必须手动down掉。负载均衡按照客户端ip地址的分配方式,可以确保相同的客户端请求一直发送到相同的服务器。

#设置代理服务器IP地址
upstream rebalance1{
    ip_hash;  
    server 192.168.0.1:80 weight 8 down;
    server 192.168.0.2:80 weight 5;
    server 192.168.0.3:80 weight 1 max_fails=6 fail_timeout=20s;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

6、least_conn

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。 除了上面这些调度策略之后,还有一些第三方的调度策略可以集成到nginx中。

在实际运用中,需要根据不同的场景选择不同的策略,大多是多种策略结合使用以达到实际需求的性能。

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果

7、第三方负载均衡策略url_hash

 

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。

 

#设置代理服务器IP地址
upstream rebalance1{
    hash $request_url;  
    server 192.168.0.1:80;
    server 192.168.0.2:80;
    server 192.168.0.3:80;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

 

8、第三方负载均衡策略fair

按照服务器端的响应时间来分配请求,响应时间短的优先分配

#设置代理服务器IP地址
upstream rebalance1{
    server 192.168.0.1:80 ;
    server 192.168.0.2:80 ;
    server 192.168.0.3:80 ;
    fair;
}
#修改location,指向设置的代理服务器
server{
    listen 80;
    server_name localhost;
    location / {
        proxy pass rebalance1;
        root html;
        index index.html index.htm;
    }    
}

9、动静分离

在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性,简单点来说,就是用户在请求的时候,如果只是简单的访问图片,html等静态的请求时,nginx直接返回,如果是发送动态请求时候,需要程序进行就由nginx把请求发送给程序,进行动态处理。

 

#拦截静态请求
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
    root /usr/local/data;
}

 

posted on 2022-11-03 17:46  菩提叶子  阅读(51)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3