4 代理与负载均衡
4.1 正向代理与反向代理
正向代理与反向代理的区别
- 正向代理:代理的是客户端。如通过代理服务器去翻墙,代理服务器充当的是客户端的角色。
- 反向代理:代理的是服务器端。我们访问服务器端时,访问的是代理服务器,代理服务器再去帮我们找真正的服务器。如一个服务器没有公网IP地址,就可以在用一台有公网的服务器做代理,前提是这两台服务器能通信
正向代理配置测试
// 配置69.113访问限制,仅允许同⽹网段访问
location ~ .*\.(jpg|gif|png)$ {
allow 192.168.69.0/24;
deny all;
root /soft/code/images;
}
配置好访问限制后,只有69这个网段能访问,所以可以使用69.112这个ip做正向代理
//配置正向代理服务器69.112
server {
listen 80;
resolver 233.5.5.5;
location / {
proxy_pass http://$http_host$request_uri;
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;
}
}
此时就可以使用代理服务器去访问真实的服务器了。
此时在浏览器端可以配置上网的代理服务器,配置69.112的80端口为代理服务器,就可以访问69.113服务器了。
反向代理测试
server {
listen 80;
server_name nginx.bjstack.com;
index index.html;
location / {
proxy_pass http://192.168.56.100;
include proxy_params;
}
}
//WEB站点
server {
listen 80;
server_name nginx.bjstack.com;
root /soft/code;
location / {
root /soft/code;
index index.html;
}
location ~ .*\.(png|jpg|gif)$ {
gzip on;
root /soft/code/images;
}
}
4.2 负载均衡
Nginx实现负载均衡用到了proxy_pass
代理核心配置,将客户端的请求代理转发到一组upstream虚拟服务池。(PS:负载均衡与反向代理的区别就在于:反向代理是将请求转发到指定的服务器,而负载均衡是转发到一组)
Nginx upstream
虚拟配置语法
Syntax: upstream name { ... }
Default: -
Context: http #只能作用于http下面,不能作用于server
//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;
}
}
负载均衡配置示例
1)创建三个index.html并放在不同的目录下,表示三个服务
# 第一个
[root@Nginx ~]# cat /soft/code1/index.html
<html>
<title> Code1</title>
<body bgcolor="red">
<h1> Code1-8081 </h1>
</body>
</html>
#第二个
[root@Nginx ~]# cat /soft/code2/index.html
<html>
<title> Coder2</title>
<body bgcolor="blue">
<h1> Code1-8082</h1>
</body>
</html>
#第三个
[root@Nginx ~]# cat /soft/code3/index.html
<html>
<title> Coder3</title>
<body bgcolor="green">
<h1> Code1-8083</h1>
</body>
</html>
2)创建三个server,不同端口不同的虚拟主机。表示三个服务器。
server {
listen 8081;
root /soft/code1;
index index.html;
}
server {
listen 8082;
root /soft/code2;
index index.html;
}
server {
listen 8083;
root /soft/code3;
index index.html;
}
3)配置Nginx负载均衡
# 虚拟池中有三个节点
upstream node {
server 192.168.69.113:8081;
server 192.168.69.113:8082;
server 192.168.69.113:8083;
}
# 配置负载均衡
server {
server_name 192.168.69.113;
listen 80;
location / {
proxy_pass http://node;
include proxy_params;
}
}
4)测试。
访问192.168.69.113
时,每刷新一次,就切换另一个服务器。
结点状态
虚拟池中的结点可以有以下几种状态:
- down:当前的server不参与负载均衡
- backup:预留的备份服务器
- max_fails:允许请求失败的次数
- fail_timeout:经过多少次失败后,暂停服务
- max_conns:限制最大接收连接数
upstream load_pass {
server 192.168.56.11:8001 down;
server 192.168.56.12:8002 backup;
server 192.168.56.13:8003 max_fails=1 fail_timeout=10s;
}
负载均衡调度策略
-
轮询:默认的调度策略
-
weight:加权轮询
-
upstream load_pass { server 192.168.56.11:8001; server 192.168.56.12:8002 weight=5; server 192.168.56.13:8003; }
-
-
ip_hash:每个请求按照访问的IP的hash结果分配。(同一个ip固定访问同一个服务器)
-
// 如果客户端都⾛走相同代理理 , 会导致某⼀一台服务器器连接过多 upstream load_pass { ip_hash; server 192.168.56.11:8001; server 192.168.56.12:8002; server 192.168.56.13:8003; } // 如果出现通过代理理访问会影响后端节点接收状态均衡,不太推荐
-
-
url_hash:按照url的hash结果分配服务器。(同一个url固定访问同一个服务器)
-
upstream load_pass { hash $request_uri; server 192.168.56.11:8001; server 192.168.56.12:8002; server 192.168.56.13:8003; }
-
-
least_conn:最少连接分配。哪个机器连接数最少就分配哪个。
4.3 TCP代理(四层代理)
以上的负载均衡都是应用层的代理,属于七层模型代理,主要做应用层转发。
TCP代理主要是代理端口。
场景案例:在我们的机房中,只有一台服务器有公网ip,如何让外网能连上其他没有公网ip的服务器,如ssh、mysql。
此时就可以使用TCP代理,利用有公网ip的机器去做负载均衡。
stream只能作用于main下面,不能写在http下面。
# 假设我们有一台内网服务器ip地址为:192.168.56.103,则可以在公网服务器上做以下配置。
stream {
upstream ssh_proxy {
hash $remote_addr consistent;
server 192.168.56.103:22;
}
upstream mysql_proxy {
hash $remote_addr consistent;
server 192.168.56.103:3306;
}
server {
listen 6666;
proxy_connect_timeout 1s;
proxy_timeout 300s;
proxy_pass ssh_proxy;
}
server {
listen 5555;
proxy_connect_timeout 1s;
proxy_timeout 300s;
proxy_pass mysql_proxy;
}
}
# 做好以上配置后,就可以使用公网的ip+6666端口号去连接内网的ssh;使用公网ip+5555端口连接内网的MySQL数据库。
4.4 动静分离
动静分离,通过中间件将动态请求和静态请求进行分离, 分离资源, 减少不必要的请求消耗, 减少请
求延时。
好处: 动静分离后, 即使动态服务不可⽤用, 但静态资源不会受到影响