2.反向代理(负载均衡的重要参数)
2.反向代理(负载均衡的重要参数)
# 转发http请求的,明确你的后端是运行在基于http协议上。
proxy_pass 请求转发的目标地址;
proxy_pass http://127.0.0.1:8888;
# 部署PHP网站
# 后端php-fpm此时配置文件/etc/php-fpm.d/www.conf
# 人家说该服务,是以fastcgi这个协议运行(http > fastcgi > php-fpm)
fastcgi_pass php-fpm运行的地址;
web-7 (nginx+php-fpm)
fastcgi_pass 127.0.0.1:9000;
这里的俩种协议配置语法,能看懂扣 1,看不懂 2;
请求转发的
# 关于http协
# 你要记住,除了要吧请求转发过去,还得保留着客户端原始的信息数据
# 如何保留这个数据,也是基于不同的协议来设置的
# 先看如下的转发参数,都是基于http协议来的,因为它是以proxy_pass开头的参数
# 和proxy_pass参数对应起来。
# 你在做负载均衡转发参数的时候,如果不加这些参数,
# nginx代理机器,就会丢失client的信息
# 目标server也拿不到client的信息了
# 你公司的网站架构,是
client > nginx机器 > 后端的机器
如果client的信息全部丢失,你无法再后端获取client的信息
你要在后端client做一些基于ip,基于用户身份的验证,那就全部没法验证了,因为http客户端信息丢失了。。。。
简单理解,就是 如 remote_addr那个信息,x_forwarder_for 参数,获取client真实ip
真实ip 是 10.0.0.1 > nginx代理 10.0.0.5 > 10.0.0.7
proxy_pass 结合着用;
proxy_set_header Host $http_host;
lb服务器将用户访问网站的hosts信息转发给后端节点
浏览器访问 域名的形式 , 请求头部信息
host: 域名xxxx
【这里的关于http协议的请求转发,以及客户端信息转发,参数能听懂的】
结合者proxy_pass proxy_set_header 这些参数
能理解 扣 6 不懂 7
# nginx的代理转发参数,就是proxy_pass
# 四层转发
proxy_pass ip:port;
# 基于七层的,http协议转发
proxy_pass http://ip:port;
【这两句话,看懂扣 1,不懂 2】
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
将用户真实的ip传递给后端的节点
其他的就是关于性能的参数,你可以不加,直接使用nginx默认的设置,也没问题,
关于性能的参数,不加,比你乱加,要稳定的多!这是线上的经验。
proxy_connect_timeout 60s;
peoxy和server的连接超时,要求不超过75s;
proxy_send_timeout 60s;
proxy等待server回传数据的超时时间
proxy_read_timeout 60s;
proxy等待server响应的超时;
proxy_buffering on | off;
把server返回的数据先放入缓冲区,然后再返回给client,一边收数据,一边传递,而不是全部接收完再传递。
proxy_buffers 4 128k;
缓冲区的容量参数;
nginx四层负载均衡
四层是没有应用层协议的,基于ip:port找到目标的地址。
3.nginx可以同时实现
- 四层负载均衡,基于ip:port的转发,配置如下
# 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;
}
# 四层基于stream{}这个模块即可,无须http协议相关的
stream {
upstream mysql_pool {
# 目标机器,后端的ip:port 以及负载均衡的参数
server 172.16.1.51:3306 max_fails=3 fail_timeout=30s;
server 172.16.1.52:3306 max_fails=3 fail_timeout=30s;
}
# 定义虚拟主机,nginx最基本的功能,就是虚拟主机,得接收请求
# 访问这个nginx代理机器的3306端口,请求就进入如下
server {
listen 0.0.0.0:3306;
proxy_pass mysql_pool;
}
}
# 描述下请求转发过程
client 发出登录mysql请求
mysql -uroot -p -h10.0.0.5 -P3306
登录请求发给了代理服务器
↓
nginx四层代理服务器,请求轮询发给后端2个节点
↓
一次看到 51机器数据
一次看到52机器数据
对于四层的转发,使用mysql的测试,用了它的3306默认端口
比如 比如数据库的redis,6379,四层转发,用法和这个一样,就是端口不同。
七层负载均衡配置(http)
主配置文件,如下的http协议的配置都应该在
/etc/nginx/nginx.conf
# 打标签
http {
xxxxx;
include /etc/nginx/conf.d/*.conf;
}
[root@lb-5 ~]#cat /etc/nginx/conf.d/proxy.conf
# 定义一组服务器 nginx反向代理,请求转发给一组服务器
# client是不知道,本次请求,到底是 7 给你返回的,还是8返回的
# client 数据都是 nginx这个代理,发给他的
# 因此实现了反向代理+负载均衡的效果
# 这里的nginx七层反向代理负载均衡,看懂扣 6,不懂7
upstream web-pools {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
}
server {
listen 80;
# 当你访问
# http://wordpress.yuchaoit.cn:80/
# 协议 http:// 域名wordpress.yuchaoit.cn 端口80
# path网页资源路径 /
# 这个http 的url协议规范,看懂扣 1 不懂 2
# http://wordpress.yuchaoit.cn:80/
server_name wordpress.yuchaoit.cn;
location / {
proxy_pass http://web-pools;
include /etc/nginx/proxy_params.conf;
}
}
才能协同工作。
负载均衡策略
rr轮询(round-robin)
# 编写地址池
upstream web-pool{
# 默认这么写,就是轮训模式,没加任何其他的参数
server 172.16.1.7;
server 172.16.1.8;
}
# 以及转发参数
# 创建虚拟主机文件,实现代理转发功能
# 大伙能看懂,调试配置文件,解决错误问题的过程吗?
# 能 3 不能 4
server {
listen 22555;
server_name _;
location / {
proxy_pass http://web-pool;
include /etc/nginx/proxy_params;
}
}
Weight(权重轮询)
upstream backend {
server 192.168.178.122 weight=1;
server 192.168.178.121 weight=2;
}
ip_hash
MD5sum 能够得到字符串的唯一值,对它进行哈希
你client每次来访问,得有client的ip地址
针对这个ip进行哈希算法,求值,nginx底层做的,得到一个唯一值
后续这个ip继续访问nginx,nginx就讲这个ip客户端的请求,固定的发给后端的一个节点。
upstream chaoge_backend {
ip_hash;
server 192.168.178.121;
server 192.168.178.122;
}
url_hash
根据访问url的hash结果分配,同一个url固定发给一个后端节点。
学习查看linux的tcp连接情况(ss命令)
ss -an 或者netstat -an
查看当前机器的所有socket连接情况(ip:port)的连接数有多少个
# -a 显示当前服务器,所有的socket
# -n, --numeric don't resolve service names
# 只显示ip:port 而不是显示主机名,让你跟更清晰,ip地址是谁
netstat命令
[root@web-7 ~]#netstat -an |grep -i estab
Active Internet connections (servers and established)
tcp 0 52 10.0.0.7:22 10.0.0.1:53292 ESTABLISHED
tcp 0 0 10.0.0.7:22 10.0.0.1:58119 ESTABLISHED
Active UNIX domain sockets (servers and established)
[root@web-7 ~]#ss -an |grep -i estab | grep '10.0.0.7:22'
tcp ESTAB 0 52 10.0.0.7:22 10.0.0.1:53292
tcp ESTAB 0 0 10.0.0.7:22
负载均衡参数
backup参数
upstream web-pool{
# 默认是轮训算法
# 还可以针对每一个节点,设置不同的功能参数
# backup 被标记为backup参数的服务器,只有服务器池内的其他机器都无法访问了,才会使用该该机器。
server 172.16.1.7;
server 172.16.1.8 backup;
}
down参数
down
标记这个机器停止使用了。
某个服务器,要停掉,但是也不能立即删除配置文件,down让它下线,不再接收负载均衡的请求。
[root@lb-5 /etc/nginx/conf.d]#cat proxy-web.conf
# 编写地址池
upstream web-pool{
# 默认这么写,就是轮训模式,没加任何其他的参数
server 172.16.1.7 down;
server 172.16.1.8;
}
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
[root@master-61 ~]#curl 10.0.0.5:22555
~~~~~~~~~~~web8
其他参数
max_failes
允许请求失败的次数,一般和fail_timeout结合用
nginx请求转发给某个节点,如果它故障,重试次数
fail_timeout
经过max_failes失败后服务暂停的时间。
重试超时时间
nginx新版本中,默认直接就是健康检查,且延迟很短,后端挂掉,立即请求转发给健康节点,在轮训实验中看过了。
down
标记这个机器停止使用了。
max_conns
限制最大接收的连接数。
图解四层负载均衡,七层负载均衡