当前位置: 首页 > 编程日记 > 正文

Nginx负载均衡配置实例详解

负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦。
负载均衡
先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。
测试环境
由于没有服务器,所以本次测试直接host指定域名,然后在VMware里安装了三台CentOS。
测试域名  :a.com
A服务器IP :192.168.5.149 (主)
B服务器IP :192.168.5.27
C服务器IP :192.168.5.126
部署思路
A服务器做为主服务器,域名直接解析到A服务器(192.168.5.149)上,由A服务器负载均衡到B服务器(192.168.5.27)与C服务器(192.168.5.126)上。

域名解析
由于不是真实环境,域名就随便使用一个a.com用作测试,所以a.com的解析只能在hosts文件设置。
打开:C:WindowsSystem32driversetchosts
在末尾添加
192.168.5.149    a.com
保存退出,然后启动命令模式ping下看看是否已设置成功

从截图上看已成功将a.com解析到192.168.5.149IP
A服务器nginx.conf设置
打开nginx.conf,文件位置在nginx安装目录的conf目录下。
在http段加入以下代码
upstream a.com { 
      server  192.168.5.126:80; 
      server  192.168.5.27:80; 
} 
  
server{ 
    listen 80; 
    server_name a.com; 
    location / { 
        proxy_pass         http://a.com; 
        proxy_set_header   Host             $host; 
        proxy_set_header   X-Real-IP        $remote_addr; 
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}
保存重启nginx
B、C服务器nginx.conf设置
打开nginx.confi,在http段加入以下代码
server{ 
    listen 80; 
    server_name a.com; 
    index index.html; 
    root /data0/htdocs/www; 
}
保存重启nginx
测试
当访问a.com的时候,为了区分是转向哪台服务器处理我分别在B、C服务器下写一个不同内容的index.html文件,以作区分。
打开浏览器访问a.com结果,刷新会发现所有的请求均分别被主服务器(192.168.5.149)分配到B服务器(192.168.5.27)与C服务器(192.168.5.126)上,实现了负载均衡效果。
B服务器处理页面

C服务器处理页面

假如其中一台服务器宕机会怎样?
当某台服务器宕机了,是否会影响访问呢?
我们先来看看实例,根据以上例子,假设C服务器192.168.5.126这台机子宕机了(由于无法模拟宕机,所以我就把C服务器关机)然后再来访问看看。
访问结果:

我们发现,虽然C服务器(192.168.5.126)宕机了,但不影响网站访问。这样,就不会担心在负载均衡模式下因为某台机子宕机而拖累整个站点了。
如果b.com也要设置负载均衡怎么办?
很简单,跟a.com设置一样。如下:
假设b.com的主服务器IP是192.168.5.149,负载均衡到192.168.5.150和192.168.5.151机器上
现将域名b.com解析到192.168.5.149IP上。
在主服务器(192.168.5.149)的nginx.conf加入以下代码:
upstream b.com { 
      server  192.168.5.150:80; 
      server  192.168.5.151:80; 
} 
  
server{ 
    listen 80; 
    server_name b.com; 
    location / { 
        proxy_pass         http://b.com; 
        proxy_set_header   Host             $host; 
        proxy_set_header   X-Real-IP        $remote_addr; 
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}
保存重启nginx
在192.168.5.150与192.168.5.151机器上设置nginx,打开nginx.conf在末尾添加以下代码:
server{ 
    listen 80; 
    server_name b.com; 
    index index.html; 
    root /data0/htdocs/www; 
}
保存重启nginx
完成以后步骤后即可实现b.com的负载均衡配置。
主服务器不能提供服务吗?
以上例子中,我们都是应用到了主服务器负载均衡到其它服务器上,那么主服务器本身能不能也加在服务器列表中,这样就不会白白浪费拿一台服务器纯当做转发功能,而是也参与到提供服务中来。
如以上案例三台服务器:
A服务器IP :192.168.5.149 (主)
B服务器IP :192.168.5.27
C服务器IP :192.168.5.126
我们把域名解析到A服务器,然后由A服务器转发到B服务器与C服务器,那么A服务器只做一个转发功能,现在我们让A服务器也提供站点服务。
我们先来分析一下,如果添加主服务器到upstream中,那么可能会有以下两种情况发生:
1、主服务器转发到了其它IP上,其它IP服务器正常处理;
2、主服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环。
怎么解决这个问题呢?因为80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理a.com的访问请求,得用一个新的。于是我们把主服务器的nginx.conf加入以下一段代码:
server{ 
    listen 8080; 
    server_name a.com; 
    index index.html; 
    root /data0/htdocs/www; 
}

重启nginx,在浏览器输入a.com:8080试试看能不能访问。结果可以正常访问

既然能正常访问,那么我们就可以把主服务器添加到upstream中,但是端口要改一下,如下代码:
upstream a.com { 
      server  192.168.5.126:80; 
      server  192.168.5.27:80; 
      server  127.0.0.1:8080; 
}
由于这里可以添加主服务器IP192.168.5.149或者127.0.0.1均可以,都表示访问自己。
重启Nginx,然后再来访问a.com看看会不会分配到主服务器上。


主服务器也能正常加入服务了。
最后
一、负载均衡不是nginx独有,著名鼎鼎的apache也有,但性能可能不如nginx。
二、多台服务器提供服务,但域名只解析到主服务器,而真正的服务器IP不会被ping下即可获得,增加一定安全性。

三、upstream里的IP不一定是内网,外网IP也可以。不过经典的案例是,局域网中某台IP暴露在外网下,域名直接解析到此IP。然后又这台主服务器转发到内网服务器IP中。
四、某台服务器宕机、不会影响网站正常运行,Nginx不会把请求转发到已宕机的IP上

转载于:https://www.cnblogs.com/mayi168/p/3445324.html

相关文章:

iOS 设置View阴影

iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView [[UIView alloc] init];shadowView.frame CGRectMake(100, 100, 100, 100);shadowView.center self.view.center;shadowView.backgroundColor [UIColor whiteColor];//设置阴影颜色shadowView.layer.sh…

ZJU-java进阶笔记 第四周(继承与多态)

继承是面向对象语言的重要特征之一,没有继承的语言只能被称作“使用对象的语言”。 子类从父类那里继承来了所有的成员 ① 除了构造函数,毕竟构造函数和父类同名 ② 得到不等于可以随便使用 如果我们试图重新定义一个在父类中已经存在的成员变量&…

浅谈《think in java》:一 对象导论总结

清单1. 抽象机制,面向对象程序设计方式 java所基于Smalltalk的特性表现一种纯粹的面向对象设计方式: 万物都是对象 程序是对象的集合(容器),他们通过发送消息(发送请求)来告知彼此所要做的。 每…

CSP 201812-2 小明放学 Python实现+详解

试题 代码 # 红灯 r 秒,黄灯 y 秒,绿灯 g 秒 r, y, g [int(i) for i in input().split()]# n表示小明总共经过的道路段数和看到的红绿灯数目 n int(input())# 定义getTime(k,t,time)函数计算时间开销 # k为0,1,2,3时…

《学习OpenCV》第三章习题 第3题

这是一个很有意思的题目,通过这个题我们可以理解图形的内部存储和cvPtr*D函数族的使用方法。 简单来说,图像就是矩阵,在一般的图像中,每个像素中存储了3个变量,分别代表BGR三通道的值,cvPtr*D函数族就是帮助…

给input type=color设置默认值

参考&#xff1a;https://stackoverflow.com/questions/14943074/html5-input-colors-default-color?utm_mediumorganic&utm_sourcegoogle_rich_qa&utm_campaigngoogle_rich_qa <input type"color"> 默认值为“#000000”&#xff0c; 想要更改默认值…

ZJU-java进阶笔记 第六周(抽象与接口)

abstract &#xff08;1&#xff09; 抽象类不可以用来制造对象&#xff0c;但可以用来定义变量&#xff0c;当然将来付给这个变量的一定是这个抽象类的非抽象子类的对象 &#xff08;2&#xff09; 抽象类的非抽象子类必须覆盖父类中的抽象函数&#xff0c;这种覆盖叫做实现两…

库存事务处理现有量检查

--检查现有量CURSOR c_lot_number(l_organization_id NUMBER,p_inventory_item_id IN NUMBER) ISSELECT mln.lot_number, mln.expiration_dateFROM mtl_lot_numbers mlnWHERE mln.inventory_item_id p_inventory_item_id-- AND mln.status_id 1 --有效合格批次AND mln.orga…

数据变金矿:一文读懂序列模型(附用例)

简介 众所周知&#xff0c;人工神经网络(ANN)的设计思路是模仿人脑结构。但是直到10年前&#xff0c;ANN和人类大脑之间唯一的共同点是对实体的命名方式&#xff08;例如神经元&#xff09;。由于预测能力较弱并且实际应用的领域较少&#xff0c;这样的神经网络几乎毫无用处。 …

ZJU-java进阶笔记 第七周(异常处理)

异常的定义 捕捉异常范例 try{//可能产生异常的代码 }catch(Type1 id1){//处理Type1异常的代码 }catch(Type2 id2){//处理Type2异常的代码 }catch(Type3 id3){//处理Type3异常的代码}异常捕捉的意义&#xff1a;异常发生&#xff0c;程序也不需要终止 3. 捕捉到异常对象后…

【组队学习】【35期】吃瓜教程——西瓜书+南瓜书

吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;凌亮航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU内容…

SmartDispatcher 类

UI线程中使用 public class SmartDispatcher { public static void BeginInvoke(Action action) { if (Deployment.Current.Dispatcher.CheckAccess() || DesignerProperties.IsInDesignTool) { action(); } else { Deployment.Current.Dispatcher.BeginInvoke(action); } } }…

三、临时弹出一个QQ对话窗口

第一种&#xff1a;需要添加好友才可以访问 <a href"http://wpa.qq.com/msgrd?v3&uin317985559&siteqq&menuyes" target"_blank">123 </a> 第二种&#xff1a;不需要添加好友即可访问 上网去搜吧&#xff0c;小臂崽子转载于:http…

ZJU-java进阶笔记 第七周(输入输出)

流是Java处理输入输出的方式流的基础类——以字节(byte)形式 InputStream OutputStream 例 public class Main {public static void main(String[] args){System.out.println("请输入&#xff1a;");//定义一个字节数组byte[] buffer new byte[1024];try {int len …

Jquery实现的Tabs页签

管理导航系统设置用户管理内容管理其他管理1111111222222222333333333334444444444555555555555555<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns&qu…

【组队学习】【35期】动手学数据分析

动手学数据分析 航路开辟者&#xff1a;陈安东、金娟娟、杨佳达、老表、李玲、张文涛、高立业领航员&#xff1a;六一航海士&#xff1a;郑园园、李牧轩、高岩 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/hands-on-data-analysis开源内容&#xff1a;…

postfix邮箱服务

1、使用postfix服务之前&#xff0c;需要先安装DNS服务&#xff0c;指定邮件交换记录&#xff1b;2、编辑postfix服务配置文件&#xff1b;3、安装dovecot服务、用于本地进行邮件发接测试&#xff1b;4、创建两个用户&#xff0c;并添加到mailusers组中&#xff1b;5、在Linux虚…

mysql数据库基本介绍及常见使用

关系型数据库 ● 二维表 ● 表中的一行&#xff0c;称为记录&#xff0c;表中的列&#xff0c; 称为字段&#xff08;属性&#xff09; ● 行列交叉的单元格的值&#xff0c;叫属性值或字段值。 ● ORACLE DB2 Mysql SQL SERVER 关系型数据库 常用的指令(可以在命令行执行&…

FilenameFilter的使用

使用FilenameFilter过滤掉chapter开头的文件。 1 public class contentFilter implements FilenameFilter {2 public boolean isContent(String file) {3 if (file.startsWith("chapter")){4 return false;5 }else{6 return true;7 }8 …

Qt 串口连接

Qt 串口连接 使用 Qt 开发上位机程序时&#xff0c;经常需要用到串口&#xff0c;在 Qt 中访问串口比较简单&#xff0c;因为 Qt 已经提供了 QSerialPort 和 QSerialPortInfo 这两个类用于访问串口。 使用 QSerialPort Qt 提供的 QSerialPort 类继承于 QIODevice&#xff0c;也…

navicat for mysql如何在更新记录时自动记录更新时间

如图所示 步骤 添加属性recordTime(任意)设置属性类型为timestamps勾选 根据当前时间戳更新默认栏填 CURRENT_TIMESTAMP 效果

ASP.NET Web API自身对CORS的支持:从实例开始

在《通过扩展让ASP.NET Web API支持W3C的CORS规范》中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力&#xff0c;具体来讲&#xff0c;这个自定义的CorsMessageHandler的自由主要体现在如下两个方面&#xff1a;其一&#xff0c;为简单跨域请求…

2021第12届蓝桥杯省赛 -- 填空题:试题B:直线

试题B&#xff1a;直线 问题描述 在平面直角坐标系中&#xff0c;两点可以确定一条直线。如果有多点在一条直线上&#xff0c; 那么这些点中任意两点确定的直线是同一条。 给定平面上 2 3 个整点(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z{(x, y)|0 \leq x < 2, 0 \leq y &l…

Markdown快速上手

基本语法 标题 #标题名共六级&#xff0c;依次“#”数量增加&#xff0c;字体减小 加粗文字 哈喽 两个“* ”文字内容 再两个 斜体文字 哈喽 一个“*” 文字内容 再一个 无序列表 -列表内容回车两次退出此编辑模式 有序列表 1.列表内容回车两次退出此编辑模式 插入链接 百度链接…

复杂SELECT语句执行过程

通过FROM子句中找到需要查询的表通过WHERE子句进行分组函数筛选判断通过GROUP BY子句完成分组操作通过HAVING子句完成组函数筛选判断通过SELECT子句选择显示的列或表达式及组函数通过ORDER BY子句进行排序操作 书写时按照这个顺序:5 1 2 3 4 6 出处&#xff1a;东软Java实训