作用:
- 解决大并发情况下,将流量分散到多台后端服务器上,避免某台服务器流量过大,导致服务器崩溃。解决了大并发情况下能正常访问的问题。从而解决web达不到,访问不了的问题
- 提高了网站的性能(并发量)和用户体验。
- 方便网站的性能扩展
- 可以让业务服务器之间可以起到冗余功能--》高可用
TCP(传输控制协议)和 UDP(用户数据报协议)是传输层的两种主要协议,它们在数据包(报文)中有一些共同的特征,尽管整体结构和目的大相径庭。下面列出了一些 TCP 和 UDP 报文共有的元素:
- 源端口号和目的端口号:这两种协议的报文头部都包含了源端口号和目的端口号,用于标识发送和接收数据的应用程序。端口号是一个 16 位的字段。
- 校验和:TCP 和 UDP 的报文头部都包含校验和字段,用于检测传输过程中可能出现的数据损坏。校验和覆盖了头部和数据部分,但 UDP 的校验和是可选的,而 TCP 的校验和是必需的。
然而,需要注意的是,TCP 和 UDP 报文的结构和包含的其他字段有很大的差异:
- TCP 报文头部 包含了序号、确认号、窗口大小、紧急指针、偏移量、标志位(如 SYN、ACK、FIN)等额外的字段,用于实现其面向连接、可靠传输的特性。
- UDP 报文头部 相对简单,除了源端口号、目的端口号和校验和之外,只包含了一个长度字段,用于指定整个用户数据报的长度,包括头部和数据部分。
TCP 和 UDP 的主要区别在于 TCP 提供了可靠的数据传输,包括数据排序、错误检测和重传机制,而 UDP 则提供了更快、更轻量级的传输,适用于对实时性和效率要求较高的应用,如视频会议、在线游戏等,但它不保证数据的可靠传输和顺序到达。
IP地址只找到服务器 端口号可以送到同一台服务器上的不同程序 一个程序默认只占用一个端口号
负载均衡器和所有web机 都要编译安装nginx且确保每个后端web服务器都正常提供web服务 直接克隆web2机器 然后修改ip地址 见cd /etc/sysconfig/network-scripts/
-
配置负载均衡功能
备份原来的配置
[root@lb-1 conf]# cp nginx.conf nginx.conf.back
[root@lb-1 conf]# cp nginx.conf.default nginx.conf
cp:是否覆盖"nginx.conf"? y
cat nginx.conf
worker_processes 2;
events {
worker_connections 2048;
}
http {
#定义一个负载均衡器 名字叫scweb ,会将流量分发到下面的3台服务器里
upstream scweb {
server 192.168.159.136;
server 192.168.159.140;
}
#定义一个虚拟主机,对外提供web服务
server {
listen 80;
#定义一个访问网页根目录,定义一个路由,转发到scweb负载均衡配置上去处理
location / {
proxy_pass http://scweb;
}
}
nginx -t nginx -s reload 检查语句错误 并重新启动
负载均衡调度算法
- 轮询 round-robin 简称rr 公平
- 加权轮询 ,weight值越高,获得流量就会越多,默认 weight值为1
- 最小连接数 least-connected
让后端的服务器知道前端的客户机的ip地址
步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X-Real-IP字段
[root@lb-1 conf]# cat nginx.conf
server {
listen 80;
#定义一个访问网页根目录,定义一个路由,转发到scweb负载均衡配置上去处理
location / {
proxy_pass http://scweb;
#代理服务器在转发http请求报文的时候,在http请求报文的头部里增加一个字段 名字叫X-Real-IP,它的值来自客户机的ip地址
proxy_set_header X-Real-IP $remote_addr;
}
}
}
[root@lb-1 conf]# nginx -t nginx -s reload
步骤2:在每个后端real server上使用这个x_real_ip这个字段
- ip_hash a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address) 基于客户机的源ip地址来进行hash算法得到一个hash值(摘要值),你曾经访问过某个server,下次还是去访问这个server,不会调度到其他的server上。适合session信息保存在服务器的场景(客户机ip地址没有变化) 适合网站是需要保存用户信息,用户的信息如果是存放在服务器端里的session里,避免用户切换到其他的服务器的时候,没有它的session,session里会保存用户的登录信息,购物车等临时数据。
-
健康检测 Health Checks
是负载均衡器去检查后端的web server是否正常运行,如果没有运行,就是不健康。
fail_timeout –设置必须多次尝试失败才能将服务器标记为不可用的时间,以及将服务器标记为不可用的时间(默认为10秒)。
max_fails –设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认为1次尝试)。
backup 备份:当其他的服务器都不提供服务的时候,再启用这台服务器提供服务 --》备胎
slow_start 慢启动
down 将上游的服务器标识为不可用,不会再发送任何的请求给这台服务器
-
-
upstream web_servers {
server 192.168.203.144:80;
server 192.168.203.149:80 max_fails=2 fail_timeout=5s;
}
检测方式:
- 被动检测 passive health checks
- 主动检测 active health checks 需要安装nginx plus ,需要付费
access_log logs/host.access.log main; 也要解开注释 方便看日志 看是否成功 tail -f scweb.access.log和hosts.access.log
[root@web-1 conf]# nginx -s reload
转发功能
一台服务器里运行了2个web服务器
- nginx 静态页面 --》80
- go 动态页面 --》8080
当用户访问nginx的80端口的时候,转发请求到go语言写的网站的8080端口上
[root@web-1 system]# cd /web1/
nohup go run server.go &
在nginx服务器上配置转发功能
[root@web-1 conf]# nginx -t
[root@web-1 conf]# nginx -s reload
也可以转发到www.jd.com 或者www.taobao.com
中台路由转发功能
需要到web2服务器上的网页根目录下新建sc文件夹,同时sc文件夹里新建index.html文件
[root@web-2 html]# mkdir sc
[root@web-2 html]# cd sc
[root@web-2 sc]# vim index.html
welcome to sc
500错误
open to many files -->因为linux内核限制一个进程默认情况下只能打开1024个
ulimit -a
max memory size (kbytes, -m) unlimited
open files (-n) 1024
ulimit -n 100000 临时修改线程 通过给内核传递参数,一个进程可打开100000个文件
永久生效 /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000
[root@web-2 sc]# reboot
502错误: bad gateway 负载均衡器后面的backend server都挂了,负载均衡器是好的
四层在传输层和七层(应用层)负载均衡
第四层负载均衡主要基于TCP或UDP协议,关注的是IP地址和端口号。Nginx通过监听特定的端口,接收来自客户端的请求,然后根据一定的策略(如轮询、最少连接数等)将请求分发到后端服务器。这种类型的负载均衡不关心HTTP请求的具体内容,只关注数据包的头部信息。在Nginx配置中,第四层负载均衡通常不直接配置,而是通过监听特定端口并使用`proxy_pass`指令将请求代理到后端服务器。但是,通过使用`stream`模块,Nginx也可以实现真正的第四层负载均衡。
第七层负载均衡,即应用层负载均衡,涉及到解析HTTP/HTTPS请求,可以根据URL、HTTP头、Cookie等更复杂的信息来进行请求的路由。Nginx作为第七层负载均衡器时,能够基于HTTP请求的内容进行智能分发,比如根据URL路径、主机名或者特定的HTTP头信息来选择后端服务器。
在Nginx配置中,第七层负载均衡是通过`http`或`server`块内的`location`指令来实现的。`location`指令可以基于URL模式匹配,将请求路由到不同的后端服务器组。例如:
```nginx
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
location /api/ {
proxy_pass http://backend;}
location /web/ {
proxy_pass http://web_servers;}
Nginx作为负载均衡器,通过第四层和第七层负载均衡能力,可以提供灵活且高性能的请求分发机制,满足不同场景的需求。第四层负载均衡通常用于简单的基于端口的分发,而第七层负载均衡则提供了更精细的控制,适用于需要根据HTTP请求内容进行路由的情况。