nginx跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。

环境介绍

配置nginx负载均衡器因会用到多台服务器来进行,所以下面我会用到docker,具体docker的使用请移步docker实战

  • 系统环境:

     root@ubuntu:~# lsb_release  -a			#查看系统版本
     No LSB modules are available.
     Distributor ID:	Ubuntu
     Description:	Ubuntu 19.10
     Release:	19.10
     Codename:	eoan
     root@ubuntu:~# uname -a			#查看系统是多少位
     Linux ubuntu 5.3.0-18-generic #19-Ubuntu SMP Tue Oct 8 20:14:06 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    
  • docker版本和相关操作系统版本

     docker版本:
     root@ubuntu:~# docker --version			#查看docker版本
     Docker version 19.03.3, build a872fc2f86
    
     操作系统版本:
     [root@57b669db1de1 /]# cat /etc/redhat-release 		#查看系统版本
     CentOS Linux release 8.0.1905 (Core)
     [root@57b669db1de1 /]# uname -a
     Linux 57b669db1de1 5.3.0-18-generic #19-Ubuntu SMP Tue Oct 8 20:14:06 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    
  • 软件版本:

     nginx版本:
     root@ubuntu:~# nginx  -v		查看nginx版本
     nginx version: nginx/1.16.1 (Ubuntu)
    
     docker中nginx版本:
     [root@57b669db1de1 /]# nginx -v		#查看nginx版本
     nginx version: nginx/1.14.1
    

安装nginx

具体nginx的安装请参考nginx安装部署

  • 安装依赖软件

     更新软件包:
     root@ubuntu:~# apt-get update
    
     安装依赖软件:
     root@ubuntu:~# apt -y install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev make gcc
    
  • 编译安装nginx

     下载nginx:
     root@ubuntu:~# wget http:#nginx.org/download/nginx-1.17.6.tar.gz
    
     解压:
     root@ubuntu:/opt# tar zxf nginx-1.17.6.tar.gz
     root@ubuntu:/opt# cd nginx-1.17.6/
     root@ubuntu:/opt/nginx-1.17.6# ls		#列出目录
     auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
     root@ubuntu:/opt/nginx-1.17.6# 
    
     配置:
     root@ubuntu:/opt/nginx-1.17.6# ./configure --prefix=/usr/local/nginx
     编译以及部署:
     root@ubuntu:/opt/nginx-1.17.6# make && make install
     root@ubuntu:/opt/nginx-1.17.6# cd /usr/local/nginx/
     root@ubuntu:/usr/local/nginx# ls
     conf  html  logs  sbin
    
     启动:
     root@ubuntu:/usr/local/nginx# ln sbin/nginx /usr/local/sbin/		#创建nginx软连接,设置为命令
     root@ubuntu:/usr/local/nginx# nginx		#启动nginx
     root@ubuntu:/usr/local/nginx# netstat -anpl | grep nginx		#查看nginx端口是否开启
     root@ubuntu:/usr/local/nginx# lsof -i:80			#查看80端口是否开启
    

docker安装nginx

  • 创建容器

     下载镜像:
     root@ubuntu:~# docker pull registry.cn-beijing.aliyuncs.com/blxt/centos
    
     创建容器并启动:
     root@ubuntu:~#
     root@ubuntu:~# docker run -itd --name nginx1 --privileged  registry.cn-beijing.aliyuncs.com/blxt/centos /sbin/init
     root@ubuntu:~# docker ps -a		#查看容器是否创建并启动
     CONTAINER ID        IMAGE                                          COMMAND             CREATED             STATUS              			PORTS               NAME
     6801d55682a3        registry.cn-beijing.aliyuncs.com/blxt/centos   "/sbin/init"        5 minutes ago       Up 5 	minutes                            nginx1
    
     相同方法创建第二个容器:
     root@ubuntu:~# docker run -itd --name nginx2 --privileged  registry.cn-beijing.aliyuncs.com/blxt/centos /sbin/init
     root@ubuntu:~# docker ps -a
     root@ubuntu:~#
     root@ubuntu:~# docker ps -a
     CONTAINER ID        IMAGE                                          COMMAND             CREATED             STATUS              			PORTS               NAMES
     1d31d3fc0ec1        registry.cn-beijing.aliyuncs.com/blxt/centos   "/sbin/init"        4 minutes ago       Up 4 	minutes                            nginx2
     6801d55682a3        registry.cn-beijing.aliyuncs.com/blxt/centos   "/sbin/init"        5 minutes ago       Up 5 	minutes                            nginx1
    
     连接到容器:
     root@ubuntu:~# docker exec -it nginx1 /bin/bash
     root@ubuntu:~# docker exec -it nginx2 /bin/bash
     [root@6801d55682a3 /]# hostname nginx1			#更改主机名称
     [root@6801d55682a3 /]# bash			#使更改的名称生效
     [root@1d31d3fc0ec1 /]# hostname nginx2
     [root@1d31d3fc0ec1 /]# bash
    
  • 安装nginx

     更新软件包:
     [root@nginx1 /]# yum clean all		#清空缓存
     [root@nginx1 /]# yum makecache		#更新软件包
    
     安装nginx:
     [root@nginx1 /]# yum -y install nginx
     [root@nginx1 /]# rpm -qa | grep nginx		#查看是否已经安装
    
     启动nginx:
     [root@nginx1 /]# systemctl start nginx
     [root@nginx1 /]# netstat -anpl | grep nginx		#查看nginxnn端口是否开启
     [root@nginx1 /]# lsof -i:80		#查看80端口是否开启
     安装第二个nginx使用相同方法即可!此处省略!!!
    
     访问nginx:
     [root@nginx1 /]# curl 127.0.0.1
    
  • 修改网页内容

     查看网页存在目录:
     [root@nginx1 nginx]# more nginx.conf		#查看配置文件
     在配置文件中找到下面root行,后面目录即网页文件存放目录
     root         /usr/share/nginx/html;
     [root@nginx1 html]# cd /usr/share/nginx/html/
     [root@nginx1 html]# ls		#列出目录内容
     404.html  50x.html  index.html	nginx-logo.png	poweredby.png
     [root@nginx1 html]# echo nginx1 > index.html		#清空nginx主页文件内容,并重新写入内容为nginx1
     nginx2如同,注意不要设置一样的主页内容
    
     访问nginx:
     [root@nginx1 html]# curl  127.0.0.1
     nginx1
     [root@nginx2 ~]# curl 127.0.0.1
     nginx2
    
  • 修改配置文件

     nginx1修改内容如下:
      server {
     listen       80;
     server_name  www.nginx1.com;			//设置域名
    
     #charset koi8-r;
    
     #access_log  logs/host.access.log  main;
    
     location / {
         root   html;
         index  index.html index.htm;
     	}
     }
    
     nginx2修改内容如下:
      server {
     listen       80;
     server_name  www.nginx2.com;			//设置域名
    
     #charset koi8-r;
    
     #access_log  logs/host.access.log  main;
    
     location / {
         root   html;
         index  index.html index.htm;
     	}
     }
    

配置http负载均衡器

要开始使用NGINX Plus或NGINX开源对一组服务器的HTTP流量进行负载均衡,使用upstream指令定义该组,该指令放置在http上下文中,proxy_pass指令用来转发请求到后端一般指定在loction上下文中
基本配置方法:

http {
    upstream nginx {			#test为组名
        server www.nginx1.com ;		#server用来指定后端服务器的访问地址,一般指定域名、ip、端口,域名和ip二选一,端口可忽略
        server www.nginx2.com weight=5;		#weight指定权重值
        server www.nginx3.com down;			#down用来停止对此服务器的转发
        ......省略其他配置
    }
    server{
		location / {
			proxy_pass http://nginx;		#http://nginx为转发那个组的后端服务器
			......省略其他配置
		}
		......省略其他配置
	}
}

nginx做负载均衡官方提供了4种方法,下面逐一介绍这四种方法:

  • Round Robin

请求在服务器之间平均分配,同时考虑了服务器权重。默认情况下使用此方法(没有启用它的指令)
默认配置就是Round Robin,配置方法:

http {
   upstream nginx {			#test为组名
       server www.nginx1.com ;		#server用来指定后端服务器的访问地址
       server www.nginx2.com ;		#weight指定权重值
       ......省略其他配置
   }
   server{
   	location / {
   		proxy_pass http://nginx;		#http://nginx为转发那个组的后端服务器
   		......省略其他配置
   	}
   	......省略其他配置
   }
}
  • 最少连接

将活动连接最少的请求发送到服务器,也是在考虑到服务器的权重问题才设置的这种方法
配置方法:

http {
   upstream nginx {			#test为组名
   	   less_conn ;
       server www.nginx1.com ;		#server用来指定后端服务器的访问地址
       server www.nginx2.com ;		#weight指定权重值
       ......省略其他配置
   }
   server{
   	location / {
   		proxy_pass http://nginx;		#http:#nginx为转发那个组的后端服务器
   		......省略其他配置
   	}
   	......省略其他配置
   }
}
  • ip_hash

从客户端IP地址确定向其发送请求的服务器。在这种情况下,可以使用IPv4地址的前三个八位位组或整个IPv6地址来计算哈希值。该方法保证了来自同一地址的请求将到达同一服务器,除非它不可用。
配置方法:

http {
   upstream nginx {			#test为组名
   	   ip_hash ;
       server www.nginx1.com ;		#server用来指定后端服务器的访问地址
       server www.nginx2.com ;		#weight指定权重值
       ......省略其他配置
   }
   server{
   	location / {
   		proxy_pass http://nginx;		#http:#nginx为转发那个组的后端服务器
   		......省略其他配置
   	}
   	......省略其他配置
   }
}
  • hash

向其发送请求的服务器是根据用户定义的键确定的,该键可以是文本字符串,变量或组合。
配置方法:

http {
  upstream nginx {			#test为组名
  	  hash $request_uri consistent;
      server www.nginx1.com ;		#server用来指定后端服务器的访问地址
      server www.nginx2.com ;		#weight指定权重值
      ......省略其他配置
  }
  server{
  	location / {
  		proxy_pass http://nginx;		#http://nginx为转发那个组的后端服务器
  		......省略其他配置
  	}
  	......省略其他配置
  }
}

nginx部署基于http负载均衡器的更多相关文章

  1. Centos6.5中Nginx部署基于IP的虚拟…

    Centos6.5 中Nginx 部署基于IP 的虚拟主机 王尚2014.11.18 一.介绍虚拟主机 虚拟主机是使用特殊的软硬件技术,把一台真实的物理电脑主机 分割成多个逻辑存储单元,每个单元都没有 ...

  2. 在云主机上基于nginx部署基于Flask的网站服务器 (自己部署 )

    1.申请云主机 a.阿里云 (注意:阿里云的服务器需要手动添加安全规则使能80端口) b.腾讯云 2.把网站服务器程序拷贝到云主机 3.远程登录云主机 4.解压网站服务器程序 yum install ...

  3. 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

    前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...

  4. Ubuntu 14.04 上使用 Nginx 部署 Laravel

    本教程将会涉及以下工具: Ubuntu 14.04 LTS PHP 5.5 MySQL Laravel 5.0 Nginx 参考文章:Ubuntu 14.04 上使用 Nginx 部署 Laravel ...

  5. 使用uWSGI+nginx部署Django项目

    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...

  6. linux vue uwsgi nginx 部署路飞学城 安装 vue

    vue+uwsgi+nginx部署路飞学城 有一天,老男孩的苑日天给我发来了两个神秘代码,听说是和mjj的结晶 超哥将这两个代码,放到了一个网站上,大家可以自行下载 路飞学城django代码#这个代码 ...

  7. SpringBoot集成FastDFS+Nginx整合基于Token的防盗链

    为什么要用SpringBoot? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...

  8. 【Nginx】基于Consul+Upsync+Nginx实现动态负载均衡

    一.Http动态负载均衡 什么是动态负载均衡 动态负载均衡实现方案 常用服务器注册与发现框架 二.Consul快速入门 Consul环境搭建 三.nginx-upsync-module nginx-u ...

  9. Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)

    Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...

随机推荐

  1. Java多态——代码示例

    刚开始看多态的文字定义时,总是不明白说的啥意思,看了一些示例代码后,总算知道了,其实也就是“多态”的字面意思. 如下: class A{ public void Out() { System.out. ...

  2. nyoj 36-最长公共子序列 (动态规划,DP, LCS)

    36-最长公共子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:18 submit:38 题目描述: 咱们就不拐弯抹角了,如题,需要你做的就是写 ...

  3. Windows平台LoadLibrary加载动态库搜索路径的问题

    一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...

  4. Bootstrap——导航条(navbar)

    导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多. 导航条(navbar)中有一个背景色.而且导航条可以是纯链接(类似导航).表单以及表单和导航一起结合等多种形式. 在制作一个基 ...

  5. 力扣(LeetCode)环形链表 个人题解

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...

  6. web前端面试经常遇得到的题型

    1.position的值, relative和absolute分别是相对于谁进行定位的? § absolute :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位. ...

  7. .NET资源泄露与处理方案

    .NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重. 一.知识点 ...

  8. 2019-9-24:渗透测试,css样式,js基础学习笔记

    css分组和嵌套:分组:比如有<h1><h4><p>,3个标签,设置css时候可以 h1,h4,p{样式:属性} 这样的语法嵌套:比如.lei{样式:属性},.le ...

  9. Python和BeautifulSoup进行网页爬取

    在大数据.人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一.而Python则是目前数据科学项目中最常用的编程语言之一.使用Python与Beaut ...

  10. 甲小蛙战记:PHP2Java 排雷指南

    (马蜂窝技术原创内容,申请转载请在公众后后台留言,ID:mfwtech ) 大家好,我是来自马蜂窝电商旅游平台的甲小蛙,从前是一名 PHP 工程师,现在可能是一名 PHJ 工程师,以后...... 前 ...