10.1 负载均衡的概念

  • 对用户请求的数据进行调度的作用
  • 对用户访问的请求网站可以进行压力的分担

10.2 常见的代理方式

10.2.1 正向代理

10.2.2 反向代理

10.3 负载均衡的部署环节

10.3.1 服务器的准备

lb01服务器:172.16.1.5

web01服务器:172.16.1.7

web02服务器:172.16.1.8

10.3.2 服务器环境的准备

10.3.2.1 web服务器的配置(172.16.1.7,172.16.1.8)

[root@web02 ~] # cd /etc/nginx/conf.d/

[root@web02 conf.d] # vim www.conf

server {

listen 80;

server_name www.oldboy.com;

location / {

root /html/www;

index index.html index.htm;

}

}

 

[root@web01 conf.d] # cd /html/                    创建站点目录

[root@web01 html] # mkdir -p www

[root@web01 html] # cd www

[root@web01 www] # echo "$(hostname -i) www.oldboy.com" > index.html

 

[root@web01 www] # systemctl restart nginx

10.3.2.1.2 出现启动失败
  • 查看nginx -t查看语法是否出错
  • 查看/etc/nginx/nginx.conf看下是不是include没有加载www.conf导致的
10.3.2.3 web服务器测试是否成功

[root@web01 www] # curl 10.0.0.7

172.16.1.7 www.oldboy.com                        已经成功

 

[root@web02 www] # curl 10.0.0.8

172.16.1.8 www.oldboy.com

10.3.2.2 lb01服务器的配置

10.3.2.2.1 安装nginx,并且查看版本是不是最新版本

[root@lb01 ~] # yum -y install nginx        安装nginx

 

[root@lb01 ~] # nginx -V

nginx version: nginx/1.16.1                版本信息

10.3.2.2.2 编辑负载均衡配置文件

[root@lb01 ~] # cd /etc/nginx/conf.d/

[root@lb01 conf.d] # vim www.conf                 编辑配置文件

upstream oldboy {                            设置集群名称

server 172.16.1.7:80;                        指定具体的集群中的服务器主机信息

server 172.16.1.8:80;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;                        使用http协议来进行集群中的服务器代理

}

}

[root@lb01 conf.d] # nginx -t                    检查语法是

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 conf.d] # systemctl restart nginx            重启nginx服务

10.3.2.2.3 查看代理是否成功(linux界面)

[root@lb01 conf.d] # curl 10.0.0.7

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.8

172.16.1.8 www.oldboy.com

10.3.2.2.4 查看代理是否成功(浏览器界面)

10.4 nginx实现负载均衡模块

10.4.1 按照比列进行分配(默认不加指令信息为1:1)

10.4.1.1 应用场景

多台web服务器性能不同的时候使用

10.4.1.2 weight指定的使用

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80 weight=4;                    2

server 172.16.1.8:80 weight=2;                    1

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

 

[root@lb01 conf.d] # nginx -t                检查语法是否正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 conf.d] # systemctl restart nginx        重启nginx

10.4.1.3 查看是否分配成功

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.8 www.oldboy.com                    

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com                    27

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com                    

10.4.2 负载均衡健康检查功能

10.4.2.1 应用场景

应用在某台服务器出现故障不能进行处理前端发过来的请求的时候

10.4.2.2 指令的使用

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80;

server 172.16.1.8:80 max_fails=3 fail_timeout=60s;        次,超时时间为60s

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

10.4.2.3 查看是否成功

10.4.2.3.1 172.16.1.8服务器nginx停止

[root@web02 www] # systemctl stop nginx

10.4.2.3.2 查看现在的现象

[root@lb01 conf.d] # curl 10.0.0.5                    分配

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

^[[A172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

10.4.2.3.3 将172.16.1.8开启

[root@web02 www] # systemctl start nginx

10.4.2.3.4 再次查看

[root@lb01 conf.d] # curl 10.0.0.5                发现7,8都会分配

172.16.1.8 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.8 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] #

 

10.4.3 热备的使用

10.4.3.1 应用场景

正常的服务器出现了问题,热备服务器就会工作,正常服务器好了,热备就不需要了

 

  • 上面的理解可能不好懂
    • 可以这样理解,男生和女生谈恋爱,女孩子可能有备胎,在他和她的现任出现了问题以后,备胎就会启动作用,来继续维持,当男朋友和她和好了,备胎自然就不需要了,可以去歇歇了

10.4.3.2 backup指令的使用

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80

server 172.16.1.8:80 backup;                        服务器当做热备

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

 

[root@lb01 conf.d] # nginx -t                检查语法是否正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 conf.d] # systemctl restart nginx        重启nginx

10.4.3.3 查看是否成功

[root@lb01 conf.d] # curl 10.0.0.5                在工作,只有7坏了,8才会工作

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[root@lb01 conf.d] # curl 10.0.0.5

10.4.4 按照连接数进行分配

10.4.4.1 应用场景

企业中出现某台服务器的负载压力一直很高的情况下

10.4.4.2 指令信息的使用

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

least_conn;                    按照连接数进行分配

server 172.16.1.7:80;

server 172.16.1.8:80;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

10.4.5 按照ip_hash数值进行负载均衡

10.4.5.1 应用场景

出现在web网站界面反复登录的情况

指定某个客户端访问某个web服务器

10.4.5.2 指令ip_hash的使用

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

ip_hash;    

server 172.16.1.7:80;

server 172.16.1.8:80;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

10.5 通过负载均衡实现访问不同的界面信息

10.5.1 web服务器的准备(172.16.1.7,172.16.1.8)

[root@web01 conf.d] # cat *.conf

server {

listen 80;

server_name bbs.oldboy.com;                bbs网站的配置

location / {

root /html/bbs;

index index.html index.htm;

}

}

server {

listen 80;

server_name blog.oldboy.com;                    blog网站的配置

location / {

root /html/blog;

index index.html index.htm;

}

}

server {

listen 80;

server_name www.oldboy.com;                        www网站的配置

location / {

root /html/www;

index index.html index.htm;

}

}

[root@web01 conf.d] #

 

[root@web01 conf.d] # cd /html/

[root@web01 html] # mkdir -p blog bbs                创建bbs,blog站点目录

 

[root@web01 html] # cd /html/blog/

[root@web01 blog] # echo "$(hostname -i) blog.oldboy.com" > index.html            添加内容    

[root@web01 blog] # cd ..

[root@web01 html] # cd bbs

[root@web01 bbs] # echo "$(hostname -i) bbs.oldboy.com" > index.html            添加内容

[root@web01 bbs] # cd ../

[root@web01 html] # cd www

[root@web01 www] # echo "$(hostname -i) www.oldboy.com" > index.html        添加内容

[root@web01 www] #

 

[root@web01 nginx] # systemctl restart nginx                                重启nginx

[root@web01 nginx] # nginx -t                                    检查nginx语法

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@web01 nginx] #

10.5.2 负载均衡的验证

  • 发现不管使用什么域名访问只会出现www站点的内容信息

10.5.3 出现这种问题的原因

10.5.3.1 使用wireshark抓http包分析

10.5.3.1.1 抓包工具的使用

10.5.3.1.2 使用vmnat8口来进行抓包

10.5.3.1.3 选择http进行抓包

10.5.3.1.4 开始分析http包

10.5.4 解决办法

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80;

server 172.16.1.8:80 max_fails=3 fail_timeout=60s;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

proxy_set_header Host $host;                设置不同域名可以通过负载均衡访问不同网站的内容

}

}

 

    

[root@lb01 conf.d] # systemctl restart nginx        重启nginx服务

[root@lb01 conf.d] # nginx -t                检查nginx语法的正确性

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 conf.d] #

10.5.5 再次验证是否成功

10.6 实现日志可以知道是哪位客户端访问的日志信息

10.6.1 目前的现象

172.16.1.5 - - [02/Dec/2019:13:39:43 +0800] "GET / HTTP/1.0" 200 26 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-"

  • 上述发现只能知道是负载均衡分配过来的信息,不知道客户端是谁

10.6.2 问题的原因

出现此类问题是因为负载均衡服务器没有将客户端的访问地址告诉web服务器造成的

10.6.3 问题的解决

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80;

server 172.16.1.8:80 max_fails=3 fail_timeout=60s;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;                加入远程需要添加的代理信息

}

}

10.6.4 再次查看

172.16.1.5 - - [02/Dec/2019:13:52:01 +0800] "POST /wp-admin/admin-ajax.php HTTP/1.0" 404 555 "http://blog.oldboy.com/wp-admin/post.php?post=5&action=edit" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "10.0.0.1"    成功

10.7 页面上出现错误怎么健康检查

[root@lb01 conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80;

server 172.16.1.8:80 max_fails=3 fail_timeout=60s;

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_next_upstream error timeout invalid_header http_403 http_502;        设置上出现错误代码的指令信息

}

}

10.8 负载均衡实现动静分离

10.8.1 环境的准备

10.8.1.1 172.16.1.7环境的准备

[root@web01 ~] # cd /html/www/

[root@web01 www] # ll

total 4

-rw-r--r-- 1 root root 26 Dec 2 11:12 index.html

[root@web01 www] # echo "static.oldboy.com" > index.html            添加测试静态数据

10.8.1.2 172.16.1.8环境的准备

[root@web02 ~] # cd /html/www/

You have new mail in /var/spool/mail/root

[root@web02 www] # ll

total 4

-rw-r--r-- 1 root root 26 Dec 2 11:08 index.html

[root@web02 www] # echo "dynamic oldboy.com" > index.html        添加测试动态数据

10.8.1.3 负载均衡的环境的准备

[root@lb01 conf.d] # vim www.conf

upstream static_oldboy {                    创建静态集群

server 172.16.1.7:80;

}

upstream dynamic_oldboy {                    创建动态集群

server 172.16.1.8:80;

}

server {

listen 80;

server_name localhost;

location ~* /static_oldboy {                    代理静态网站

proxy_pass http://static_oldboy;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

location ~* /dynamic_oldboy {

proxy_pass http://dynamic_oldboy;                代理动态网站

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

}

    

[root@lb01 conf.d] # nginx -t                    检查语法信息

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@lb01 conf.d] # systemctl restart nginx            重启nginx服务

[root@lb01 conf.d] #

10.8.2 查看是否成功

10.9 负载均衡实现访问不同的终端显示不一样的H5界面

10.9.1 环境的准备

10.9.1.1 172.16.1.7(iphone)的环境准备

[root@web01 ~] # cd /html/www/

[root@web01 www] # echo "iphone.oldboy.com" > index.html            添加测试是手机端过来的数据信息

You have new mail in /var/spool/mail/root

[root@web01 www] #

10.9.1.2 172.16.1.8(谷歌)的环境准备

[root@web02 ~] # cd /html/www/

[root@web02 www] # echo "pc.oldboy.com" > index.html            添加测试是电脑发送过来的数据

[root@web02 www] #

10.9.1.3 负载均衡的配置

[root@lb01 conf.d] # vim www.conf

upstream iphone {

server 172.16.1.7:80;

}

upstream pc {

server 172.16.1.8:80;

}

server {

listen 80;

server_name localhost;

location / {

if ($http_user_agent ~* iphone){                    看终端是否匹配iphone

proxy_pass http://iphone;

}

proxy_pass http://pc;                            不匹配iphone剩下的匹配电脑

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

}

}

  • $http_user_agent这个是判断客户终端信息使用的是什么类型,后面匹配的具体值,不能随便写,需要在日记中去看看

172.16.1.5 - - [02/Dec/2019:15:24:22 +0800] "GET / HTTP/1.0" 200 18 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1" "10.0.0.1"

  • 上面的日志我们可以看到我现在使用的是iphone来进行访问的

10.9.2 查看最终的结果

10.9.2.1 iphone访问的结果

10.9.2.2 pc端访问的结果

10分钟搞定nginx实现负载均衡的更多相关文章

  1. CENTOS --5分钟搞定Nginx安装的教程

    1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcre-de ...

  2. 【转】让你10分钟搞定Mac--最简单快速的虚拟安装

    文章出处:让你10分钟搞定Mac--最简单快速的虚拟安装http://bbs.itheima.com/thread-106643-1-1.html (出处: 黑马程序员训练营论坛) 首先说明一下. 第 ...

  3. OpenCV3.4.1快速集成到Android studio中,10分钟搞定

    OpenCV3.4.1快速集成到Android studio中,10分钟搞定     转载 https://blog.csdn.net/yu540135101/article/details/8259 ...

  4. 原创|1分钟搞定 Nginx 版本的平滑升级与回滚

    Nginx无论是对于运维.开发.还是测试来说,都是日常工作需要掌握的一个知识点,之前也写过不少关于Nginx相关的文章: Nginx服务介绍与安装 Nginx服务配置文件介绍 Nginx配置虚拟主机 ...

  5. 10分钟搞定 Java 并发队列好吗?好的

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  6. 10分钟搞定让你困惑的 Jenkins 环境变量

    前言 Jenkins, DevOps 技术栈的核心之一,CI/CD 离不开编写 Pipeline 脚本,上手 Jenkins ,简单查一下文档,你就应该不会被 agent,stages,step 这类 ...

  7. Python基于VS2013 开发环境搭建 Hello World 10分钟搞定

    1.先下载Python 安装 Next ->安装完成 2.以前安装过VS2013 打开VS2013 文件->新建项目 (此时如果没有Python Application,请点击里面的安装插 ...

  8. 5分钟搞定Nginx安装

      1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++   2. 安装pcre yum install -y pcre pcr ...

  9. 【前端知识体系-JS相关】10分钟搞定JavaScript正则表达式高频考点

    1.正则表达式基础 1.1 创建正则表达式 1.1.1 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 1.1.2 调用RegExp对象的构 ...

随机推荐

  1. window中php的交互模式

    1.配置php的环境变量: 测试: cmd >> php --version 2.在cmd下编写测试脚本 1)  php -r  + php测试代码: 2) php -a + Enter  ...

  2. abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之一(二十七)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  3. 第一篇: openJDK源码编译安装--mac版本

    1.为什么要编译JDK 想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛高一点,但肯定比阅读各种书籍,文章,博客 ...

  4. 三、netcore跨平台之 Linux配置nginx负载均衡

    前面两章讲了netcore在linux上部署以及配置nginx,并让nginx代理webapi. 这一章主要讲如何配置负载均衡,有些步骤在前两章讲的很详细了,所以这一章我就不会一个个截图了. 因为本人 ...

  5. requests模块发送带headers的Get请求和带参数的请求

    1.在PyCharm开发工具中新建try_params.py文件: 2.try_params.py文件中编写代码: import requests#设置请求Headers头部header = {&qu ...

  6. UCACO刷题

    UCACO刷题 SUBMIT: /* ID: your_id_here LANG: C++ TASK: test */ 文件:freopen(“file.in", "r" ...

  7. 玩转网络(一)用TTL(Time To Live)排查网络问题

    先大概介绍一下TTL(Time To Live)吧! TTL翻译过来就是网络生存时间,说的是一个网络数据包,它在网络设备中转发的跳数(网络设备这里一般指的是路由器),默认值为64,也有很多设置为了12 ...

  8. ASP.NET Core gRPC 使用 Consul 服务注册发现

    一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...

  9. python爬虫项目-一见倾心壁纸

    方法1 import re import urllib import urllib.request def getHtml(url): page = urllib.request.urlopen(ur ...

  10. linux bash shell编程之参数变量和流程控制。

    参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...