nginx反向代理
集群概述
简 介:
集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务。
集群优点:
- 高性能
- 可伸缩性
- 高可用
集群种类:
- 负载均衡集群 简称:LBC或者LB。 ===>>>解决调度问题
- 高可用集群 简称:HAC。 ===>>>解决单点故障
- 高性能计算集群 简称:HPC. ===>>>解决复杂运算
- 网络计算集群 ===>>>云计算等
Nginx复杂概念说明:
- 对用户访问请求进行调度管理
- 对用户的访问请求进行压力分担
Nginx反向代理说明:
- 反向代理,接收用户请求代替用户向后端访问
Nginx反向代理所使用的模块:
- ngx_http_upstream_module
- ngx_http_proxy_module
upstream模块配置
参数:
- upstream ===> 定义一个负载均衡池 名称自定义
- server ===> 服务器起点标签 后面跟节点地址
- weight=3 ===> 指定轮训次数,性能好可设置大一些
- max_fails=3 ===> nginx尝试连接后端主机失败的次数
- fail_timeout=10s ===> 在fail_timeout定义的次数失败后,距离下次检查的间隔时间
- backup ===> 备份服务器不提供工作,主服务器宕机提供工作
调度算法
- 定义轮询调度算法 -rr- 默认调度算法
- 定义权重调度算法 weight=3
- 定义静态调度算法 ip_hash 如果没有session共享可以临时用ip_hash算法
- 定义daur(动态调度算法) 根据后端服务器响应时间来分配请求,比较智能的调度锻打,此算法可以根据页面大小加载时间智能的进行负载均衡,需要下载upstream_fair模块
- 定义最小的连接数-least_conn
####################### proxy upstream server_pools { server 192.168.10.249:80 weight=3 max_fails=3 fail_timeout=10; server 192.168.10.253:80 weight=5 max_fails=3 fail_timeout=10; server 192.168.10.252:80 weight=5 max_fails=3 fail_timeout=10 backup; }
ip_hash算法(不能有backup标识和weighe标识)
upstream server_pools { ip_hash; server 192.168.10.249:80 max_fails=3 fail_timeout=10; server 192.168.10.253:80 max_fails=3 fail_tim eout=10; server 192.168.10.252:80 max_fails=3 fail_timeout=10; }
动态调度算法
upstream server_pools { server 192.168.10.249:80 max_fails=3 fail_timeout=10; server 192.168.10.253:80 max_fails=3 fail_timeout=10; server 192.168.10.252:80 max_fails=3 fail_timeout=10; fair; }
proxy模块配置
参数详解:
- proxy_pass http://server_pools; ===>web.yan.com请求都发送到upstream定义的服务器节点池。
- proxy_set_header Host $host; ===>在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机
- proxy_set_header X-Forwarded-For $remote_addr; ===>在代理向后端服务器发送的http请求头中加入X-Forwarded-For字段信息,用于后端服务器程序、日志等接收记录真实用户的IP,而不是代理服务器的IP。
- proxy_connect_timeout 60; ===> 设定反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间。
- proxy_send_timeout 60; ===>设定代理后端服务器的数据回传超时时间
- proxy_read_timeout 60; ===>设定Nginx从代理的后端服务器获取信息的超时时间
- proxy_buffer_size 4k; ===>设定缓冲区的大小
- proxy_buffers 4 32k; ===>设定缓冲区的数量和大小
- proxy_busy_buffers_size 64k; ===>设定系统很忙时可以使用的proxy_buffers大小
- proxy_temp_file_write_size 64k; ===>设定proxy缓存临时文件的大小
- access_log off; ===> 不记录日志可选
- proxy_next_upstream ===>提高用户体验报错自动切换
server { listen 80; server_name web.yan.com; location / { proxy_pass http://server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_504;
}
}
动静分离
服务器规划:
/upload 10.0.0.8:80 html/www/upload upload服务器
/static 10.0.0.7:80 html/www/static static静态服务器
/ 10.0.0.9:80 html/www 默认
创建upstream负载信息:
upstream upload_pools { server 192.168.10.56:80; } upstream static_pools { server 192.168.10.57:80; } upstream default_pools { server 192.168.10.58:80; }
调用upstream信息
server { listen 80; server_name www.yan.com; location /static/ { proxy_pass http://static_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /upload/ { proxy_pass http://upload_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } location / { proxy_pass http://default_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs/access_www.log main; } }
手机用户电脑用户访问不同网站实例配置:
upstream upload_pools { server 10.0.0.8:80; } upstream static_pools { server 10.0.0.7:80; } upstream default_pools { server 10.0.0.9:80; } server { listen 80; server_name www.yan.com; location / { if ($http_user_agent ~* "Iphome") { proxy_pass http://static_pools; } if ($http_user_agent ~* "Android") { proxy_pass http://upload_pools; } proxy_pass http://default_pools; } access_log logs/access_www.log main; } }
keepalived加Nginx高可用集群
Nginx配置
配置listen 192.168.10.244:80; (域名解析到VIP)内核需要开启允许绑定非本地的IP
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf ##/etc/sysctl.conf 加上 sysctl -p
配置文件
upstream server_pools { server 192.168.10.56; server 192.168.10.57; server 192.168.10.58; } server { listen 192.168.10.244:80; server_name www.yan.com; location / { proxy_pass http://server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs/access_www.log main; } server { listen 192.168.10.245:80; server_name blog.yan.com; location / { proxy_pass http://server_pools; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs/access_blog.log main; }
keepalived配置
keepalived脑裂说明:
由于某种原因,导致两台高可用服务器对在指定的时间内,无法检测到对方心跳信息,各自取得资源服务权,而此时的两台高可用服务器都在正常运行,会导致同一个IP或者服务器在两端同时存在而发生冲突,严重占用同一个VIP使用户写入数据丢失。
心跳线老化,
高可用集群同一个交换机故障
防火墙规则
网卡等信息配置不正确等
解决办法,监控备用服务器需IP信息,如果有则,主服务器出现问题。
#!/bin/bash if [ `ip a s ens33|grep 192.168.10.244|wc -l` -ne 0 ] then echo "keepalived is error!!!" else echo "keepalived is ok!!!" fi
NGinx宕机实现,keepalived主备切换(配置文件标红处就是执行脚本切换操作)
#!/bin/bash #name: check_web.sh #desc: check nginx and kill keepalived if [ `ps -ef |grep nginx |grep -v grep |wc -l` -lt 2 ];then /etc/init.d/keepalived stop fi
chmod +x /server/scripts/check_web.sh
配置文件
#lb01 global_defs { router_id LVS_01 #唯一标示 }
vrrp_script check_web {
script "/server/scripts/check_web.sh" #执行的脚本路径
interval 2 #两秒检查一次
weight 2 #触发脚本优先级减去定义的weight降低优先级改为备服务
}
vrrp_instance VI_1 { # state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass admin } virtual_ipaddress { 192.168.10.244/24 dev ens33 label ens33:1 }
track_script { #执行脚本
check_web
} } vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass root } virtual_ipaddress { 192.168.10.245/24 dev ens33 label ens33:2 }
} #lb02 global_defs { router_id LVS_02 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass admin } virtual_ipaddress { 192.168.10.244/24 dev ens33 label ens33:1 } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass root } virtual_ipaddress { 192.168.10.245/24 dev ens33 label ens33:2 } }
作者:闫世成
出处:http://cnblogs.com/yanshicheng