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动静分离

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

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

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

相关推荐
熊出没3 小时前
Linux 实操命令大全
linux·运维·chrome
JY.yuyu3 小时前
NET地址转换
运维·服务器·网络
Hy行者勇哥3 小时前
MobaXterm 高效运维实战:从入门到进阶的 Linux 运维 “瑞士军刀” 用法
linux·运维·github
守城小轩3 小时前
基于Chrome140的Quora账号自动化(关键词浏览)——需求分析&环境搭建(一)
运维·自动化·chrome devtools·浏览器自动化·指纹浏览器·浏览器开发
乾元3 小时前
把 SLA / SLO 放到网络可观测的核心:从指标到证据链的工程化路径
运维·开发语言·网络·人工智能·网络协议·架构
广东大榕树信息科技有限公司3 小时前
如何在国产化动环系统中实现智能调控与节能?
运维·网络·物联网·国产动环监控系统·动环监控系统
濊繵3 小时前
Linux网络--数据链路层
linux·运维·网络
叫致寒吧3 小时前
自动化运维工具 Ansible
运维·自动化·ansible