1、nginx如何实现正向代理、反向代理
1. 正向代理,单纯的proxy_pass,转发给另一个机器,就是正向代理。
正向代理是proxy代理【多个】client
2. 反向代理,只要是结合着负载均衡的,就是反向代理,也就是使用proxy_pass加上upstream参数
反向代理是proxy代理【多个】server
虽然会发现,正向、反向代理服务器,都是处于client、server之间,并且做的事情也都是把client的请求转发给server,然后进行响应,但是二者的目的是不一样的。
正向代理其实是代理客户端:
- 帮助客户端访问一些受限的资源,如国外的资料,如企业内部的内网资料。
- 一般是客户端搭建,如安装某一个代理软件,填入代理服务器的ip、port
- 此时server无法得知client到底是谁,看到的只能是proxy的IP。
反向代理其实是代理服务端:
- 帮助服务端做负载均衡,安全防护
- 一般是在服务端搭建,如部署nginx代理服务器。
- 此时client无法得知server到底是谁,以为自己访问的就是真实的server。
2、正向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
3、反向代理
反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
4、Nginx通过反向代理实现负载均衡
反向代理,代理的是一组服务器,因此就实现了负载均衡的效果。
官网 https://nginx.org/en/docs/http/ngx_http_proxy_module.html
核心参数解释
使用反向代理,难点在于请求转发之后,你得注意保留client本身的信息。
因为nginx反向代理是又再次向后端节点发出新请求。
关于这些转发参数,主要用于为了解决一些业务需求,而设置,否则一般默认即可。
#lb服务器将用户访问网站的hosts信息转发给后端节点
proxy_set_header Host $http_host;
#将用户真实的ip传递给后端的节点,该设置的作用是获取到真实的ip,而不是代理服务器ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
#proxy和server的连接超时,要求不超过75s;
proxy_connect_timeout 60s;
#proxy等待server回传数据的超时时间
proxy_send_timeout 60s;
#proxy等待server响应的超时;
proxy_read_timeout 60s;
#把server返回的数据先放入缓冲区,然后再返回给client,一边收数据,一边传递,而不是全部接收完再传递。
proxy_buffering on | off;
#缓冲区的容量参数;
proxy_buffers 4 128k;
四层负载、七层负载区别
nginx的代理转发参数就是 proxy_pass
四层转发,四层只做流量转发,不做解析
proxy_pass ip:port
七层转发,七层需要涉及http协议,url解析
proxy_pass http://ip:port
区别就在于是否加上协议http://
四层负载均衡
指的就是前四层,一直到TCP/IP层,传输层。
传输层,指的就是基于ip+port的通信,以及负载均衡。
四层负载均衡软件有LVS,性能更高,因为四层LB在接收到client的请求后,只需要通过数据包的目的地址信息(ip+port)然后将流量转发给后端节点。
因此是只针对ip+port协议的数据包转发,而不需要做一些额外复杂逻辑处理,效率就很高。
nginx实现四层负载均衡的模块,名字叫做stream模块
基于四层协议代理数据库
先部署好两台数据库服务器
先手动测试,是否可以远程连接
[root@master-61 ~]#mysql -uyuchao01 -pchaoge666 -h172.16.1.51 -e "show variables like 'hostname';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db-51 |
+---------------+-------+
[root@master-61 ~]#
[root@master-61 ~]#
[root@master-61 ~]#mysql -uyuchao01 -pchaoge666 -h172.16.1.52 -e "show variables like 'hostname';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | db-52 |
+---------------+-------+
负载均衡配置lb-5
# nginx配置文件
# 无须关于http的请求参数了
[root@lb-5 /etc/nginx]#cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
放在http后面,与http同级
stream {
upstream mysql_pool {
server 172.16.1.51:3306 max_fails=3 fail_timeout=30s;
server 172.16.1.52:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 0.0.0.0:3306;
proxy_pass mysql_pool;
}
}
# 启动nginx
[root@lb-5 /etc/nginx]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb-5 /etc/nginx]#nginx -s reload
# 测试访问
[root@lb-5 /etc/nginx]#mysql -uyuchao01 -pchaoge666 -h172.16.1.5 -e "show variables like 'hostname';"
结果会轮询出现db51和db52
七层负载均衡
七层负载均衡是指OSI模型的应用层,也就是基于第七层的协议转发,如http,https协议;因此内容更丰富,例如基于client的访问url区别、客户端的浏览器区别、客户端的ip地址区别,来决定不同的负载均衡动作。
当然OSI模型是自下而上的,nginx是在支持tcp/ip基础之上的,同时支持四层、与七层的转发设置。
http层的负载均衡主要指的是,通过http信息的改写,请求头的改写,url匹配规则,proxy_pass,以及rewrite等规则。
所以说为什么nginx使用的非常广泛,就是如此,因为互联网环境,绝大部分就完全是http协议的通信。
http {
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 8080;
server_name web.com;
location / {
proxy_pass http://web;
}
}
}
LB调度算法
1、rr轮询(round-robin)
默认算法,按照请求顺序逐一分配给不同的后端节点服务器,如果后端节点宕机,宕机的服务器会被自动从地址池中剔除,新的请求会发给正常的服务器。
2、权重轮询(weight)
给后端节点服务器增加权重,数值越大,优先获得客户端请求,可以以服务器配置来决定比例大小,从而解决新旧服务器的性能不均衡问题。
upstream backend {
server 192.168.178.122 weight=1;
server 192.168.178.121 weight=2; #121节点访问两次,122节点访问一次
}
3、哈希轮询(ip_hash)
每个请求按客户端IP的hash结果分配,当新的请求到达,将其客户端IP通过哈希算法得到一个唯一值,在随后的客户端请求中,如果客户端的IP哈希值相等,该请求就会固定发给一台服务器。
注意了使用ip_hash不得再使用weight、backup两个参数,造成冲突了,即使写了也不生效。
upstream chaoge_backend {
ip_hash;
server 192.168.178.121;
server 192.168.178.122;
}
4、url_hash
根据访问url的hash结果分配,同一个url固定发给一个后端节点。
5、least_conn
该算法根据后端节点的链接数决定分配请求,哪个机器链接数少,就发给谁。
负载均衡参数
1、backup参数
被标记为backup参数的服务器,只有服务器池内的其他机器都无法访问了,才会使用该该机器
upstream web-pool{
server 172.16.1.7;
server 172.16.1.8 backup;
}
2、down参数
某个服务器,要停掉,但是也不能立即删除配置文件,down让它下线,不再接收负载均衡的请求。
upstream web-pool{
server 172.16.1.7 down;
server 172.16.1.8;
}
更多参数,请看nginx的 http_ngx_upstream官网参数介绍
max_failes
允许请求失败的次数,一般和fail_timeout结合用
nginx请求转发给某个节点,如果它故障,重试次数
fail_timeout
经过max_failes失败后服务暂停的时间。
重试超时时间
nginx新版本中,默认直接就是健康检查,且延迟很短,后端挂掉,立即请求转发给健康节点,在轮训实验中看过了。
down
标记这个机器停止使用了。
max_conns
限制最大接收的连接数。
以后学nginx高级用法,深入玩法,性能分析再去琢磨。