(原文链接: http://www.studyshare.cn/blog-front//blog/details/1159/0 )
一, 准备工作
1, 准备两个项目, 发布到不同的服务器上, 此处使用 2 个虚拟机发布了两个项目分别为: http://192.168.28.128:8081,
http://192.168.28.129:8081
2, 在两个虚拟机上都安装好 nginx
二, 配置 upstream
1, 在任意一台虚拟机上所安装的 nginx 的 nginx.conf 配置文件中配置 upstream 如下:
以上是负载均衡的基本配置, 当前模式采用的是轮询的方式负载. 除了轮询, 还有 weight(权重),ip_hash(根据访
问 ip, 解决 session 问题), 第三方.
2, 根据 weight 负载
- upstream blog {
- server 192.168.28.128:8081 weight=2;
- server 192.168.28.129:8081 weight=1;
- }
说明: 以上配置表示三次访问的时候 weight=2 的服务被访问两次, weight=1 的服务只被访问一次.
3, 根据 ip_hash 负载
- upstream blog {
- ip_hash;
- server 192.168.28.128:8081;
- server 192.168.28.129:8081;
- }
说明: 用户第一次访问落在 128 上, 那么以后该用户的访问都会在 128 的服务器上, 如此即可解决 session 问题.
4,fair 第三方
这种方式是按后端服务的响应时间来分配请求, 相应时间短的优先分配.
- upstream blog {
- server 192.168.28.128:8081;
- server 192.168.28.129:8081;
- fair;
- }
5,url_hash 第三方
这种方式是按 url 的 hash 结果来分配请求, 使没一个 url 请求定向到同一个后端服务器. 也可解决 session 问题, 但需
要注意, 使用这种方式后, server 语句中不能写入 weight 等其他参数.
- upstream blog {
- server 192.168.28.128:8081;
- server 192.168.28.129:8081;
- hash $request_uri;
- hash_method crc32; #使用 crc32 hash 算法
- }
三, 配置 keepalived
使用以上配置可以达到负载均衡的目的, 如果使其中一台机器的服务挂掉, 例如使用 kill -9 将 192.168.28.128
的服务 (注意: 不是 nginx 挂掉, 而是服务挂掉), 此时 nginx 的负载均衡会检测到 128 的服务停止, 只将来自
客户端的请求发到 129 所在的服务器上去, 因此也保证了高可用.
那么如果 128 机器上的 nginx 也挂了呢? 整个服务肯定就不可用了, 如何保证 nginx 也高可用呢? 此处使用 keepalived
来保证 nginx 的高可用.
首先在 192.168.28.128 虚拟机上安装配置 keepalived, 如下:
1, 安装 keepalived: 请参考: http://www.studyshare.cn/blog-front//software/details/1158/1 , 此处不再赘述
2, 配置 keepalived
命令: cd /etc/keepalived #进入 keepalived 配置文件目录
命令: vi keepalived.conf #编辑 keepalived.conf 配置文件
- global_defs {
- router_id LVS_1
- }
- vrrp_instance VI_1 {
- state MASTER #主机
- interface eth0 #网卡
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.28.200 #配置一个虚拟 vip
- }
- }
启动 keepalived
命令:/usr/local/keepalived/sbin/keepalived
命令: ps -ef|grep keepalived #查看启动进程
命令: ip addr #查看 eth0 网卡
然后在 192.168.28.129 虚拟机上安装配置 keepalived, 如下:
1, 安装略
2, 配置 keepalived 配置文件
- global_defs {
- router_id LVS_2
- }
- vrrp_instance VI_1 {
- state BACKUP #从机
- interface eth0 #网卡
- virtual_router_id 51
- priority 50 #优先级
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.28.200 #配置一个虚拟 vip, 此 ip 与主机配置在虚拟 ip 需要一致
- }
- }
启动从机器的 keepalived, 启动方式与主机启动方式相同.
3, 测试
(1), 主机的 keepalive 被 kill 前与 kill 后, 从机器上 eth0 绑定 vip 情况如下:
总结: keepalived 保证了 vip 在主从机器之间漫游. 谁被 kill 掉后, vip 就漫游到未被 kill 掉
4, 配置 keepalived 监控 nginx, 实现 nginx 的高可用
(1), 新建一个文件并写入监控 nginx 执行脚本
命令: cd /usr/local/src
命令: vi check_nginx.sh
写入以下脚本命令:
- #!/bin/bash
- A=`ps -C nginx --no-header |wc -l`
- if [ $A -eq 0 ];then
- /usr/local/nginx/sbin/nginx #重启 nginx, 根据自己本机 nginx 安装路径编写
- if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx 重启失败, 则停掉 keepalived 服务, 进行 VIP 转移
- killall keepalived #杀掉, vip 就漫游到另一台机器
- fi
- fi
保存退出.
(2), 修改 keepalived.conf 配置文件, 加入以下两段
配置完成, 重启 keepalived.
总结: 以上就完成了 keepalived 监控 nginx 的配置, 当停止 nginx 的时候, 监控脚本会自动检测 nginx
是否存活, 否就重启. 达到 nginx 不死鸟的目的.
来源: https://www.cnblogs.com/darendu/p/10891030.html