一、在已经安装好的openresty环境上添加安装upstream模块报错:
在已经安装好的openresty环境上添加安装upstream模块报错:http upstream check module can not find any check server, make sure you ve added the check 的问题解决。
服务器上已经安装好了openresty,并已搭建好了负载均衡的环境,但配置完后想查看后端的服务器的情况列表,发现没有好用的东西,之前一直使用nginx_upstream_check_module模块,非常好用: nginx模块nginx_upstream_check_module可检查后端服务器的健康情况及nginx安装时报错:Embed is required问题_checking for lua library ... not found-CSDN博客但又不能重装nginx,不然覆盖了我已经搭建好的这套环境,
方法其实也很简单:就是安装的时候只要执行make不要执行make install。只需要在make编译完成之后将编译好的nginx二进制文件替换现在在用的nginx文件即可。当然要注意的是重新configure时要通过nginx -V将原来安装时的参数都带上。具体执行如下:
root@user19:/data01# cd /data01/downloads/; wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
root@user19:/data01/downloads# mv v0.3.0.tar.gz nginx_upstream_check_module.0.3.0.tar.gz
root@user19:/data01/downloads# tar zxvf nginx_upstream_check_module.0.3.0.tar.gz
#add-module添加已经准备好的第三方模块
root@user19:/data01/downloads# ./configure \
--user=www-data \
--group=www-data \
--prefix=/data01/openresty \
--with-pcre \
--with-luajit \
--with-poll_module \
--with-http_ssl_module \
--with-http_perl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--add-module=/data01/downloads/nginx_upstream_check_module-0.3.0
root@user19:/data01/downloads# make
#make安装完之后,build/nginx-1.15.8/objs/目录下的nginx文件即是我们要用的文件
root@user19:/data01/downloads/openresty-1.15.8.2# ls -l build/nginx-1.15.8/objs/
total 14280
drwxr-xr-x 5 root root 4096 Nov 7 11:36 addon
-rw-r--r-- 1 root root 20433 Nov 7 11:36 autoconf.err
-rw-r--r-- 1 root root 128121 Nov 7 11:36 Makefile
-rwxr-xr-x 1 root root 14358888 Nov 7 11:38 nginx
-rw-r--r-- 1 root root 5361 Nov 7 11:38 nginx.8
-rw-r--r-- 1 root root 9682 Nov 7 11:36 ngx_auto_config.h
-rw-r--r-- 1 root root 657 Nov 7 11:36 ngx_auto_headers.h
-rw-r--r-- 1 root root 10822 Nov 7 11:36 ngx_modules.c
-rw-r--r-- 1 root root 62448 Nov 7 11:38 ngx_modules.o
drwxr-xr-x 9 root root 4096 Nov 7 11:36 src
root@user19:/data01/downloads/openresty-1.15.8.2# mv /data01/nginx/sbin/nginx /data01/nginx/sbin/nginx_old
root@user19:/data01/downloads/openresty-1.15.8.2# cp build/nginx-1.15.8/objs/nginx /data01/nginx/sbin/nginx
add-module添加已经准备好的第三方模块,make安装完之后,build/nginx-1.15.8/objs/目录下的nginx文件即是我们要用的文件,可以再使用nginx -V查看是否已经安装好需要的模块,替换nginx文件后杀掉nginx重启之后即可。
重启后访问发现报错:
http upstream check module can not find any check server, make sure you've added the check root@user19, client: 102.95.21.113, server: test.kermit.com, request: "GET /tmu_upstream_status HTTP/1.1", host:
找到原因是 Nginx_upstream_check_module doesn’t work with nginx > 1.7.6。相关文章
https://www.ruby-forum.com/t/nginx-upstream-check-module-doesnt-work-with-nginx-1-7-6/241918
也许有其它的办法的,比如这里有说过一些
https://github.com/yaoweibin/nginx_upstream_check_module/issues/77
我也没有尝试,我这里也不着急解决,就先这样吧。
不过最后在这个网址里看到好像有解决办法了:
http://mailman.nginx.org/pipermail/nginx/2012-September/035375.html
文章链接, 到了github上的一个patch修复链接
https://github.com/yaoweibin/nginx_upstream_check_module
里面包含了对各个nginx版本做的处理比如:check_1.16.1+.patch,不过我用的是nginx1.17,我重新下载了这份文件安装,但是依然没有成功。或者需要等待1.17的patch吧。
二、使用Consul服务发现时定时变更nginx的upstream的shell脚本
这几年随着微服务架构的盛行,同时为了防止硬编码、容灾、水平扩缩容、提高运维效率等,后端服务越来越流行使用服务发现。
什么是服务发现?服务发现是微服务框架体系中的一个重要模块。微服务化后,客户端需要调用服务端的模块更多,以前基本都是在配置文件中直接写IP地址,或者配置在数据库中。微服务化后就会出现难以维护的问题,因为服务的变化更多更频繁,麻烦!这时服务发现就来了,你只要向服务端说你要什么服务,然后服务器端给你返回一堆的IP地址和端口,调用这些地址就可以给你提供服务了。如下图:
做服务发现的框架常用的有zookeeper,eureka,etcd,consul。其中有不少公司使用consul,consul是一个分布式的、高可用、横向扩展的提供服务发现的工具,可以通过DNS或HTTP接口提供服务注册和服务发现。架设起consul服务后只需要一个curl命令就可以列出后端的各个IP地址和端口,提取出这些IP端口更新到nginx的upstream后端IP中重启nginx即可。今天这里列出的就是这么一个shell代码,如下:
u07@t133:/opt/modules/nginx/sbin$ cat consul.sh
#!/bin/bash
nowtime=`date +"%Y-%m-%d %H:%M:%S"`
path='/opt/modules/nginx/conf/vhosts/'
file='04007.com.conf'
sd lookup video.conapi | awk '{print "server "$1":"$2" weight=100;"}' > server.conf.new
linenum=`wc -l server.conf.new | awk '{print $1}'`
diff server.conf server.conf.new #> /dev/null
if [ $? == 0 ]; then
echo $nowtime":no need change"
else
if [ $linenum -lt 50 ]; then
echo -n $nowtime":invalid data. linenum:"$linenum
else
echo -n $nowtime":need change"
cp -f $path$file $path$file.bak
sed '/server-list/r server.conf' $path$file.template > $path$file
/opt/modules/nginx/sbin/nginx -t >/dev/null 2>&1
if [ $? == 0 ]; then
/opt/modules/nginx/sbin/nginx -s reload
#rm -f server.conf
#mv server.conf.new server.conf
echo -e "--reload nginx success.\n"
echo ''
else
echo -e "--nginx config error, give up.\n"
fi
fi
fi
#将任务加到定时任务中去
u07@t133:/$ crontab -l
*/1 * * * * cd /opt/modules/nginx/sbin; ./consul.sh >> /opt/modules/nginx/logs/consul.log
不过这种方法不是什么高大上的方法,不过在我这里够用了吧。资源足够可以使用dns动态解析,upstream直接配置成域名,通过内部DNS解析随时变换后端的服务IP地址,还有一个比较经济有效的方法,就是改造nginx,比如安装一些如dyups动态upstream的模块来实现。我这里暂时就不去尝试了。