使用nginx+docker实现一个简单的负载均衡

这篇具有很好参考价值的文章主要介绍了使用nginx+docker实现一个简单的负载均衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

 提出需求

开始

启动nginx

启动一个Django容器

部署多台服务器

1.打包一个容器

 2.开启多台服务

3.在各个容器中启动django项目

 配置nginx文件实现反向代理和负载均衡

检验

配置负载均衡的其他方法

1.轮询(默认)

2.加权轮询算法

3.ip_hash算法

4.最少连接数算法

5.url_hash算法

6.fair算法


前言

对于一个服务,当并发请求量较大时,一个服务器可能就会处理不过来,这时候就需要加多台服务器,来处理这些并发的请求,而在这么多的服务器中,当前的请求具体大道哪台服务器上呢?这个时候我们就可以用到nginx提供的的负载均衡功能,我们可以根据每台服务器的配置,将配置好一点的服务器设置更高的权重;配置低一点的服务器就设置低一点的权重,这时候较多的请求就会打在配置好一点的服务器上,较少的请求就会打在配置差一点的服务器上,从而就实现了负载均衡。

因此要想实现一个负载均衡,前提条件是我们得有多台服务器,因为资源有限,我这里就以docker启动的每台容器当做一台服务器。同时我也会将nginx运行在一个单独的容器中,也将其假设成一个单独的服务器。这时候也相当于实现了反向代理的功能。

使用nginx+docker实现一个简单的负载均衡

 提出需求

我们还是以需求驱动,有了需求之后,我们才好根据需求做出对应的决策,才好对症下药!假设我们有这样一个需求:访问我们服务的地址后,返回此时访问的真正的服务器的名称。

大体架构如下:

使用nginx+docker实现一个简单的负载均衡

 

我们假设总共有7台服务器,一台用作反向代理用,另外六台是真正提供服务的服务器。

开始

启动nginx

启动一个nginx,将容器端口80映射到本地的7777

docker run -it -p 7777:80  --name mynginx  nginx  /bin/bash

进入容器后启动nginx服务:

使用nginx+docker实现一个简单的负载均衡

 此时访问对应的网址就可以看到如下页面:使用nginx+docker实现一个简单的负载均衡

 说明nginx启动成功!

启动一个Django容器

docker run -it -p 8081:8000 --name server01 django /bin/bash

进入容器后,启动一个django项目:

django-admin startproject sayhello 

进入sayhello目录下创建一个application

python manage.py startapp app

启动django项目,检查是否启动成功

python manage.py runserver 0.0.0.0:8000

分别在容器内部和本地都访问成功!

使用nginx+docker实现一个简单的负载均衡

在app的views.py中编写相应的视图函数,添加以下内容:

import os
from django.http import HttpResponse


def get_host_name(request):
    host_name = os.environ.get('HOSTNAME', 'None')
    info = f'您当前访问的主机是:{host_name}'
    return HttpResponse(info)

在sayhello的urls中添加一条路由规则

使用nginx+docker实现一个简单的负载均衡

 编辑sayhello下的settings文件,允许所有主机访问:

使用nginx+docker实现一个简单的负载均衡

 执行迁移

python manage.py makemigrations

python manage.py migrate

重启启动django,之后再访问sayhello这条路径,就会发现它返回了主机名!

使用nginx+docker实现一个简单的负载均衡

 所以一台服务器部署成功!

部署多台服务器

1.打包一个容器

#首先将上面部署好的django打包成一个镜像,之后直接启动即可!

docker commit -a "LLL@2474605919@qq.com" -m "打包已经部署好的django项目,之后直接使用就行了。" aab53c10b632 mydjango:1.0

使用nginx+docker实现一个简单的负载均衡

 2.开启多台服务

docker run -it -p 8082:8000 --name server02 mydjango:1.0 /bin/bash
docker run -it -p 8083:8000 --name server03 mydjango:1.0 /bin/bash
docker run -it -p 8084:8000 --name server04 mydjango:1.0 /bin/bash
docker run -it -p 8085:8000 --name server05 mydjango:1.0 /bin/bash
docker run -it -p 8086:8000 --name server06 mydjango:1.0 /bin/bash

3.在各个容器中启动django项目

cd /usr/src/sayhello
python manage.py runserver 0.0.0.0:8000

nginx和6台django服务都启动成功!

使用nginx+docker实现一个简单的负载均衡

 配置nginx文件实现反向代理和负载均衡

在/etc/nginx目录下配置nginx.conf文件,添加如下内容:

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream myserver {

       server 172.18.0.2:8000 weight=1;
       server 172.18.0.7:8000 weight=1;
       server 172.18.0.6:8000 weight=1;
       server 172.18.0.5:8000 weight=1;
       server 172.18.0.4:8000 weight=1;
       server 172.18.0.3:8000 weight=1;
      
   }

  upstream myserver2 {
    server 172.17.28.61:8081 weight=1;
    server 172.17.28.61:8082 weight=1;
    server 172.17.28.61:8083 weight=1;
    server 172.17.28.61:8084 weight=1;
    server 172.17.28.61:8085 weight=1;
    server 172.17.28.61:8086 weight=1;

}

  server {
    
    listen 80;
    server_name localhost;

    location /sayhello {
      proxy_pass http://myserver2;        
      
   }
   
}  
    include /etc/nginx/conf.d/*.conf;
}

使用nginx+docker实现一个简单的负载均衡

 负载均衡的核心配置就是upstream和proxy_pass这两项,在upstream中可以配置我们用来做负载均衡的服务器(也就是请求最后打到的真实服务器!,同时,如果当前nginx和不在这些服务器中,也就相当于同时做了反向代理!),当然,这里也可以指定做这个负载均衡的具体方法,我这里就是为每个服务器赋一个权重,权重越高的,命中的概率就越高。之后就是配置proxy_pass,只要保证代理的名称和刚刚配置的upstream名称一直就行。

检验

将上面的配置文件修改完成后,使用命令重新加载配置文件:

nginx -s reload #对配置文件进行重新加载

在没有配置出错的前提下应该就可以访问成功了!在此之前,我们还是先理一下逻辑,我们绑定了那么多ip和端口,如果不理清楚,都不知道该访问哪个了!使用nginx+docker实现一个简单的负载均衡使用nginx+docker实现一个简单的负载均衡使用nginx+docker实现一个简单的负载均衡

首先,我们为每一个django服务都分配了一个容器,在各自的容器中,它们都使用的是8000端口,然后我们又为每一个容器映射了一个本地端口,因此,不管是通过本地ip+映射的端口还是容器ip+8000 ,是都能访问得到的!然后我们又开启了一个容器来做nginx服务,我们使用本地端口7777(已添加到安全组)映射了nginx容器的80端口,然后在nginx中做了负载均衡,所以我们只需要访问7777端口,就会把请求打到nginx容器的80端口,然后再通过负载均衡,打到对应的django服务中!

因此,我们只需要访问通过公网ip+7777端口应该就能访问到啦!

访问地址:

http://www.lll.plus:7777/sayhello/ 

使用nginx+docker实现一个简单的负载均衡

可以看到,基本上前六次,每次的访问结果都不一样,第七次访问了第一次访问的服务,因为我为每一个服务配置的权重都是一样的,所以这和预期的结果也基本上是一直的!也算是大功告成啦!

配置负载均衡的其他方法

除了我上面使用的赋权重方法以外,还有其他的方法。

1.轮询(默认)

  • 请求被平均调度给多个服务器处理
http {
  ...
  upstream myserver {
   server 192.168.1.2:8080;
   server 192.168.1.3:8080;
   ...
  }
  server {
  	  ...
	  location / {
	  	proxy_pass http://myserver;
	  }
  }
}

2.加权轮询算法

  • 给服务器列表的每个服务器都增加一个权重,权重高者,命中率越高。
http {
	...
	upstream myserver {
	  server 192.168.1.2:8080 weight=10;
	  server 192.168.1.3:8080 weight=90;
	  ...
	}
	...
	server {
		...
		localtion / {
		  proxy_pass http:myserver;
		}
	}
}

3.ip_hash算法

  • 将客户端的ip进行hash运算,再根据运算结果打到某一台服务器,之后也会一直打到同一台服务器,可以解决session问题
http {
	...
	upstream myserver {
		ip_hash;
		server 192.168.1.2:8080;
		server 192.168.1.3:8080;
		...
	}
	...
	server {
	    ...
		location / {
		  proxy_pass http://myserver;
		}
	}
}

4.最少连接数算法

  • 此种方式nginx会将请求转发到当前连接数较少的服务器
http {
	...
	upstream myserver {
	  least_conn;
	  server 192.168.1.2:8080;
	  server 192.168.1.3:8080;
	  ...
	}
	...
	server {
	  ...
	  location / {
	    proxy_pass http://myserver;
	  }
	}
}

5.url_hash算法

  • 对客户端请求的url进行hash运算,将相同的url打到同一个服务器
  • 需要安装url_hash补丁
http {
  ...
  upstream myserver {
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
    ...
    hash $request_uri;
    hash_method crc32;
  }
  ...
  server {
    ...
    location / {
      proxy_pass http://myserver;
    }
  }
}

6.fair算法

  • 优先选择响应时间最短的服务器
  • 需要安装模块:nginx-upstream-fair-master
http {
  ...
  upstream myserver {
    fair;
    server 192.168.1.2:8080;
    server 192.168.1.3:8080;
    ...
  }
  ...
  server {
    ...
    location / {
      proxy_pass http://myserver;
    }
  }
}

参考链接:nginx配置负载均衡

同步更新于个人博客系统:使用nginx+docker实现一个简单的负载均衡​​​​​​​文章来源地址https://www.toymoban.com/news/detail-412977.html

到了这里,关于使用nginx+docker实现一个简单的负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Nginx实现负载均衡

    本文将详细介绍使用Nginx实现负载均衡的方法。 负载均衡(Load Balancing)是将传入的请求流量分发到多个后端服务器的技术,以达到消除单点故障、提高可用性、增加扩展性等目的。 负载均衡需要根据算法来决定如何将请求分发到后端服务器。常见的负载均衡算法包括: 2.2.1 轮询

    2024年02月12日
    浏览(38)
  • 编译安装Nginx和使用五种算法实现Nginx反向代理负载均衡

    目录 Ubuntu中安装Nginx 概念介绍 负载均衡 几种负载均衡算法 反向代理 环境规划 配置反向代理 加权负载均衡(Weighted Load Balancing) 轮询(Round Robin) IP 哈希(IP Hash) 最少连接(Least Connections) URL 哈希(URL Hash) 想要安装nginx,首先我们需要有一台Ubuntu的虚拟机,然后最好在

    2024年01月25日
    浏览(51)
  • nginx两台负载均衡服务器之间使用keepalived实现高可用

    单点故障:某个重要的功能只有一份,如果他出现问题,会导致全局不能使用 “高可用性”(High Availability,缩写为HA)用于描述系统或服务在面临故障、硬件或软件问题时能够继续正常运行的能力。高可用性的目标是最大程度地减少系统中断或停机时间,确保用户可以随时

    2024年02月09日
    浏览(45)
  • 虚拟机中使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记

    物理操作系统:Windows10 虚拟机软件:VMWare Workstation 16 Pro 虚拟操作系统统:CentOS7 Nginx:1.24.0 Keepalived:2.2.8 在VMWare Worksattion中安装了2台CentOS7的虚拟机,桥接方式下IP地址分别为:192.168.0.35、192.168.0.36 VIP IP 主机名 Nginx端口 默认主从 192.168.0.100 192.168.0.35 wongoing01 88 MASTER 192.168

    2024年02月11日
    浏览(59)
  • Docker搭建Nginx+keepalived高可用负载均衡服务器

    一、背景 1.nginx高可用 在生产环境下,Nginx作为流量的入口,如果Nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。所以负责负载均衡、反向代理的服务(Nginx)为了提高处理性能,高可用,也需要集群部署。本期咋们采用 keepalived 和 Nginx实现高可用。 2.Kee

    2024年04月22日
    浏览(47)
  • 使用Nginx的upstream实现负载均衡,并配置https,避免Post请求类型转发后变为Get

    Nginx支持负载均衡,可以很方便的帮助我们进行水平扩容,upstream就是nginx中的负载均衡模块 当客户端发送请求时,会先到Nginx,然后Nginx会将请求分发到后台不同的服务器上。 如果后台的服务器群中有一个宕机了,那么Nginx会自动忽略这台服务器,不会将请求再次分发到这台

    2024年02月01日
    浏览(49)
  • nginx负载均衡的实现

    1、 安装nginx https://blog.csdn.net/qq_50247813/article/details/126550316 2、 修改配置文件,配置后端服务器 2.1、有3台后端服务需要实现负载均衡 172.17.0.2:80 172.17.0.3:80 172.17.0.4:80 2.2、修改配置文件,使用代理的方式实现负载均衡(默认轮询) 设置代理名字为myweb,代理到myweb实现负载 3、

    2023年04月16日
    浏览(36)
  • 配置Nginx实现负载均衡

    简介 在本教学文章中,我们将学习如何使用Nginx配置负载均衡,将流量均匀分配到多个后端服务器,从而提高应用程序的可靠性和性能。负载均衡是一种常见的应用场景,通过分配请求到多个服务器上,可以实现负载的均衡分配,增加系统的可扩展性和容错能力。本教程将介

    2024年02月13日
    浏览(61)
  • Nginx 如何实现负载均衡?

    Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。由于其具有丰富的功能和出色的性能,Nginx 广泛应用于 Web 开发、负载均衡、反向代理等场景。在负载均衡方面,Nginx 可以实现基于轮询、IP_HASH、URL_HASH 和其他算法的负载均衡。本文将详细介绍

    2024年01月18日
    浏览(37)
  • Nginx反向代理实现负载均衡webshell

    目录 本实验所用的环境: 问题一:由于nginx采用的反向代理是轮询的方式,所以上传文件必须在两台后端服务器的相同位置上传相同的文件 问题二:我们在执行命令时,无法知道下次的请求交给哪台机器去执行我们在执行hostname -i查看当前执行机器的IP时,可以看到IP地址一

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包