10分钟搞定nginx实现负载均衡

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)

[[email protected] ~] # cd /etc/nginx/conf.d/

[[email protected] conf.d] # vim www.conf

server {

listen 80;

server_name www.oldboy.com;

location / {

root /html/www;

index index.html index.htm;

}

}

?

[[email protected] conf.d] # cd /html/????????????????????创建站点目录

[[email protected] html] # mkdir -p www

[[email protected] html] # cd www

[[email protected] www] # echo "$(hostname -i) www.oldboy.com" > index.html

?

[[email protected] www] # systemctl restart nginx

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

[[email protected] www] # curl 10.0.0.7

172.16.1.7 www.oldboy.com????????????????????????已经成功

?

[[email protected] www] # curl 10.0.0.8

172.16.1.8 www.oldboy.com

10.3.2.2 lb01服务器的配置

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

[[email protected] ~] # yum -y install nginx????????安装nginx

?

[[email protected] ~] # nginx -V

nginx version: nginx/1.16.1????????????????版本信息

10.3.2.2.2 编辑负载均衡配置文件

[[email protected] ~] # cd /etc/nginx/conf.d/

[[email protected] 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协议来进行集群中的服务器代理

}

}

[[email protected] 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

[[email protected] conf.d] # systemctl restart nginx????????????重启nginx服务

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

[[email protected] conf.d] # curl 10.0.0.7

172.16.1.7 www.oldboy.com

[[email protected] 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指定的使用

[[email protected] 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;

}

}

?

[[email protected] 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

[[email protected] conf.d] # systemctl restart nginx????????重启nginx

10.4.1.3 查看是否分配成功

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.8 www.oldboy.com????????????????????一次8

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com????????????????????27

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com????????????????????2次7

10.4.2 负载均衡健康检查功能

10.4.2.1 应用场景

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

10.4.2.2 指令的使用

[[email protected] 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;????????设置最大失败次数为3次,超时时间为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停止

[[email protected] www] # systemctl stop nginx

10.4.2.3.2 查看现在的现象

[[email protected] conf.d] # curl 10.0.0.5????????????????????只会给7分配

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

^[[A172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

10.4.2.3.3 将172.16.1.8开启

[[email protected] www] # systemctl start nginx

10.4.2.3.4 再次查看

[[email protected] conf.d] # curl 10.0.0.5????????????????发现7,8都会分配

172.16.1.8 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.8 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] #

?

10.4.3 热备的使用

10.4.3.1 应用场景

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

?

  • 上面的理解可能不好懂

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

10.4.3.2 backup指令的使用

[[email protected] conf.d] # vim www.conf

upstream oldboy {

server 172.16.1.7:80

server 172.16.1.8:80 backup;????????????????????????假如8服务器当做热备

}

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://oldboy;

}

}

?

[[email protected] 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

[[email protected] conf.d] # systemctl restart nginx????????重启nginx

10.4.3.3 查看是否成功

[[email protected] conf.d] # curl 10.0.0.5????????????????现在只有7在工作,只有7坏了,8才会工作

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

172.16.1.7 www.oldboy.com

[[email protected] conf.d] # curl 10.0.0.5

10.4.4 按照连接数进行分配

10.4.4.1 应用场景

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

10.4.4.2 指令信息的使用

[[email protected] 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的使用

[[email protected] 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)

[[email protected] 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;

}

}

[[email protected] conf.d] #

?

[[email protected] conf.d] # cd /html/

[[email protected] html] # mkdir -p blog bbs????????????????创建bbs,blog站点目录

?

[[email protected] html] # cd /html/blog/

[[email protected] blog] # echo "$(hostname -i) blog.oldboy.com" > index.html????????????添加内容????

[[email protected] blog] # cd ..

[[email protected] html] # cd bbs

[[email protected] bbs] # echo "$(hostname -i) bbs.oldboy.com" > index.html????????????添加内容

[[email protected] bbs] # cd ../

[[email protected] html] # cd www

[[email protected] www] # echo "$(hostname -i) www.oldboy.com" > index.html????????添加内容

[[email protected] www] #

?

[[email protected] nginx] # systemctl restart nginx????????????????????????????????重启nginx

[[email protected] 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

[[email protected] 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 解决办法

[[email protected] 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;????????????????设置不同域名可以通过负载均衡访问不同网站的内容

}

}

?

????

[[email protected] conf.d] # systemctl restart nginx????????重启nginx服务

[[email protected] 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

[[email protected] 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 问题的解决

[[email protected] 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 页面上出现错误怎么健康检查

[[email protected] 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环境的准备

[[email protected] ~] # cd /html/www/

[[email protected] www] # ll

total 4

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

[[email protected] www] # echo "static.oldboy.com" > index.html????????????添加测试静态数据

10.8.1.2 172.16.1.8环境的准备

[[email protected] ~] # cd /html/www/

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

[[email protected] www] # ll

total 4

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

[[email protected] www] # echo "dynamic oldboy.com" > index.html????????添加测试动态数据

10.8.1.3 负载均衡的环境的准备

[[email protected] 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;

}

}

????

[[email protected] 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

[[email protected] conf.d] # systemctl restart nginx????????????重启nginx服务

[[email protected] conf.d] #

10.8.2 查看是否成功

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

10.9.1 环境的准备

10.9.1.1 172.16.1.7(iphone)的环境准备

[[email protected] ~] # cd /html/www/

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

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

[[email protected] www] #

10.9.1.2 172.16.1.8(谷歌)的环境准备

[[email protected] ~] # cd /html/www/

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

[[email protected] www] #

10.9.1.3 负载均衡的配置

[[email protected] 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端访问的结果

原文地址:https://www.cnblogs.com/liangyuxing/p/11971296.html

时间: 2024-11-05 19:03:53

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

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

1.先下载Python 安装 Next ->安装完成 2.以前安装过VS2013 打开VS2013 文件->新建项目 (此时如果没有Python Application,请点击里面的安装插件) 完成后选择 工具->选项  等待一会 前后没要10分钟 ,就可以把VS2013作为Python的IDE了. 开始刚下载Python下来,一看才25M,我说这么小怎么玩啊,没想到要借助VS2013开发工具,java eclipse也可以的.

10分钟搞定支付宝和微信支付的各种填坑

支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路. 问题1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’ 解决办法: 这是base64.h中没有加入#import 系统库文件导致,这个错误报错方法直接想喷它一脸.报错方式太恶心. 问题2.截图告知你什么问题 解决办法: 这个问题可以同上的,心情好,截图再

Python:10分钟搞定不写代码的爬虫

代码自己敲 使用 Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬虫中的登陆.验证码.异步加载等复杂问题. Web Scraper插件 Web Scraper 官网中的简介: Web Scraper Extension (Free!)Using our extension you can create a plan (sitemap) how a web site should be traversed and what s

10分钟搞定支付宝和微信支付 的 各种填坑

填坑   支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路 问题1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’ 解决办法: 这是base64.h中没有加入#import  系统库文件导致,这个错误报错方法直接想喷它一脸.报错方式太恶心. 问题2.截图告知你什么问题 解决办法: 这个问题可以同上的,心情

10分钟搞定react-router

1.路由的安装: $ npm install -S react-router 2.引入路由文件 import {Router, Route, browserHistory} from 'react-router'; 3.配置路由器 平级路由(做跳转用) const router = ( <Router history={browserHistory}> <Route path="/" component={App}/> <Route path="

10分钟搞定支付宝支付 的 各种填坑

填坑支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路 问题1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’ 解决办法: 这是base64.h中没有加入#import <Foundation/Foundation.h> 系统库文件导致,这个错误报错方法直接想喷它一脸.报错方式太恶心. 问题2.截图告知你

10分钟搞定Lync 2010和Quintum AF集成

接线拓扑 接线方法: l  电信直线直接接在Quintum AF的FXO口上 l  AF采用RJ45接入网络 使用效果: l  PSTN用户拨打直线的号码,会听到二次拨号音,然后再输入Lync用户的分机号码就可以直接振铃Lync用户 l  Lync用户直接拨打外部号码就可以直接振铃 l  如果采用2根或更多外线,那么可以设置共振手机等功能 备注: AF 采用P108-09-10版本 网关端配置 采用串口线配置IP地址: 配置完毕之后重新启动网关(经过配置之后网关的IP地址为192.168.1.4

10分钟搞定老板爱看的动态报表,这些小技巧你get了吗?

某一天,老板想看公司的销售报告.你接到这个任务后,开始处理并汇总数据.你在想如何将销售统计情况汇报给老板. 或许是一张Excel表.可是它看起来不仅枯燥,而且密密麻麻的数字很难抓到重点.到底哪个产品才是最畅销的?销量冠军排行榜是怎样的?销量比去年同期增长多少?难道要老板自己拿Excel表去做分析? 于是你放弃了这个想法,决定做几张图表,通过图表来回答上面的问题,形象直观.于是你做了下面这张图,有KPI看板,销量排行榜,增长率. 这时,你不禁产生了疑问:老板真的只想知道这几个指标吗?如果老板还想看

linux+nginx+tomcat负载均衡,实现session同步

linux+nginx+tomcat负载均衡,实现session同步 花了一个上午的时间研究nginx+tomcat的负载均衡测试,集群环境搭建比较顺利,但是session同步的问题折腾了几个小时才搞定,现把我的过程贴上来,以备用.软件及环境是:虚拟机上装centos 5.5IP为:192.168.0.51 装上nginx和tomcat  6.0.32 命名为 Tomcat1一台win7上装tomcat  6.0.32  IP为:192.168.0.50  命名为 Tomcat2 首先装ngin