一、反向代理

1、什么是代理

代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等)

正向代理:客户端去找服务端
反向代理:代理去找服务端

1.区别在于形式上服务的”对象”不一样
2.正向代理代理的对象是客户端,为客户端服务
3.反向代理代理的对象是服务端,为服务端服务

2、Nginx代理服务常见模式

Nginx作为代理服务,按照应用场景模式进行总结,代理分为

1.正向代理
2.反向代理

3、正向代理

正向代理:客户端去找服务端

 10 nginx之反向代理 、负载均衡_nginx

 

 

4、反向代理

反向代理:代理去找服务端

格式:

upstream [链接池名称] {
server [ip]:[端口] [分发策略];
}

proxy_pass http://[连接处名称];

[root@lb01 conf.d]# cat game.conf
upstream game {
server 172.16.1.8:80;
server 172.16.1.7:80;
}
server {
server_name game.test.com;
listen 80;
location / {
proxy_pass http://game;
}
}



10 nginx之反向代理 、负载均衡_客户端_02

 

1、添加发往后端服务器的请求头信息

Syntax: proxy_set_header field value;
Default: proxy_set_header Host $http_host;
proxy_set_header Connection close;
Context: http, server, location

 


通过负载均衡访问web服务,由于通过IP访问,导致负载均衡错误。
解决:
将域名携带到后端的web服务器中去。

 

# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.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;

 

lb01:

10 nginx之反向代理 、负载均衡_客户端_03

 

 web02:

10 nginx之反向代理 、负载均衡_后端服务_04

 

 windows:

10 nginx之反向代理 、负载均衡_反向代理_05

 

 10 nginx之反向代理 、负载均衡_负载均衡_06

 

 10 nginx之反向代理 、负载均衡_nginx_07

 

 

配置:

lb01:

10 nginx之反向代理 、负载均衡_客户端_08

 

 

web02:

10 nginx之反向代理 、负载均衡_客户端_09

 

 现在正常了:

10 nginx之反向代理 、负载均衡_负载均衡_10

 

2、代理到后端的TCP连接、响应、返回等超时时间

#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

3、proxy_buffer代理缓冲区

#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

4.配置代理优化文件

[root@lb01 conf.d]# cd /etc/nginx
[root@lb01 nginx]# vim proxy_params
[root@lb01 conf.d]# cat ../proxy_params

# 用户请求的时候HOST的值是game.test.com, 那么代理服务会像后端传递请求的还是game.test.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;
# nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 10s;
# nginx代理等待后端服务器的响应时间
proxy_read_timeout 10s;
# 后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 10s;
# nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户
proxy_buffering on;
# 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 8k;
# proxy_buffers 缓冲区
proxy_buffers 8 8k;
# 状态标记
proxy_next_upstream http_404 http_500 http_502 http_503 http_504 http_403 http_429;

 

5.代理调用优化文件

[root@lb01 nginx]# cat /etc/nginx/conf.d/game.conf
upstream game {
server 172.16.1.8:80;
# server 172.16.1.7:80;
}
server{
server_name game.test.com;
listen 80;
location / {
proxy_pass http://game;
include proxy_params;

}
}

 

 

 

10 nginx之反向代理 、负载均衡_nginx_11

 

 

 

二、负载均衡

1、什么是负载均衡

1、平均分配
2、权重大小分配

通过反向代理实现多台web服务器共同工作。

负载均衡是由反向代理来实现的。

负载均衡就是将流量按照一定的方式分配给web机器,将请求平均的分配给后端服务器。

选择使用Nginx来搭建负载均衡服务器

2、四层负载均衡

四层负载均衡是基于TCP/IP协议的

所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑

3、七层负载均衡

七层负载均衡是基于HTTP协议的

七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB

4、四层和七层负载均衡的区别

四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名

所以,一般使用七层负载均衡来负载web服务。

5、公有云中常见的负载均衡

1.SLB #阿里云产品
2.LB #青云产品
3.CLB #腾讯云产品
4.ULB #Ucloud产品

6、负载均衡模块

# ngx_http_upstream_module

#语法
Syntax: upstream name { ... }
Default: —
Context: http

#例子
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}

server {
... ...
location / {
proxy_pass http://backend;
}
}