一、负载均衡
负载均衡是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
二、负载均衡原理
负载均衡NAT(Network Address Translation网络地址转换)简单地说就是将一个IP地址转换为另一个IP地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP地址间进行转换。适用于解决Internet IP地址紧张、不想让网络外部知道内部网络结构等的场合下。
系统的扩展可以分为纵向扩展和横向扩展。
纵向扩展:从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力;
横向扩展:通过添加机器来满足大型网站服务的处理能力。
(1)应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。
(2)负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理
三、负载均衡的作用
解决服务器的高并发压力,提高应用程序的处理性能;
提供故障转移,实现高可用;
通过添加或减少服务器数量,增强网站的可扩展性;
在负载均衡器上进行过滤,可以提高系统的安全性;
四、负载均衡常用处理方式
负载均衡分为四层负载均衡和七层负载均衡
1. 四层负载均衡是工作在 OSI 七层协议的第四层——传输层,基于IP+PORT的负载均衡,主要工作是转发。
2. 它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口和源地址)将流量转发到应用服务器。
3. 实现四层负载均衡的方式:
硬件:F5、BIG-IP、Radware等;
软件:LVS、Nginx、Haproxy等
1. 七层负载均衡是工作在七层协议的第七层-应用层,基于虚拟的URL或主机IP的负载均衡,主要工作是代理。
2. 它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。
3. 实现七层负载均衡的方式:
软件:Nginx、Hayproxy等。
五、nginx 七层负载均衡
[root@server]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
event {
worker_connections 1024;
}
http { # 七层负载均衡支持http、ftp协议
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream qicengzu { # 服务器组,组名qingcengzu
server 192.168.33.11:8080; # 组内服务器1
server 192.168.33.22:8080; # 组内服务器2
}
server { # 虚拟服务器
listen 80; # 虚拟服务器端口
server_name localhost; # 虚拟服务器名
location { # 虚拟服务器的url跳转
proxy_pass http://qicengzu;
# 当访问本机的80端口时,跳转到服务器组
}
}
}
2、负载均衡状态
[root@server]# vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
upstream qicengzu { # 服务器组,组名qingcengzu
server 192.168.33.11:8080 down; # 停止此服务器负载均衡
server 192.168.33.22:8080 backup; # 该服务器作为其他组内服务器的备份服务器
server 192.168.....
}
3、负载均衡策略
基于域名的虚拟主机
[root@server2 ~]# ps -au|grep nginx //查看进程
修改Nginx服务配置,添加相关虚拟主机配置如下
1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
2. .. ..
3. server {
4. listen 80; //端口
5. server_name www.a.com; //域名
6. auth_basic "Input Password:"; //认证提示符
7. auth_basic_user_file "/usr/local/nginx/pass"; //认证密码文件
8. location / {
9. root html; //指定网站根路径
10. index index.html index.htm;
11. }
12.
13. }
14. … …
15.
16. server {
17. listen 80; //端口
18. server_name www.b.com; //域名
19. location / {
20. root web; //指定网站根路径
21. index index.html index.htm;
22. }
[root@localhost ~]# mkdir /usr/local/nginx/web //创建网页根目录
[root@localhost ~]# echo "web" > /usr/local/nginx/web/index.html //写测试页面
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载
客户机测试:
[root@localhost ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.134 www.a.com www.b.com
六、nginx反向代理配置
⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)的资源。
1、修改配置
在配置⽂件中添加⼀⾏反向代理块指令(proxy_pass),表示当访问本机地址 192.168.1.125的 80 端⼝时即可跳转到后端服务器 192.168.1.100 的 80 端⼝上。
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.100:80;
}
[root@server2 ~]# /usr/local/nginx/sbin/nginx -s reload
2.建立后端服务器
去server1:
也安装了nginx
[root@server1 ~]# vim /usr/local/nginx/html/index.html
这里是192.168.1.100
3.访问测试
浏览器测试,输入server2的地址192.168.1.125
七、nginx访问IP黑名单
1、修改配置
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
allow 192.168.1.225; //允许192.168.1.225用户访问
deny 192.168.1.0/24; //拒绝1.0网段的用户访问
deny all; //拒绝所有,哪条在前哪条优先级高
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.100:80;
}
[root@server2 ~]# /usr/local/nginx/sbin/nginx -s reload
2、真机浏览器访问;
因为当前服务器拒绝了 1.0 ⽹段的⽤户访问,⽽本机浏览器正是通过 1.254 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了,显示 403 错误信息。
3、另找一台虚拟机(192.168.1.225)访问
[root@web ~]# curl 192.168.1.125
我是192.168.1.100 //访问成功
轮询
wget https://nginx.org/download/nginx-1.26.1.tar.gz
tar -zxvf nginx-1.26.1.tar.gz
yum -y install gcc gcc-c++
yum -y install make
yum -y install openssl-devel
yum -y install pcre-devel
cd nginx-1.26.1/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream
make && make install
useradd -s /bin/nologin -M nginx
/usr/local/nginx/sbin/nginx
static主机
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
upstream server_group_name {
server 192.168.1.31:80;
server 192.168.1.32:80;
server 192.168.1.33:80;
}
server {
listen 80;
server_name localhost;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://server_group_name;
}
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
浏览器访问192.168.1.30:其余三台交替提供服务
(2)weight 加权
upstream backend {
server 192.168.33.11:8080 weight=5;
server 192.168.33.22:8080 weight=2; # 权重默认为1,谁权重大,谁优先处理请求
}
(3)ip_hash
当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上
upstream backend {
ip_hash; # ip_hash算法
server 192.168.33.11:8080;
server 192.168.33.22:8080;
}
(4)least_conn
least_conn:最少连接,把请求转发给连接数较少的后端服务器。
upstream backend {
least_conn; # 将请求转发给连接数较少的后端服务器
server 192.168.33.11:8080;
server 192.168.33.22:8080;
}
(5)url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。
upstream backend {
hash $request_uri;
server 192.168.33.11:8080;
server 192.168.33.22:8080;
}
八、nginx软件平滑升级
kill 信号 进程编号
-USR2 平滑启动一个进程,平滑升级
-WINCH 优雅关闭子进程
-QUIT 优雅关闭主进程
下载编译1.27新版本
[root@localhost nginx-1.27.0]# wget https://nginx.org/download/nginx-1.27.0.tar.gz
[root@localhost nginx-1.27.0]# tar -vxzf nginx-1.27.0.tar.gz
[root@localhost nginx-1.27.0]# cd nginx-1.27.0
[root@localhost nginx-1.27.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream
[root@localhost nginx-1.27.0]# make && make install
[root@localhost nginx-1.27.0]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.27.0
[root@localhost nginx-1.27.0]# /usr/local/nginx/sbin/nginx.old -v
nginx version: nginx/1.26.1
[root@localhost nginx-1.27.0]# ps -aux | grep nginx
root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 4576 0.0 0.0 46672 2284 ? S 15:23 0:00 nginx: worker process
root 19652 0.0 0.0 112720 980 pts/0 S+ 16:35 0:00 grep --color=auto nginx
[root@localhost nginx-1.27.0]# kill -USR2 4567
[root@localhost nginx-1.27.0]# ps -aux | grep nginx
root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 4576 0.0 0.0 46672 2284 ? S 15:23 0:00 nginx: worker process
root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process
root 19656 0.0 0.0 112720 980 pts/0 S+ 16:37 0:00 grep --color=auto nginx
[root@localhost nginx-1.27.0]# kill -WINCH 4576
[root@localhost nginx-1.27.0]# ps -aux | grep nginx
root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process
nginx 19659 0.0 0.0 46672 2040 ? S 16:40 0:00 nginx: worker process
root 19661 0.0 0.0 112720 980 pts/0 S+ 16:40 0:00 grep --color=auto nginx
[root@localhost nginx-1.27.0]# kill -QUIT 4567
[root@localhost nginx-1.27.0]# ps -aux | grep nginx
root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process
root 19663 0.0 0.0 112720 984 pts/0 R+ 16:41 0:00 grep --color=auto nginx
[root@localhost nginx-1.27.0]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.27.0
九、nginx 四层负载均衡
配置tomcat部分代码
[root@localhost ~]# tar -zxvf jdk22.tar.gz
[root@localhost ~]# mv jdk-22.0.2/ /usr/local/jdk22/
[root@localhost ~]# cd /usr/local/jdk22/
[root@localhost jdk22]# sed -i '$aexport JAVA_HOME=/usr/local/jdk22/' /etc/profile
[root@localhost jdk22]# sed -i '$aPATH=$JAVA_HOME/bin:$PATH' /etc/profile
[root@localhost jdk22]# source /etc/profile
[root@localhost jdk22]# java
[root@localhost jdk22]# java -version