Nginx负载均衡

文章目录

Nginx代理服务

互联网请求里面, 客户端无法直接向服务端发起请求, 那么就需要用到代理服务, 来实现客户端和服务通信

Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主

正向代理(内部上网) 客户端<-->代理->服务端

反向代理 客户端->代理<-->服务端

正向与反向代理的区别

区别在于代理的对象不一样

正向代理代理的对象是客户端

反向代理代理的对象是服务端

举例说明进行理解正反向代理

正向代理:代购:你(客户端)想买国外的东西,但自己买不到,找代购(正向代理)帮你买,国外商家(目标服务器)只知道代购,不知道你

反向代理:小区门卫:你(客户端)想找小区里的住户(后端服务器),但不能直接进,先找门卫(反向代理),门卫帮你传话 / 找对应住户,你不知道具体找的是哪栋楼的住户

Nginx反向代理配置

Nginx代理配置的语法
bash 复制代码
Syntax: proxy_pass URL;
Default: ---
Context: location, if in location, limit_except

http://localhost:8000/uri/
http://10.0.0.7:8000/uri/
http://unix:/tmp/backend.socket:/uri/

添加发往后端服务器的请求头信息

bash 复制代码
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
 proxy_set_header Connection close;
Context: http, server, location


# 用户请求的时候HOST的值是www.tf.com, 那么代理服务会向后端传递请求的还是www.tf.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

代理到后端的 TCP 连接、响应、返回等超时时间设置

bash 复制代码
//nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

//nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location

//后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

proxy_buffer 代理缓冲区

bash 复制代码
//nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客
户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

//设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

//proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

Proxy 代理网站常用优化配置如下,将配置写入新文件,调用时使用 include 引用即可

bash 复制代码
cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


proxy_connect_timeout 30;  连接后端超时时间
proxy_send_timeout 60;      后端回传数据超时时间
proxy_read_timeout 60;     代理等待后端响应超时时间


proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

代理配置 location 的时候调用, 方便后续多个 location 重复使用

bash 复制代码
location / {
 proxy_pass http://127.0.0.1:8080;
 include proxy_params;
}

Nginx负载均衡

负载均衡就是代理吗?

不是的,负载均衡是反向代理的核心功能之一,但代理(正向 / 反向)≠ 负载均衡------ 正向代理基本不涉及负载均衡,反向代理可以有负载均衡(多后端时),也可以没有(单后端时)。

用一句话理清逻辑:代理是 "中间转发" 的角色,负载均衡是 "多后端分发" 的规则;只有当反向代理背后有「多个后端服务器」时,才会用到负载均衡功能。

误区 1:"代理就是负载均衡"------ 错!正向代理和单后端反向代理都没有负载均衡功能,只有多后端反向代理才会用到。

误区 2:"负载均衡就是反向代理"------ 错!负载均衡是 "分发规则",反向代理是 "转发角色";SLB(负载均衡服务)本质是 "反向代理 + 负载均衡" 的组合,但负载均衡本身不是代理。

误区 3:"Nginx 是负载均衡"------ 不严谨!Nginx 的核心是反向代理,负载均衡是它的一个模块功能(需要配置多后端才会生效)。

1、什么是负载均衡

把请求数据平均分配到后端的服务器

2、为什么要进行使用负载均衡

当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组 集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。那么会大大提升系统的吞吐率、请求性能、高容灾

Nginx就是**Server Load Balancer(服务器负载均衡)SBL,**SBL核心是解决 "多台后端服务器如何分摊客户端请求压力的问题,NGINX就是典型的SBL

常用负载均衡软件

bash 复制代码
1.Nginx
2.Haproxy
3.LVS
4.F5(硬件)

Nginx负载均衡类型

四层负载均衡

是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行 应用处理,而不需要进行一些复杂的逻辑

七层负载均衡

七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡, 它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡

四层和七层负载均衡的区别

1、七层负载均衡没有四层的效率高,因为四层负载是在数据包的底层就进行数据的分发,但是七层是在顶层进行分发的;

2、七层是更贴近应用服务,像http https就是七层的协议,像Nginx可以做会话的保持、URL路径规划匹配、head头部改写等,这些四层是没有办法做到的

3、四层负载是无法识别域名

Nginx负载均衡配置场景

Nginx upstream 虚拟配置语法
bash 复制代码
Syntax: upstream name { ... }
Default: -
Context: http
//upstream例子

upstream backend {
 server backend1.example.com weight=5;
 server backend2.example.com:8080;
 server unix:/tmp/backend3;
 server backup1.example.com:8080 backup;
}


server {
 location / {
 proxy_pass http://backend;
 }
}

Nginx反向代理+负载小实验

使用web01和web02提供网页访问服务,lb01配置反向代理和负载

1、Web01服务器上配置nginx, 并创建对应html文件

bash 复制代码
[root@web01 conf.d]# cat www.conf
server {
 listen 80;
 server_name www.tf.com;
 location / {
 root /code/www;
 index index.html;
 }
}

[root@web01 conf.d]# mkdir -p /code/www
[root@web01 conf.d]#  echo "web01" > /code/www/index.html
[root@web01 conf.d]# systemctl restart nginx

2、Web02服务器上配置nginx, 并创建对应html文件

bash 复制代码
[root@web02 conf.d]# cat /etc/nginx/conf.d/www.conf
server {
 listen 80;
 server_name www.tf.com;
 location / {
 root /node;
 index index.html;
 }
}

[root@web02 conf.d]# mkdir -p /code/www
[root@web02 conf.d]# echo "web02" > /code/www/index.html
[root@web02 conf.d]# systemctl restart nginx

3、lb01配置 Nginx 负载均衡

bash 复制代码
1、在lb01上安装好Nginx

2、编写配置文件
[root@lb01 conf.d]# cat proxy.conf
upstream www {
 server 10.0.0.7:80;
 server 10.0.0.8:80;
}
server {
 listen 80;
 server_name www.tf.com;
 location / {
 proxy_pass http://www;
 include proxy_params;
 }
}

3、Nginx 负载均衡调度使用的 proxy_params
[root@lb01 conf.d]# cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

4、启动Nginx
 systemctl restart nginx

4、验证,访问域名之后不停的刷新网页

负载均衡常见问题

问题一:后端服务器出现了问题,负载均衡依然会将请求发送过去

bash 复制代码
后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负
载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了
如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:proxy_next_upstream http_500 | 
http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500...等错误
时,可以分配到下一台服务器程序继续处理,提高平台访问成功率

解决模块

bash 复制代码
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | 
http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent 
| off ...;
Default: proxy_next_upstream error timeout;
Context: http, server, location

配置方式

bash 复制代码
upstream www {
 server 10.0.0.7;
 server 10.0.0.8;
}
server {
 listen 80;
 server_name www.tf.com;
 location / {
 proxy_pass http://www;
 include proxy_params;
#可以配置,可以写到include
 proxy_next_upstream http_500 http_502 http_503 http_504 http_403 
http_404;
 }
}

Nginx负载均衡后端状态

后端 Web 服务器在前端 Nginx 负载均衡调度中的状态

参数名 说明
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器(仅当非backup服务器全部故障时,才会接收请求)
max_fails 允许请求失败的次数(超出次数后,触发fail_timeout)
fail_timeout 经过max_fails次失败后,服务暂停接收请求的时间(超时后会重新检测)
max_conns 限制该server最大可接收的并发连接数(避免单台服务器因连接过多过载)

测试 down 状态, 测试该 Server 不参与负载均衡的调度

bash 复制代码
修改lb01的配置文件
[root@lb01 conf.d]# cat proxy.conf
upstream www {
 server 10.0.0.7:80 down;
 server 10.0.0.8:80;
}
server {
 listen 80;
 server_name www.tf.com;
 location / {
 proxy_pass http://www;
 include proxy_params;
 }
}


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

访问,看看是否可以访问到web1
现象:只能访问web02了

测试 backup

bash 复制代码
修改配置文件
[root@lb01 conf.d]# cat proxy.conf
upstream www {
 server 10.0.0.7:80 backup;
 server 10.0.0.8:80;
}

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

只能访问web02

测试 max_fails 失败次数和 fail_timeout 多少时间内失败多少次则标记 down

bash 复制代码
修改lb01配置文件
[root@lb01 conf.d]# cat proxy.conf
upstream www {
 server 10.0.0.7:80  max_fails=2 fail_timeout=10s;
 server 10.0.0.8:80;
}

测试 max_conns 最大 TCP 连接数

bash 复制代码
upstream load_pass {
 server 10.0.0.7:80;
 server 10.0.0.8:80 max_conns=1;
}

Nginx负载均衡调度算法

调度算法 概述
轮询 按时间顺序逐一将请求分配到不同的后端服务器(Nginx 负载均衡默认算法)
weight(加权轮询) 基于轮询的加权优化,weight 值越大,后端服务器被分配到的访问请求几率越高
ip_hash 每个请求按访问 IP 的哈希结果分配,来自同一 IP 的请求会固定访问某一个后端服务器
url_hash 按照访问 URL 的哈希结果分配请求,同一个 URL 会定向到同一个后端服务器
least_conn 最少连接数算法,优先将请求分发到当前活跃连接数最少的后端服务器

url_hash:Nginx 默认不内置该算法,需安装ngx_http_upstream_hash模块才能使用;也可通过第三方模块实现。

ip_hash:能解决会话保持问题(比如用户登录状态),但需注意:如果某台后端服务器故障,需手动标记为down,否则哈希结果会错乱(Nginx 1.3.1 + 版本可自动处理故障节点)。

least_conn:适合后端服务器性能不均、请求连接时长差异大的场景(比如有动态请求的 Web 服务)。

Nginx 负载均衡 [weight] 权重轮询具体配置

bash 复制代码
upstream www {
 server 10.0.0.7:80 weight=5;
 server 10.0.0.8:80;
}

Nginx 负载均衡 ip_hash 具体配置, 不能和weight一起使用

bash 复制代码
upstream www {
 ip_hash;
 server 10.0.0.7:80;
 server 10.0.0.8:80;
}

Nginx负载均衡TCP实践

配置Nginx4层负载均衡实现如下需求

1.通过访问负载均衡的5555端口,实际是后端的web01的22端口在提供服务。

2.通过访问负载均衡的6666端口,实际是后端的mysql的3306端口在提供服务。

创建相关目录
bash 复制代码
[root@lb01 ~]# mkdir -p /etc/nginx/conf.c
[root@lb01 ~]# vim /etc/nginx/nginx.conf
# 在events层下面,http层上面配置include
include /etc/nginx/conf.c/*.conf;
编辑配置文件
bash 复制代码
[root@lb01 conf.d]# cd /etc/nginx/conf.c/
[root@lb01 conf.c]# cat stream.conf
stream {
#1.定义虚拟资源池
 upstream ssh {
 server 10.0.0.7:22;
 }
 upstream mysql {
 server 10.0.0.51:3306;
 }
#2.调用虚拟资源池
 server {
 listen 5555;
 proxy_connect_timeout 1s;
 proxy_timeout 300s;
 proxy_pass ssh;
 }
 server {
 listen 6666;
 proxy_connect_timeout 1s;
 proxy_timeout 300s;
 proxy_pass mysql;
 }
}
重启服务
bash 复制代码
[root@lb01 conf.c]# systemctl restart nginx
测试
bash 复制代码
确认lb上的端口是否开了
[root@lb01 conf.c]# ss -tnlp | grep nginx
LISTEN     0      511          *:6666                     *:*                   users:(("nginx",pid=17700,fd=7),("nginx",pid=17699,fd=7),("nginx",pid=17698,fd=7))
LISTEN     0      511          *:80                       *:*                   users:(("nginx",pid=17700,fd=8),("nginx",pid=17699,fd=8),("nginx",pid=17698,fd=8))
LISTEN     0      511          *:5555                     *:*                   users:(("nginx",pid=17700,fd=6),("nginx",pid=17699,fd=6),("nginx",pid=17698,fd=6))


检查web01上已经开了22
[root@web01 ~]# ss -tnlp | grep 22
LISTEN     0      128          *:22                       *:*                   users:(("sshd",pid=884,fd=3))
LISTEN     0      128       [::]:22                    [::]:*                   users:(("sshd",pid=884,fd=4))

验证:
访问负载均衡 5555 端口,验证代理后端 web01 的 22 端口(SSH 服务)

Nginx动静分离

动静分离,通过中间件将动态请求和静态请求进行分离, 分离资源, 减少不必要的请求消耗, 减少请求延

时。 好处: 动静分离后, 即使动态服务不可用, 但静态资源不会受到影响

相关实验可以看 《负载均衡-动静分离实验》

相关推荐
七夜zippoe19 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64820 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满20 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠21 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥21 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey90321 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技1 天前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀1 天前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º1 天前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann