阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

介绍下Nginx 反向代理与负载均衡

265次阅读
没有评论

共计 4568 个字符,预计需要花费 12 分钟才能阅读完成。

导读 Nginx 的代理功能与负载均衡功能是最常被用到的,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细。
Nginx 代理服务的配置说明

1、设置 404 页面导向地址

error_page 404 https://www.runnob.com; #错误页
proxy_intercept_errors on;    #如果被代理服务器返回的状态码为 400 或者大于 400,设置的 error_page 配置起作用。默认为 off。

2、如果我们的代理只允许接受 get,post 请求方法的一种

proxy_method get;    #支持客户端的请求方法。post/get;

3、设置支持的 http 协议版本

proxy_http_version 1.0 ; #Nginx 服务器提供代理服务的 http 协议版本 1.0,1.1,默认设置为 1.0 版本 

4、如果你的 nginx 服务器给 2 台 web 服务器做代理,负载均衡算法采用轮询,那么当你的一台机器 web 程序 iis 关闭,也就是说 web 不能访问,那么 nginx 服务器分发请求还是会给这台不能访问的 web 服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

介绍下 Nginx 反向代理与负载均衡

如果负载均衡中其中 web2 发生这样的情况,nginx 首先会去 web1 请求,但是 nginx 在配置不当的情况下会继续分发请求道 web2,然后等待 web2 响应,直到我们的响应时间超时,才会把请求重新分发给 web1,这里的响应时间如果过长,用户等待的时间就会越长。

下面的配置是解决方案之一。

proxy_connect_timeout 1;   #nginx 服务器与被代理的服务器建立连接的超时时间,默认 60 秒
proxy_read_timeout 1; #nginx 服务器想被代理服务器组发出 read 请求后,等待响应的超时间,默认为 60 秒。proxy_send_timeout 1; #nginx 服务器想被代理服务器组发出 write 请求后,等待响应的超时间,默认为 60 秒。proxy_ignore_client_abort on;  #客户端断网时,nginx 服务器是否终端对被代理服务器的请求。默认为 off。

5、如果使用 upstream 指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

proxy_next_upstream timeout;  #反向代理 upstream 中设置的服务器组,出现故障时,被代理服务器返回的状态值。

状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

  1. error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
  2. timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
  3. invalid_header: 被代理服务器返回的响应头异常。
  4. off: 无法将请求分发给被代理的服务器。
  5. http_400,….: 被代理服务器返回的状态码为 400,500,502,等。

6、如果你想通过 http 获取客户的真是 ip 而不是获取代理服务器的 ip 地址,那么要做如下的设置。

proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有 RS;则就用 $host;host 是访问 URL 中的域名和端口  www.taobao.com:80
proxy_set_header X-Real-IP $remote_addr;  #把源 IP【$remote_addr, 建立 HTTP 连接 header 里面的信息】赋值给 X -Real-IP; 这样在代码中 $X-Real-IP 来获取 源 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在 nginx 作为代理服务器时,设置的 IP 列表,会把经过的机器 ip,代理机器 ip 都记录下来,用【,】隔开;代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源 IP

关于 X -Forwarded-For 与 X -Real-IP 的一些相关文章可以查看:HTTP 请求头中的 X-Forwarded-For。

7、下面是我的一个关于代理配置的配置文件部分,仅供参考。

include       mime.types;   #文件扩展名与文件类型映射表
default_type  application/octet-stream; #默认文件类型,默认为 text/plain
#access_log off; #取消服务日志    
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat;  #combined 为日志格式的默认值
sendfile on;   #允许 sendfile 方式传输文件,默认为 off,可以在 http 块,server 块,location 块。sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为 0,即不设上限。keepalive_timeout 65;  #连接超时时间,默认为 75s,可以在 http,server,location 块。proxy_connect_timeout 1;   #nginx 服务器与被代理的服务器建立连接的超时时间,默认 60 秒
proxy_read_timeout 1; #nginx 服务器想被代理服务器组发出 read 请求后,等待响应的超时间,默认为 60 秒。proxy_send_timeout 1; #nginx 服务器想被代理服务器组发出 write 请求后,等待响应的超时间,默认为 60 秒。proxy_http_version 1.0 ; #Nginx 服务器提供代理服务的 http 协议版本 1.0,1.1,默认设置为 1.0 版本 。#proxy_method get;    #支持客户端的请求方法。post/get;
proxy_ignore_client_abort on;  #客户端断网时,nginx 服务器是否终端对被代理服务器的请求。默认为 off。proxy_ignore_headers "Expires" "Set-Cookie";  #Nginx 服务器不处理设置的 http 相应投中的头域,这里空格隔开可以设置多个。proxy_intercept_errors on;    #如果被代理服务器返回的状态码为 400 或者大于 400,设置的 error_page 配置起作用。默认为 off。proxy_headers_hash_max_size 1024; #存放 http 报文头的哈希表容量上限,默认为 512 个字符。proxy_headers_hash_bucket_size 128; #nginx 服务器申请存放 http 报文头的哈希表容量大小。默认为 64 个字符。proxy_next_upstream timeout;  #反向代理 upstream 中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默认为 on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为 off。
Nginx 负载均衡详解

首先给大家说下 upstream 这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有 2 中写法。

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    ....
    location  ~*^.+$ {proxy_pass  http://mysvr;  #请求转向 mysvr 定义的服务器列表}
}

然后,就来点实战的东西。

1、热备:如果你有 2 台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA 突然 A 挂啦,BBBBBBBBBBBBBB…..

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #热备     
}

2、轮询:nginx 默认就是轮询其权重都默认为 1,服务器处理请求的顺序:ABABABABAB….

upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为 1。下面服务器的请求顺序为:ABBABBABBABBABB….

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

4、ip_hash:nginx 会让相同的客户端 ip 请求相同的服务器。

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}

5、如果你对上面 4 种均衡算法不是很理解,可以查看 Nginx 配置详解,可能会更加容易理解点。

到这里你是不是感觉 nginx 的负载均衡配置特别简单与强大,那么还没完,咱们继续哈,这里扯下蛋。

关于 nginx 负载均衡配置的几个状态参数讲解。

  1. down,表示当前的 server 暂时不参与负载均衡。
  2. backup,预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。
  3. max_fails,允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
  4. fail_timeout,在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。
upstream mysvr { 
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    
}

到这里应该可以说 nginx 的内置负载均衡算法已经没有货啦。如果你像跟多更深入的了解 nginx 的负载均衡算法,nginx 官方提供一些插件大家可以了解下。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计4568字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7971403
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...