ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx+keepalived负载均衡

2020-09-11 08:32:31  阅读:218  来源: 互联网

标签:负载 nginx keepalived 192.168 server Nginx com example


1、安装Nginx

yum install nginx

2、虚拟主机

2.1、基于IP的虚拟主机

2.2、基于端口的虚拟主机

2.3、基于域名的虚拟主机

vim /etc/hosts

 

 验证:

 

3、长连接

# 关闭长连接:0代表关闭

keepalive_timeout 0;

# 开启长连接(默认开启)

# keepalive_timeout 65;

# 一个长连接处理最大请求数(定期释放内存,防止内存溢出)

# keepalive_requests 8192;

 

4、压缩优化(数据压缩)

gzip on;        # 启动gzip压缩功能

gzip_proxied any;    # nginx做前端代理时启用该选项,表示无论后端服务器的headers返回什么信息,都无条件启用压缩

gzip_min_length 1k;   # 小于1k的小文件不压缩(小文件可能会越压缩越大)

gzip_buffers 4 8k;     # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流,按照原始数据大小以8k为单位申请4倍内存空间

gzip_comp_level 6;    # gzip压缩级别,1压缩比最小处理速度最快,9压缩比最大处理最慢也最消耗CPU,一般设置为3即可

gzip_types text/plain text/css text/xml  text/javascript application/javascript application/json application/x-javascript application/xml application/xml+rss image/jpeg image/gif image/png;   # 页面或文档启用压缩类型

gzip_vary on;         # 开启在http header中添加Vary:Accept-Encoding

 

5、客户端缓存优化

语法:expires [time|epoch|max|off]

默认值:expires off

作用域:http,server,locatio

# 客户端缓存设置:png或gif文件在客户端缓存一个小时

location ~* \.(png|gif)$ {

       expires 1h;

}

测试浏览器刷新以Chrome为例:

①ctrl+f5:

清空本地缓存从服务器拿数据。

②F5或者 点击 浏览器的刷新图标:

优先从本地找,然后去找服务器核对信息是否一致。从本地拿数据。

③回车:

从本地缓存拿数据。

6、Nginx分发算法

集群分发算法:如何将用户请求按照一定的规律分发给业务服务器。主要分为Nginx集群默认算法和基于请求头分发算法。

nginx的upstream 目前支持4种方式的分配:

(1)轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backend {

   # no load balancing method is specified for Round Robin

   server backend1.example.com weight=1;

   server backend2.example.com;

}

 

(2)最小连接数

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backend {

    least_conn;

    server backend1.example.com weight=1;

    server backend2.example.com;

}

 

(1)和(2):指定轮询几率(weight),weight和访问比率成正比,用于后端服务器性能不均的情况。

 

(3)ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务,好处是可以解决session的问题。

因此前两种只能处理静态页面,而这种方式可以处理动态网站。

upstream backend {

    ip_hash;

    server backend1.example.com;

    server backend2.example.com;

}

 

如果其中一台服务需要临时移除

upstream backend {

    server backend1.example.com;

    server backend2.example.com;

    server backend3.example.com down;

}

 

(4)通用hash

 

upstream backend {

    hash $request_uri consistent;

    server backend1.example.com;

    server backend2.example.com;

}

 

(5)最少时间(收费)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

least_time的参数:

header    – Time to receive the first byte from the server

last_byte       – Time to receive the full response from the server

last_byte inflight  – Time to receive the full response from the server, taking into account incomplete requests

 

upstream backend {

    least_time header;

    server backend1.example.com;

    server backend2.example.com;

}

 

(6)随机(收费)

least_conn     – The least number of active connections

least_time=header       (NGINX Plus) – The least average time to receive the response header from the server ($upstream_header_time)

least_time=last_byte     (NGINX Plus) – The least average time to receive the full response from the server ($upstream_response_time)

 

upstream backend {

    random two least_time=last_byte;

    server backend1.example.com;

    server backend2.example.com;

    server backend3.example.com;

    server backend4.example.com;

}

 

7、Nginx基于请求头的分发

7.1、基于host分发

基于host分发这种分发方式适用于多集群分发。例如:一个公司有多个网站,每个网站就是一个集群。

7.2、基于开发语言分发

这种分发方式适用于混合开发的网站,某些大型网站既有php也有jsp,就可以基于开发语言分发。

7.3、基于浏览器的分发

这种基于浏览器的分发,常应用于PC端和移动端区分或浏览器适配。

7.4、基于源IP分发

像腾讯新闻、58同城等等网站,往往在什么地方登陆则获取哪个地方的数据。服务器通过源IP匹配判断,从对应的数据库中获取数据。

7.4.1、geo模块

Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server。

geo指令是通过ngx_http_geo_module模块提供的。默认情况下,nginx安装时是会自动加载这个模块,除非安装时人为的手动添加--without-http_geo_module。

ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址。

7.4.2、geo模块

upstream bj.server {

    server 192.168.31.42;    # web01

}

upstream sh.server {

    server 192.168.31.43;      # web02

}

upstream default.server {

    server 192.168.31.42:81;      # web03

}

geo $geo {       # IP库

    default default;

    192.168.31.241/32 bj;   # 北京

    192.168.31.242/32 sh;   # 上海

}

server {

    listen  80;

    server_name   www.web1.com;

 

    location / {

        proxy_pass http://$geo.server$request_uri;

    }

}

 

8、keepalived+nginx 高可用集群

8.1、架构图

 

 

8.2、修改cat /etc/hosts

192.168.229.11 ha1

192.168.229.12 ha2

192.168.229.13 ha3

192.168.229.14 ha4

192.168.229.15 ha5

 

8.3、服务器免密码登录

ssh-keygen -t rsa  #一直Enter

ssh-copy-id -i /root/.ssh/id_rsa.pub root@ha1

 

8.4、Keepalived介绍

Keepalived的作用是检测服务器的状态,

当服务器宕机或工作出现故障,Keepalived将检测到并将服务器集群中剔除,选择其他服务器代替该服务器的工作;

当服务器恢复工作正常,Keepalived检测到自动将服务器加入服务器群集群。

总结来说:Keepalived软件是一个监控+自愈的软件。

运行协议是VRRP,主分发器的keepalived会向网络广播。

8.5、Keepalived安装

下载:keepalived-2.0.10.tar.gz 

依赖:yum install -y kernel-devel 

编译与安装:

cd keepalived-2.0.10

./configure --prefix=/usr/local/keepalived

make

make install 

服务配置:

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

ln -s /usr/local/keepalived/sbin/keepalived /sbin/

 

8.6、keepalived配置

! Configuration File for keepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

   vrrp_skip_check_adv_addr

   vrrp_strict

   vrrp_garp_interval 0

   vrrp_gna_interval 0

}

 

vrrp_script check_nginx{

        script "/etc/keepalived/check-nginx.sh"

        interval 2

#       timeout 1

        fall 1

}

 

vrrp_instance nginx {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.229.10 #vip虚拟IP

    }

    track_script{

        check_nginx

    }

}

 

virtual_server 192.168.229.10 443 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.229.11 80 {

        weight 1

#心跳检查#(HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|DNS_CHECK|MISC_CHECK|BFD_CHECK)

        TCP_CHECK{

                connect_port 80

                retry 3

        }

    }

 

}

 

执行脚本:/etc/keepalived/check-nginx.sh

#!/bin/bash

 

check_nginx () {

    nginxpid=`ps -C nginx --no-header | wc -l`

    if [ $nginxpid -eq 0 ];then

        service nginx start

        sleep 1

        nginxpid=`ps -C nginx --no-header | wc -l`

        if [ $nginxpid -eq 0 ];then

            killall keepalived

        fi

    fi

}

 

check_nginx

 

! Configuration File for keepalived

 

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

   vrrp_skip_check_adv_addr

   vrrp_strict

   vrrp_garp_interval 0

   vrrp_gna_interval 0

}

 

vrrp_script check_nginx{

        script "/etc/keepalived/check-nginx.sh"

        interval 2

#        timeout 1

        fall 1

}

 

vrrp_instance nginx {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.229.10

    }

    track_script{

        check_nginx

    }

}

 

virtual_server 192.168.229.10 443 {

    delay_loop 6

    lb_algo rr

    lb_kind NAT

    persistence_timeout 50

    protocol TCP

 

    real_server 192.168.229.12 80 {

        weight 1

        TCP_CHECK{

                connect_port 80

                retry 3

        }

    }

}

 

8.7、keepalived启动

keepalived #命令直接启动

自定义启动脚本:autostart.sh

#!/bin/bash

#启动后台服务 

ssh ha3

nohup  java -jar backend.jar& #后台服务

exit 

ssh ha4

nohup  java -jar backend.jar& #后台服务

exit 

ssh ha5

nohup  java -jar backend.jar& #后台服务

exit

 #启动keepalived

ssh ha1

keepalived  

#service keepalived start

sleep 1

 ssh ha2

keepalived 

#service keepalived start

sleep 1

exit

 

9、验证

9.1、后台服务验证

服务目录:

 

index.html文件:

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

       <title>backend</title>

       <script type="text/javascript">

              #var msg="${hostName}";

              #alert(msg);

       </script>

</head>

<body>

       <div>

              <p>templates</p>

              <p>This is backend instance!</p>

              <p th:text="${hostName}"></p>

              <p th:text="${session.hostName}"></p>

              <img src="/images/desk01.jpg" width="600" height="400"/>

              <img src="/images/desk02.jpg" width="600" height="400"/>

       </div>

</body>

</html>

application.properties配置文件

server.port=8080

spring.mvc.static-path-pattern=/**

spring.thymeleaf.cache=false

spring.thymeleaf.check-template=true

spring.thymeleaf.check-template-location=true

spring.thymeleaf.enabled=true

spring.thymeleaf.encoding=UTF-8

spring.thymeleaf.mode=HTML

spring.thymeleaf.servlet.content-type=text/html

分别在ha3、ha4、ha5启动服务:nohup java -jar backend.jar&;注意验证服务是否正常。

 

 

9.2、Nginx服务验证

 

 

两个Nginx服务正常!

9.3、Keepalived服务验证

9.3.1、两台服务都正常

ha1正常:

 

ha2正常:

 

浏览器调用后台服务:

 

文本浏览器调用后台服务:(间隔2秒调用一次)

 

9.3.2、一台服务都正常,一台服务异常

 

 

 

9.4、Nginx+Keepalived服务验证

每间隔2秒关闭一台Nginx服务:

[root@ha1 ~]# watch -n 2 killall nginx

 

通过!!!

标签:负载,nginx,keepalived,192.168,server,Nginx,com,example
来源: https://www.cnblogs.com/sunjun5249/p/13649617.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有