天天看点

4、Nginx代理与负载均衡4 代理与负载均衡

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:负载均衡与反向代理的区别就在于:反向代理是将请求转发到指定的服务器,而负载均衡是转发到一组)

4、Nginx代理与负载均衡4 代理与负载均衡

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并放在不同的目录下,表示三个服务

# 第一个
[[email protected] ~]# cat /soft/code1/index.html
<html>
<title> Code1</title>
<body bgcolor="red">
<h1> Code1-8081 </h1>
</body>
</html>

#第二个
[[email protected] ~]# cat /soft/code2/index.html
<html>
<title> Coder2</title>
<body bgcolor="blue">
<h1> Code1-8082</h1>
</body>
</html>

#第三个
[[email protected] ~]# 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 动静分离

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

求延时。

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

继续阅读