高效的Nginx负载均衡器

高效的Nginx负载均衡器_第1张图片

1、译安装Nginx

shell > yum -y install gcc gcc-c++ make wget zlib-devel pcre-devel openssl-devel
shell > wget http://nginx.org/download/nginx-1.12.2.tar.gz
shell > tar zxf nginx-1.12.2.tar.gz; cd nginx-1.12.2
shell > ./configure --prefix=/usr/local/nginx-1.12.2 && make && make install
2、准备后端Web服务器
shell > curl 192.168.10.24:8080
welcome to tomcat1
shell > curl 192.168.10.24:8081
welcome to tomcat2
shell > curl 192.168.10.24:8082
welcome to tomcat3

好了,三台后端Web服务器已经启动,分别监听 8080、8081、8082,分别返回 1、2、3

3、Nginx负载均衡配置

涉及模块:

  • ngx_http_proxy_module
  • ngx_http_upstream_module
shell > vim conf/nginx.conf

user  nobody;
worker_processes  1;

pid        logs/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream ls {
        server 192.168.10.24:8080 weight=1 max_fails=3 fail_timeout=20s;
        server 192.168.10.24:8081 weight=2 max_fails=3 fail_timeout=20s;
        server 192.168.10.24:8082 weight=3 max_fails=3 fail_timeout=20s;
    }

    server {
        listen  80;

        location / {
            proxy_pass http://ls;
        }
    }
}

这是一个最简配的 Nginx 配置文件,定义了一个负载均衡池,池中有三台服务器,权重分别是 1、2、3 ( 越大越高 )

最大失败次数 3 次,超过 3 次失败后,20 秒内不检测。

4、Nginx反向代理配置

当用户访问该 IP 的 80 端口时,被转发到后端的服务器。下面是一些反向代理的配置。

# 故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;

# 设置后端服务器获取用户真实IP、代理者真实IP等
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 用于指定客户端请求主体缓存区大小,可以理解成先保存到本地再传给用户
client_body_buffer_size 128k;

# 表示与后端服务器连接的超时时间,即发起握手等侯响应的超时时间
proxy_connect_timeout 90;

# 表示后端服务器的数据回传时间,即在规定时间之后端服务器必须传完所有的数据,否则 Nginx 将断开这个连接
proxy_send_timeout 90;

# 设置 Nginx 从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间,其实是 Nginx 已经进入后端的排队中等候处理的时间
proxy_read_timeout 90;

# 设置缓冲区大小,默认该缓冲区大小等于指令 proxy_buffers 设置的大小
proxy_buffer_size 4k;

# 设置缓冲区的数量和大小。Nginx 从代理的后端服务器获取的响应信息,会放置到缓冲区
proxy_buffers 4 32k;

# 用于设置系统很忙时可以使用的 proxy_buffers 大小,官方推荐大小为 proxu_buffers 的两倍
proxy_busy_buffers_size 64k;

# 指定 proxy 缓存临时文件的大小
proxy_temp_file_write_size 64k;
shell > /usr/local/nginx-1.12.2/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.12.2/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.12.2/conf/nginx.conf test is successful

shell > /usr/local/nginx-1.12.2/sbin/nginx

shell > i=0; while [ $i -lt 10 ];do curl localhost; let i++;done
welcome to tomcat2
welcome to tomcat3
welcome to tomcat3
welcome to tomcat2
welcome to tomcat1
welcome to tomcat3
welcome to tomcat2
welcome to tomcat3
welcome to tomcat3
welcome to tomcat2

总共请求10次,tomcat3 响应了5次,因为它的权重最高(weight=3)。

5、Nginx后端Web服务器健康检查

这样有一个问题,由于没有后端检测功能,当后端某一服务器无法提供服务时,该链接先被转发到这台机器,然后发现该机故障,而后才转发到其它机器,致资源浪费。

因此引入 nginx_upstream_check_module 模块,该模块用于提供负载均衡器内节点的健康检查,通过它可以用来检测后端服务的健康状态。如果后端服务不可用,则后面的请求就不会转发到该节点上。
shell > git clone https://github.com/yaoweibin/nginx_upstream_check_module.git

shell > yum -y install patch

shell > cd /usr/local/src/nginx-1.12.2; patch -p1 < /usr/local/src/nginx_upstream_check_module/check_1.12.1+.patch
patching file src/http/modules/ngx_http_upstream_hash_module.c
patching file src/http/modules/ngx_http_upstream_ip_hash_module.c
patching file src/http/modules/ngx_http_upstream_least_conn_module.c
patching file src/http/ngx_http_upstream_round_robin.c
patching file src/http/ngx_http_upstream_round_robin.h

切换到 Nginx 源码目录,打补丁 ( 注意与自己的 Nginx 版本匹配 )

shell > ./configure --prefix=/usr/local/nginx-1.12.2 --add-module=/usr/local/src/nginx_upstream_check_module
shell > make && make install


重新编译、安装 Nginx,注意加上原来的编译参数。

shell > vim /usr/local/nginx-1.12.2/conf/nginx.conf

    upstream ls {
        server 192.168.10.24:8080;
        server 192.168.10.24:8081;
        server 192.168.10.24:8082;

        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    }

    server {
        listen  80;

        location / {
            proxy_pass http://ls;
        }

        location /status {
            check_status;
            access_log off;
            # allow x.x.x.x;
            # deny all;
        }
    }

去掉了权重值,注意:是可以同时存在的。

添加了一行,检测间隔3000毫秒,连续成功2次标记为UP,连续失败5次标记为DOWN,超时时间1000毫秒,检测类型HTTP。

shell > /usr/local/nginx-1.12.2/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.12.2/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.12.2/conf/nginx.conf test is successful

shell > /usr/local/nginx-1.12.2/sbin/nginx -s stop
shell > /usr/local/nginx-1.12.2/sbin/nginx

直接 -s reload 貌似不行~

shell > curl localhost/status?format=json
{"servers": {
  "total": 3,
  "generation": 1,
  "server": [
    {"index": 0, "upstream": "ls", "name": "192.168.10.24:8080", "status": "up", "rise": 20, "fall": 0, "type": "http", "port": 0},
    {"index": 1, "upstream": "ls", "name": "192.168.10.24:8081", "status": "up", "rise": 18, "fall": 0, "type": "http", "port": 0},
    {"index": 2, "upstream": "ls", "name": "192.168.10.24:8082", "status": "up", "rise": 19, "fall": 0, "type": "http", "port": 0}
  ]
}}

总共有三台机器,都属于负载均衡 ls 组,状态 up,连续成功次数等等。

shell > curl localhost/status?format=json
{"servers": {
  "total": 3,
  "generation": 1,
  "server": [
    {"index": 0, "upstream": "ls", "name": "192.168.10.24:8080", "status": "up", "rise": 73, "fall": 0, "type": "http", "port": 0},
    {"index": 1, "upstream": "ls", "name": "192.168.10.24:8081", "status": "down", "rise": 0, "fall": 6, "type": "http", "port": 0},
    {"index": 2, "upstream": "ls", "name": "192.168.10.24:8082", "status": "up", "rise": 68, "fall": 0, "type": "http", "port": 0}
  ]
}}

关一台后端的话,就变成了这样!重启检测成功后,会被重新加入到负载均衡中!

- END -

Kubernetes全栈技术培训

往期精彩文章

kubernetes全栈技术+企业案例演示【带你快速掌握和使用k8s】

突破运维和开发瓶颈、Python、k8s、DevOps转型一网打尽!

python运维开发实战-基础篇

python运维和开发实战-高级篇

python运维和开发实战-安装和创建Django项目

Docker公司禁止被列入美国"实体名单"的国家、企业使用

Jenkis pipeline构建项目实践-编写podTemplate实现和k8s对接

安装kubernetes集群-灵活安装k8s各个版本高可用集群

Kubernetes v1.19 正式发布

kubernetes面试题汇总

DevOps视频和资料免费领取

kubernetes技术分享-可用于企业内部培训

谈谈我的IT发展之路

kubernetes系列文章第一篇-k8s基本介绍

kubernetes系列文章第二篇-kubectl

了解pod和pod的生命周期-这一篇文章就够了

Kubernetes中部署MySQL高可用集群

Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档

k8s1.18多master节点高可用集群安装-超详细中文官方文档

k8s中蓝绿部署、金丝雀发布、滚动更新汇总

运维常见问题汇总-tomcat篇

关于linux内核参数的调优,你需要知道

kubernetes挂载ceph rbd和cephfs

报警神器Alertmanager发送报警到多个渠道

jenkins+kubernetes+harbor+gitlab构建企业级devops平台

kubernetes网络插件-flannel篇

kubernetes网络插件-calico篇

kubernetes认证、授权、准入控制

限制不同的用户操作k8s资源

面试真题&技术资料免费领取-覆盖面超全~

Prometheus监控MySQL

Prometheus监控Nginx

Prometheus监控Tomcat

linux面试题汇总

测试通过storageclass动态生成pv

通过编写k8s的资源清单yaml文件部署gitlab服务

helm安装和使用-通过helm部署k8s应用

k8s基于Ingress-nginx实现灰度发布

k8s的Pod安全策略

Prometheus Operator-上篇-安装和使用篇

Prometheus Operator-下篇

通过kubeconfig登陆k8s的dashboard ui界面

通过token令牌登陆k8s dashboard ui界面 

kubernetes集群的etcd数据库详细介绍

Linux网络流量监控工具

kubernetes搭建EFK日志管理系统

prometheus operator监控k8s集群之外的haproxy组件         

kubernetes ConfigMap存储卷                                           

技术交流

学无止境,了解更多关于kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS相关内容,想要获取更多资料和免费视频,可按如下方式进入技术交流群

微信:luckylucky421302

按如下指纹可关注


你可能感兴趣的:(运维,docker,nginx,linux,java)