nginx+upsync+consul 构建动态nginx配置系统

参考:

http://www.php230.com/weixin1456193048.html  【upsync模块说明、性能评测】

https://www.jianshu.com/p/76352efc5657

https://www.jianshu.com/p/c3fe55e6a5f2

说明:

动态nginx负载均衡的配置,可以通过Consul+Consul-template方式,但是这种方案有个缺点:每次发现配置变更都需要reload nginx,而reload是有一定损耗的。而且,如果你需要长连接支持的话,那么当reloadnginx时长连接所在worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程才真正退出(表现为worker进程处于worker process is shutting down)。因此,如果能做到不reload就能动态更改upstream,那么就完美了。

目前的开源解决方法有3种:

1、Tengine的Dyups模块

2、微博的Upsync模块+Consul

3、使用OpenResty的balancer_by_lua,而又拍云使用其开源的slardar(Consul + balancer_by_lua)实现动态负载均衡。

这里我们使用的是upsync模块+consul 来实现动态负载均衡。操作笔记如下:

consul的命令很简单,官方文档有详细的样例供参考,这里略过。

实验环境:

3台centos7.3机器

cat /etc/hosts 如下:

192.168.5.71  node71

192.168.5.72  node72

192.168.5.73  node73

consul 我们使用3节点都是server角色。如果集群内某个节点宕机的话,集群会自动重新选主的。

nginx-Upsync模块:新浪微博开源的,,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。且reload对nginx性能影响很少。

1、安装nginx+ nginx-upsync-module(3台机器上都执行安装)

nginx-upsync-module模块: https://github.com/weibocom/nginx-upsync-module

nginx版本:1.13.8

yum install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel -y

cd /root/

git clone https://github.com/weibocom/nginx-upsync-module.git

# 建议使用git clone代码编译,刚开始我使用release的tar.gz 编译nginx失败了

groupadd nginx

useradd -g nginx -s /sbin/nologin nginx

mkdir -p /var/tmp/nginx/client/

mkdir -p /usr/local/nginx

tar xf nginx-1.13.8.tar.gz

cd /root/nginx-1.13.8

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --add-module=/root/nginx-upsync-module

make && make install

echo 'export PATH=/usr/local/nginx/sbin:$PATH' >> /etc/profile

source /etc/profile

2、配置nginx虚拟主机

在node1上配置虚拟主机:

cat /usr/local/nginx/conf/nginx.conf 内容如下:

user  nginx;

worker_processes  4;

events {

worker_connections  1024;

}

http {

include       mime.types;

default_type  application/octet-stream;

sendfile        on;

tcp_nopush     on;

keepalive_timeout  65;

gzip  on;

server {

listen       80;

server_name  192.168.5.71;

location / {

root   /usr/share/nginx/html;

index  index.html index.htm;

}

}

}

创建网页文件:

echo 'node71' > /usr/share/nginx/html/index.html

在node3上启动虚拟主机:

cat /usr/local/nginx/conf/nginx.conf 内容如下:

user  nginx;

worker_processes  4;

events {

worker_connections  1024;

}

http {

include       mime.types;

default_type  application/octet-stream;

sendfile        on;

tcp_nopush     on;

keepalive_timeout  65;

gzip  on;

server {

listen       80;

server_name  192.168.5.73;

location / {

root   /usr/share/nginx/html;

index  index.html index.htm;

}

}

}

创建网页文件:

echo 'node73' > /usr/share/nginx/html/index.html

在node2上配置虚拟主机:

此处的node2作为LB负载均衡+代理服务器使用

cat /usr/local/nginx/conf/nginx.conf 内容如下:

user  nginx;

worker_processes  1;

error_log  logs/error.log  notice;

pid        logs/nginx.pid;

events {

worker_connections  1024;

}

http {

include       mime.types;

default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"'

'$upstream_addr $upstream_status $upstream_response_time $request_time';

access_log  logs/access.log  main;

sendfile        on;

tcp_nopush     on;

keepalive_timeout  65;

gzip  on;

upstream pic_backend {

# 兜底假数据

# server 192.168.5.71:8080;

# upsync模块会去consul拉取最新的upstream信息并存到本地的文件中

upsync 192.168.5.72:8500/v1/kv/upstreams/pic_backend upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;

upsync_dump_path /usr/local/nginx/conf/servers/servers_pic_backend.conf;

}

# LB对外信息

server {

listen 80;

server_name  192.168.5.72;

location = / {

proxy_pass http://pic_backend;

proxy_set_header  Host  $host;

proxy_set_header  X-Real-IP  $remote_addr;

proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

add_header    real $upstream_addr;

}

location = /upstream_show {

upstream_show;

}

location = /upstream_status {

stub_status on;

access_log off;

}

}

# 兜底的后端服务器

server {

listen       82;

server_name  192.168.5.72;

location / {

root   /usr/share/nginx/html82/;

index  index.html index.htm;

}

}

}

创建网页文件:

mkdir /usr/share/nginx/html82 -p

echo 'fake data in SLB_72' > /usr/share/nginx/html82/index.html

创建upsync_dump_path(consul、upsync存放upstream主机信息使用到这个目录)

mkdir /usr/local/nginx/conf/servers/

3、安装consul(3台机器上都执行安装)

cd /root/

mkdir /usr/local/consul/

unzip consul_1.0.0_linux_amd64.zip

mv consul /usr/local/consul/

mkdir /etc/consul.d

cd /usr/local/consul/

echo 'export PATH=/usr/local/consul/:$PATH' >> /etc/profile

source /etc/profile

node71上:

/usr/local/consul/consul agent -server -bootstrap-expect 3 -ui -node=node71 -config-dir=/etc/consul.d --data-dir=/etc/consul.d -bind=192.168.5.71 -client 0.0.0.0

node72上:

/usr/local/consul/consul agent -server -bootstrap-expect 3 -ui -node=node72 -config-dir=/etc/consul.d --data-dir=/etc/consul.d -bind=192.168.5.72 -client 0.0.0.0 -join 192.168.5.71

意思是把本节点加入到192.168.5.71这个ip的节点中

node73上:

/usr/local/consul/consul agent -server -bootstrap-expect 3 -ui -node=node73 -config-dir=/etc/consul.d --data-dir=/etc/consul.d -bind=192.168.5.73 -client 0.0.0.0 -join 192.168.5.71

意思是把本节点加入到192.168.5.71这个ip的节点中

这样的话,就在3台主机前台启动了consul程序。

可以在任一台主机上执行:

consul members 列出当前集群的节点状态

consul info  列出当前集群的节点详细信息  (输出信息太多,自己运行时候看去吧)

访问consul自带的web界面

http://192.168.5.71/upstream_show (3个节点都开了webui,因此我们访问任意节点都行)

在任一节点上执行如下命令,即可添加2个key-value信息:

curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.71:80

curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.73:80

在web界面,就可看到如下所示:

删除的命令是:

curl -X DELETE http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.71:80

curl -X DELETE http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.73:80

调整后端服务的参数:

curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.5.71:8500/v1/kv/upstreams/test/192.168.5.71:80

4、测试consul+nginx调度

在node1、node2、node3上都执行 /usr/local/nginx/sbin/nginx 启动nginx服务

访问http://192.168.5.72/upstream_show

访问http://192.168.5.72/upstream_status

刚才我们在第三步的时候,执行了如下2条命令,自动在consul里面加了2行内容。

curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.71:80

curl -X PUT -d '{"weight":10, "max_fails":2, "fail_timeout":10, "down":0}' http://192.168.5.71:8500/v1/kv/upstreams/pic_backend/192.168.5.73:80

我们node2的nginx在启动的时候,会去nginx.conf里面配置的consul地址去寻找对应的upstream信息。同时会dump一份upstream的配置到/usr/local/nginx/conf/servers目录下。

[[email protected] /usr/local/nginx/conf/servers ]# cat servers_pic_backend.conf

server 192.168.5.73:80 weight=10 max_fails=2 fail_timeout=10s;

server 192.168.5.71:80 weight=10 max_fails=2 fail_timeout=10s;

我们可以写个curl脚本测试下,如下

for i in {1..100} ;do curl http://192.168.5.72/; done > /root/log

grep -c node71 /root/log ;grep -c node73 /root/log

可以看到curl是轮询请求到后端的node1和node3上去的。

或者使用for i in {1..100} ;do curl -s -I http://192.168.5.72/|tail -2 |head -1; done

 

如果要下线后端主机进行发布的话,只要把down参数置为1即可,类似如下:

curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}'  http://192.168.5.71:8500/v1/kv/upstreams/test/192.168.5.73:80

如果发布完成并验证后,需要上线,可以再次把down参数置为0

curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":0}'  http://192.168.5.71:8500/v1/kv/upstreams/test/192.168.5.73:80

如果调整在线调整后端服务的upstream参数:

curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":0}'  http://192.168.5.71:8500/v1/kv/upstreams/test/192.168.5.73:80

说明:

每次去拉取 consul 都会设置连接超时,由于 consul 在无更新的情况下默认会 hang 五分钟,所以响应超时配置时间应大于五分钟。大于五分钟之后,consul 依旧没有返回,便直接做超时处理。

此外,还可使用nginx +consulconsul-template这种架构来控制nginx的配置

具体可以参考:

https://www.jianshu.com/p/9976e874c099

https://www.jianshu.com/p/a4c04a3eeb57?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

https://www.cnblogs.com/MrCandy/p/7152312.html

https://github.com/hashicorp/consul-template

官方提供的nginx参考模板:https://github.com/hashicorp/consul-template/blob/master/examples/nginx.md

原文地址:http://blog.51cto.com/lee90/2056182

时间: 2024-11-07 23:55:41

nginx+upsync+consul 构建动态nginx配置系统的相关文章

Consul+Nginx+Upsync+Linux+Keepalived+Lvs的动态负载均衡

注: Nginx版本必须大于等于1.9,linux我使用的是7.0版本,记得关闭防火墙 开始正文: 这里只提一下两个比较会出错的配置,consul,upsync,PCRE库,SSL库,ZLIB库的配置网上很多不一一详解(我是在/usr/local中配置的) Nginx的配置: cd /usr/local/ wget http://nginx.org/download/nginx-1.9.10.tar.gz tar -zxvf nginx-1.9.10.tar.gz groupadd nginx

nginx+tomcat+memcached网页动态请求分配的安装与配置

 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memc

linux学习笔记——搭建基于nginx的web服务器、多核配置、nginx配置参数

############ 认识nginx #############Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用.  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用ngi

构建基于Nginx的web服务器

构建基于Nginx的web服务器 一.简介 Nginx("engine x") 是一个高性能的HTTP 和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器. Nginx 是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站 点开发的,它已经在该站点运行超过四年多了.Igor 将源代码以类BSD许可证的形式发布.自Nginx 发布四年来,Nginx 已经因为它的占有内存少.并发能力强.稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名了.目前国内各大

nginx博客:基于nginx构建LNMP服务

一.nginx简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X", 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率. 目前nginx在大陆主要有两个分支:Tengine(淘宝).Registry nginx工作时,先启动一个master进程,然后由master进程生成一个或多个worker进程(自己设置),每个worker线程响

CentOS7.4—构建Apache+Nginx动静分离

构建Apache+Nginx动静分离实验目的:html静态页面由nginx处理,php动态页面交给apache处理 目录第一部分 准备工作第二部分 配置apache+nginx动静分离第三部分 测试验证 第一部分 环境准备一:服务器两台:Linux系统-CentOS 7.4IP地址:192.168.80.10(搭建LAMP)192.168.80.40(搭建LNMP) 客户端一台:以WIN7为例,用来测试验证,与服务器同一网段IP地址:192.168.80.2二:将防火墙与selinux关闭 注意

Nginx(三):nginx.conf配置文件说明 【1】 配置参数说明

Nginx配置文件说明,不一定最全,但是最细,适合初学者或者概念不清晰者,如有理解错误的地方请指正. #nginx的worker进程用哪个用户和组进行登录,如果在编译时指定了,这里是禁用的,而且不会显示 #你的设置,为了便于识别,在保持禁用的同时你修改为实际用户和组 #user  nginx nginx; #[和优化有关] #启动几个worker进程,从Nginx1.9.10开始可以使用auto值,进行自动设置 #每个worker进程都是单线程进程,所以你叫它进程或者线程都行.这个值最大设置 #

nginx+lua+redis构建高并发应用(转)

nginx+lua+redis构建高并发应用 ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求. url请求nginx服务器,然后lua查询redis,返回json数据. 备注:centos或者redhat系统请跳转到nginx + ngx_lua安装测试 一.安装lua 1 2 3 # apt-get install lua5.1 # apt-get install liblua5.1-dev # apt-get install liblua5.

Nginx反向代理实现负载均衡配置图解

[导读] 负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. 首先简单的介绍下nginx作为反向代理实现负载均衡.反向负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. 首先简单的介绍下nginx作为反向代理实现负载均衡. 反向代理方式是指以反向代理服务器来接受互联网上的连接请求,然后将请求转发给内