0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解Nginx负载均衡

马哥Linux运维 来源:博客园 2025-06-25 14:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Nginx作为负载均衡器,通过将请求分发到多个后端服务器,以提高性能、可靠性和扩展性。支持多种负载均衡算法,如轮询、最小连接数、IP哈希等,可以根据需求选择适合的算法。

一、工作原理

nginx的高性能主要是因为

1、事件驱动架构

Nginx采用事件驱动的非阻塞方式处理请求,主要利用了操作系统提供的多路复用机制,通过异步非阻塞的方式处理大量并发请求,减少了线程切换和资源消耗,提高了并发处理能力和系统的稳定性。

2、事件循环

事件循环机制是核心的工作模式之一。它通过单线程的方式处理事件,包括等待事件、处理事件和继续循环。在等待事件时,Nginx并不会像传统多线程模型那样阻塞等待,而是通过事件通知机制在有事件发生时再进行处理,这样可以充分利用CPU资源,提升系统的效率和性能。

3、多进程

Nginx可以通过配置文件中的worker_processes选项来启动多个进程来处理请求。每个进程都有自己独立的事件循环和资源管理,进程之间没有共享状态,这种设计可以避免单点故障,提高系统的可靠性和稳定性。并且Nginx的多进程模型使得它能够更好地利用多核CPU,通过并行处理请求来提高整体的处理能力。

二、反向代理

server {
  listen 80; 
  server_name example.com; 
  root /root/build/;#静态资源地址
  index index.html;  

  location /api/server/ {
    proxy_pass http://localhost:8080;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
    proxy_set_header X-Forwarded-For
  }
}

例如在这个例子中,设置了index目录和静态资源目录。并且设置了域名访问。很大了保证了服务器的安全性。在下面的反向代理配置中,通过正则表达式将/api/server/开头的映射到http://localhost:8080这个地址。

ec2666c8-4dba-11f0-b715-92fbcf53809c.pngwhiteboard_exported_image.png

三、负载均衡

负载均衡也就是通过反向代理到不同的服务,保证服务的可用性。多用于在分布式系统中。例如某个系统分布在100个服务器上,当某几台服务器崩溃时,会代理到其他服务器,不会影响系统的运行。更好的实现横向扩展。

例如一个简单的get请求代码

importtornado.ioloop
importtornado.web

classMainHandler(tornado.web.RequestHandler):
 defget(self):
   self.write("Hello, Tornado!")

defmake_app():
 returntornado.web.Application([
    (r"/", MainHandler),
  ])

if__name__ =="__main__":
  app = make_app()
  app.listen(8888)
 print("Server running on http://localhost:8888")
  tornado.ioloop.IOLoop.current().start()

具体的负载均衡算法

1、轮询

nginx的均衡默认算法:直接基于事件循环。类似于排队,一个一个来,例如第一个请求分发给第一个服务,第二个就分发给第二个服务,以此类推。缺点:没有具体情况具体分析,某些情况下的请求会导致负载很高。

upstream tornado_servers {
  server 192.168.31.158:8888;
  server localhost:8888;
}

server {
  listen 80;
  server_name 192.168.62.132;

  location / {
    proxy_pass http://tornado_servers;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
  }
  location /nginx_status {
  stub_status on;
  access_log off;
  allow 192.168.62.0/24; # 允许访问的IP地址,根据需要调整
  deny all;    # 禁止其他IP地址访问
  }  
}

将上述访问运行在两个不同的服务器上,默认的轮询会每个服务器都请求一次,除非有一台掉线,否则nginx会均分请求。

下面行的localhost块b表示新的匹配规则,用于查看nginx当前的连接数和请求统计信息。

server accepts handled requests

Active connections: 1

表示当前活跃的连接数,即正在与Nginx服务器建立通信的客户端连接数量。

server accepts handled requests

accepts: 表示Nginx已经接受的连接总数。

handled: 表示Nginx已经处理的连接总数。

requests: 表示Nginx已经处理的请求总数。

Reading: 0 Writing: 1 Waiting: 0

Reading: 正在读取客户端请求的数量。

Writing: 正在向客户端发送响应的数量。

Waiting: 当前空闲的客户端连接数,等待处理请求

2、最少连接

会将请求分配给连接最少的服务,保证系统的整体性能。缺点是没有具体情况具体分析,没有考虑负载情况,不是请求越多负载越大。

upstream tornado_servers {
  least_conn; # 使用最少连接数算法
  server192.168.31.158:8888;
  server localhost:8888;
}

server {
 listen80;
  server_name192.168.62.132; 

  location / {
    proxy_pass http://tornado_servers;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
  }
}

least_conn字段表示使用最少连接算法。

3、IP哈希

通过客户端的IP地址的哈希值分配给特定的服务器,如果下一次请求的IP哈希值与之前一样,那么依然会请求到之前的服务器。如果不一样那么为新的服务器创建新的哈希值。这样避免了服务器的切换开销,保持了会话的一致性。但是这样的缺点是同一个客户端的请求无法做到负载均衡。

upstream tornado_servers {
  ip_hash; # 使用IP哈希算法
  server 192.168.31.158:8888;
  server localhost:8888;
}

server {
  listen 80;
  server_name 192.168.62.132; 

  location / {
    proxy_pass http://tornado_servers;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
  }
  location /nginx_status {
  stub_status on;
  access_log off;
  allow 192.168.62.0/24; # 允许访问的IP地址,根据需要调整
  deny all;    # 禁止其他IP地址访问
  }
}

4、加权轮询

在轮询的基础上为每个服务器加上一个权重值,每个服务器的承受连接数量。在轮询的情况下再次考虑权重值。例如两台服务器,服务器A、B的权重分别为5,3轮询流程为:

第一次请求:服务器A处理请求

第二次请求:服务器B处理请求

第三次请求:服务器A处理请求

第四次请求:服务器A处理请求

第五次请求:服务器A处理请求

第六次请求:服务器B处理请求

upstream tornado_servers {
  server 192.168.31.158:8888 weight=5;
  server localhost:8888 weight=3;
}

server {
  listen 80;
  server_name 192.168.62.132;

  location / {
    proxy_pass http://tornado_servers;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
  }
  location /nginx_status {
  stub_status on;
  access_log off;
  allow 192.168.62.0/24; # 允许访问的IP地址,根据需要调整
  deny all;    # 禁止其他IP地址访问
  }
}

5、加权最小连接

在最小连接的算法基础上,加上权重值。这时候需要根据连接数量和权重值来评估目标服务器。

例如服务器A、B、C。权重值分别为5、3、2。连接数分别为10、5、3.

计算加权连接数:

服务器A:10/5=2

服务器B:5/3=1.67

服务器C:3/2=1.5

那么根据加权连接数,最小加权连接数为1.5。那么会代理到服务器C

upstream tornado_servers {
  least_conn; # 使用最少连接数算法
  server 192.168.31.158:8888 weight=5;
  server localhost:8888 weight=3;
}

server {
  listen 80;
  server_name 192.168.62.132;

  location / {
    proxy_pass http://tornado_servers;
    proxy_set_header Host$host;
    proxy_set_header X-Real-IP$remote_addr;
  }
  location /nginx_status {
  stub_status on;
  access_log off;
  allow 192.168.62.0/24; # 允许访问的IP地址,根据需要调整
  deny all;    # 禁止其他IP地址访问
  }
}

四、总结

反向代理就像是位于用户和真实服务器之间的一座桥梁,它接收用户的请求并将其转发到后端的多台服务器上。这种配置不仅隐藏了真实服务器的信息,还能提供安全性和负载均衡功能。负载均衡通过智能地分发请求到不同的服务器,确保每台服务器的负载相对平衡,从而提高整体性能和可靠性。这种结合能够有效地处理高并发请求,保证系统在压力下仍能保持稳定运行。

链接:https://www.cnblogs.com/changwan/p/18246095

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10093

    浏览量

    90856
  • nginx
    +关注

    关注

    0

    文章

    180

    浏览量

    12961
  • 负载均衡器
    +关注

    关注

    0

    文章

    20

    浏览量

    2702

原文标题:手把手教程:10分钟快速搭建Nginx负载均衡环境

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高性能负载均衡Tomcat集群的实现

    Nginx+Tomcat搭建高性能负载均衡集群
    发表于 08-21 14:31

    使用nginx实现tomcat负载均衡

    Nginx+tomcat+memcached实现负载均衡及session(交叉存储)
    发表于 08-28 08:52

    nginx实现的负载均衡

    nginx实现负载均衡
    发表于 05-04 13:42

    16nginx+keepalived +zuul如何实现高可用及负载均衡

    学习笔记微服务-16 nginx+keepalived +zuul 实现高可用及负载均衡
    发表于 05-22 10:16

    Nginx和Tomcat负载均衡实现session共享

    Nginx和Tomcat负载均衡实现session共享
    发表于 09-05 10:40 9次下载
    <b class='flag-5'>Nginx</b>和Tomcat<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>实现session共享

    构建实战:Nginx+IIS构筑Web服务器集群负载均衡

    构建实战:Nginx+IIS构筑Web服务器集群负载均衡
    发表于 09-05 10:56 4次下载
    构建实战:<b class='flag-5'>Nginx</b>+IIS构筑Web服务器集群<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    f5负载均衡Nginx负载均衡有什么区别

    负载均衡是分摊到多个操作单元上进行执行,建立在现有网络结构之上,提供了种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。市场上有很多的
    发表于 01-01 18:41 9642次阅读
    f5<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>和<b class='flag-5'>Nginx</b><b class='flag-5'>负载</b><b class='flag-5'>均衡</b>有什么区别

    路由器负载均衡如何设置_路由器负载均衡的模式详解

    在路由器中加入负载均衡技术已经不是新鲜事。那么现在已经衍生出很多种路由负载模式,不同的模式状态下,可以完成不同的任务。而且模式间也可以进行转化和结合。下面详细介绍路由器负载
    发表于 01-01 19:43 4.1w次阅读
    路由器<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>如何设置_路由器<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>的模式<b class='flag-5'>详解</b>

    超详细!使用 LVS 实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡
    发表于 01-21 14:01 1543次阅读

    读懂Nginx、Apache工作原理

    在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx
    发表于 04-26 11:33 2711次阅读

    详解Nginx负载均衡配置误区

    之前有很多朋友问关于Nginx的upstream模块中max_fails及fail_timeout,这两个指令,分别是配置关于负载均衡过程中,对于上游(后端)服务器的失败尝试次数和不可用时间,很多人
    的头像 发表于 05-13 14:36 2260次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>Nginx</b><b class='flag-5'>负载</b><b class='flag-5'>均衡</b>配置误区

    聊聊Nginx作为负载均衡器它支持的算法都有哪些?

    Nginx作为款最流行WEB服务器软件,同时也是款反向代理和负载均衡软件。毫不夸张地说,Nginx
    的头像 发表于 02-14 17:50 1246次阅读

    如何使用Nginx作为应用程序的负载均衡器?

    Nginx因其高性能和可扩展性而广受欢迎。它是排名第的开源Web 服务器。在本教程中,我们将学习如何使用Nginx作为应用程序的负载均衡
    的头像 发表于 03-23 14:52 1707次阅读

    搭建Keepalived+Lvs+Nginx高可用集群负载均衡

      Nginx安装 二、配置反向代理 三、配置负载均衡 四、upstream指令参数 五、配置ssl证书提供https访问 六、配置ha ngi
    的头像 发表于 06-25 15:39 4059次阅读
    搭建Keepalived+Lvs+<b class='flag-5'>Nginx</b>高可用集群<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    nginx负载均衡配置介绍

    代理 安装Keepalived 配置Keepalived 编写脚本监控Keepalived和nginx的状态 配置keepalived加入监控脚本的配置 nginx负载均衡介绍
    的头像 发表于 11-10 13:39 1209次阅读
    <b class='flag-5'>nginx</b><b class='flag-5'>负载</b><b class='flag-5'>均衡</b>配置介绍