nginx负载均衡企业应用
1..根据用户访问的uri信息进行负载均衡(动静分离的架构)
2..根据用户的agent(浏览器客户端是什么)信息进行负载均衡(手机和客户端显示不同页面)
克隆web01 创建web02 web03
1..负载均衡概念说明:
什么是服务器集群
完成相同任务或工作的一组服务器(web01 web02 web03 --- web集群)
高性能,高可用,价格有效性,可压缩性
什么是负载均衡
1..实现用户访问请求的调度分配
2..实现用户访问压力分担
什么是反向代理
外网 ---> (eth0 外网)代理服务器(eth1 内网) ---> 公司网站服务器web(内网)
外网用户(客户端) --- 代理服务器(服务端)
代理服务器(客户端) --- web服务器(服务端)
什么是正向代理
内网主机 ---> (内网卡)代理服务器(外网卡) --- 互联网 --- web服务器(日本)
2..软件安装:
以两台lb服务器为例实现负载均衡
使用nginx服务实现负载均衡功能:
(1) 下载安装nginx ---> vim /etc/nginx/nginx.conf ---> user nginx ---> user www
(2) 编写负载均衡文件,以default.conf文件作为模板编辑
[root@lb01 ~]# grep -Ev "^$|#" /etc/nginx/conf.d/default.conf > lb.conf
使用模块: Module ngx_http_upstream_module ---- upstream 负载均衡
ngx_http_proxy_module ---- procxy_passs 反向代理
upstream:
Syntax: upstream name { ... }
Default: —
Context: http ---只能放在http区块,主配置文件中有,或者放在lb.conf的server前面
ngx_http_proxy_module:
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
在localtion下添加.不需要有站点目录,即,root那一行
vim /etc/nginx/conf.d/lb01.conf
upstream oldboy { -----定义oldboy集群
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
======定义可以将请求分配给哪些web服务器===
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://oldboy; ----oldboy相当于集群名称
}
}
浏览器访问却是bbs?如何解决?
通过抓包发现,通过负载均衡后,请求变成了oldboy,所以找不到,直接返回第一个
解决方法: 调用proxy_set_header Host $host 模块
[root@lb01 conf.d]# vim lb.conf
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.oldboy.com;
location / {
proxy_pass http://oldboy;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr; ####
}
}
PS: 优化 ---> 有一台服务器宕机,会造成恰好访问到这台服务器上的时候,会出现错误
解决办法: proxy_next_upstream 模块实现
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default:
proxy_next_upstream error timeout;
Context: http, server, location
server {
...
proxy_next_upstream error timeout http_404 http_502 http_403;
...
}
扩展: 根据用户终端不同(手机,电脑)进行分配服务器
利用if语句和 http_user_agent 模块实现.
[root@lb01 conf.d]# vim lb.conf
upstream web {
server 10.0.0.8:80;
}
upstream mobile {
server 10.0.0.7:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.oldboy.com;
location / {
#如果是iPhone手机访问
if ($http_user_agent ~* iphone) {
proxy_pass http://mobile;
}
#如果是chrome
if ($http_user_agent ~* chrome) {
proxy_pass http://web;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
高可用服务: 可以使两台lb服务器一主一备,防止出现单点问题
安装服务: keepalived
vim /etc/keepalived/keepalived.conf
实现高可用服务只需下面几项配置,其他的可以删除;
==============================lb01配置信息==============================
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_instance ldboy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.0.3
}
}
=================================lb02配置信息================================
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_instance ldboy {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.0.3
}
}
=====================================================================
高可用服务企业应用
(1) 高可用服务常见异常问题 --- 脑裂问题
出现于原因: 高可用备服务器接收不到主服务器发送的组播包,备服务器会自动生成VIP地址.
比如,lb02的防火墙没有关闭,会造成VIP地址保留
物理原因: 多台高可用集群之间通讯线路出现问题 --- 心跳线
逻辑原因: 有安全策略阻止组播包发送
如何解决脑裂问题:
1..进行监控,发出警告
备服务器出现VIP地址的原因
a 主服务器故障
b 脑裂出现
2..关闭其他备服务器的keepalived服务
(2) 实现keepalived服务自动释放VIP地址资源
编写脚本(可加入定时任务)
思路: 比如nginx服务停止运行,则需要停止本机的keepalived服务以释放ip,
监控nginx服务的进程数目
ps -ef | grep -cE '[n]ginx'
加入到keepalived配置文件的脚本模块当中,实现自动化管理
[root@lb01 scripts]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 2 ###执行脚本的间隔时间
weight 2 ###weight参数: 权重值参数,主要用于和优先级进行运算,具体参见day44
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
track_script {
check_web
}
}
网友评论