Rootop 服务器运维与web架构

2018-12-14
发表者 Venus
docker ps格式化输出显示指定列已关闭评论

docker ps格式化输出显示指定列

目的:实现docker ps时显示指定列
有时候映射的端口多了,或者容器名字过长,docker ps时,屏幕太小会换行。通过去掉一些不看的列,让其显示为一行,方便查找。
通过 man docker ps 帮助文档可以看到–format参数可以实现格式化输出自定义列。

支持的列名如下:

--format="TEMPLATE"
Pretty-print containers using a Go template.
Valid placeholders:
.ID - Container ID
.Image - Image ID
.Command - Quoted command
.CreatedAt - Time when the container was created.
.RunningFor - Elapsed time since the container was started.
.Ports - Exposed ports.
.Status - Container status.
.Size - Container disk size.
.Names - Container names.
.Labels - All labels assigned to the container.
.Label - Value of a specific label for this container. For example {{.Label "com.docker.swarm.cpu"}}
.Mounts - Names of the volumes mounted in this container.

table实现第一行打印列名,后面是GO语言里template语法(docker是基于go语言开发的)

[root@host ~]# docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Status}}"
CONTAINER ID        IMAGE                           NAMES               STATUS
a640a8b3c0d2        docker.io/rabbitmq:management   rabbitmq            Up 9 days
a814698e6c4d        centos                          new_guanwang        Up 2 weeks
06f722c239b6        c7j8t8                          guanwang            Exited (137) 2 weeks ago

这样就达到想要的格式效果了。

2018-12-13
发表者 Venus
logstalgia实现nginx访问日志可视化已关闭评论

logstalgia实现nginx访问日志可视化

支持nginx、apache标准日志。生成图形动态效果,非常炫酷。
支持linux及windows客户端。

ubuntu下安装:

root@venus:~# apt install logstalgia

# 读取本地日志

root@venus:/usr/local/openresty/nginx/logs# logstalgia access.log

日志读取完会退出程序。

# 动态读取本地日志

root@venus:/usr/local/openresty/nginx/logs# tail -f access.log | logstalgia --sync

# 动态读取远程日志并设置一个标题

root@venus:~# ssh root@HOST tail -f /var/log/nginx/api_access.log  | logstalgia --sync --title sych-api

# 更多参数通过-h查看。

root@venus:~# logstalgia -h

2018-12-13
发表者 Venus
zabbix3.4添加nginx活动连接数监控(Active connections)已关闭评论

前提:
nginx编译时添加了

--with-http_stub_status_module


这个参数。
首先配置nginx的监控模块,在虚拟主机中添加一个location

location /status 
{
   allow all;
   stub_status on;
   access_log off;
}


这样访问http://域名/status就可以看到统计信息,如图。

用shell获取active connections这个值。

curl -s http://xxx.com/status | grep "Active connections:" | awk '{print $3}'


配置zabbix 被监控端:
1、添加自定义监控项

[root@sych ~]# cd /usr/local/zabbix/etc/zabbix_agentd.conf.d
[root@sych zabbix_agentd.conf.d]# cat nginx.conf 
UserParameter=nginx.active,curl -s "http://xxx.com/status" | grep "Active connections:" | awk '{print $3}'


nginx.active是键值名,给zabbix监控端配置监控项时使用。

2、修改zabbix配置文件
[root@sych ~]# vi /usr/local/zabbix/etc/zabbix_agentd.conf
添加下面3行

# 允许用root执行
AllowRoot=1
# 加载自定义配置文件配置路径
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf
#启用用户自定义监控脚本,1启用,0不启用
UnsafeUserParameters=1


重启zabbix_agentd

回到zabbix监控端测试添加的监控键值。
[root@zabbixserver ~]# /usr/local/zabbix/bin/zabbix_get -s ip地址 -p 10050 -k “nginx.active”
10
返回10,取值成功。再去配置zabbix web,添加一个监控项。

 

添加图形:

查看生成图:

配置zabbix监控nginx活动数完成。

2018-12-11
发表者 Venus
docker exec 进入容器报错connection reset by peer已关闭评论

docker exec 进入容器报错connection reset by peer

在centos7.4 yum安装的docker,拉取一个redis镜像,run以后进入容器报错。

[root@sych vhost]# docker exec -it redis /bin/bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "process_linux.go:110: decoding init error from pipe caused \"read parent: connection reset by peer\""

各种查,发现好多资料都提到了版本是1.13.1 。升级到ce版本可以解决。
根据docker官方文档配置yum源,重新安装。
https://docs.docker.com/install/linux/docker-ce/centos/

2018-12-05
发表者 Venus
基于openresty实现服务灰度发布已关闭评论

基于openresty实现服务灰度发布

nginx配置文件:
# 定义3个upstream

upstream up1
{
	server 127.0.0.1:8001;
}

upstream up2
{
	server 127.0.0.2:8002;
}

upstream all
{
	server 127.0.0.1:8001;
	server 127.0.0.2:8002;
}

server
{
	server_name localhost;
	listen 80;

	# 请求交给lua脚本处理
	location /
	{
		lua_code_cache off;
		content_by_lua_file /mnt/proxy.lua;
	}

	# location @ 用于nginx内部跳转
	location @up1
	{
		proxy_pass http://up1;
	}

	location @up2
	{
		proxy_pass http://up2;
	}

	location @all
	{
		proxy_pass http://all;
	}

}

lua代码:

ngx.header.content_type="text/html;charset=utf8"
redis = require('resty.redis')
redis = redis.new()
redis:set_timeout(1000)

ok,err =  redis:connect('127.0.0.1', 6379)

if not ok then
	ngx.say('connect to redis failed ! reason: ' .. err)
end

-- 从redis中检查是否存在即将更新的upstream主机
check_up1 = redis:get('update1') --(up1)
check_up2 = redis:get('update2') --(up2)
-- 注意返回的数据类型来判断
if check_up1 == "1" then
	ngx.exec("@up2")
elseif check_up2 == "1" then
	ngx.exec("@up1")
else
	ngx.exec("@all")
end

原理就是利用redis中设置指定key,比如要更新主机1,则redis中添加key=update1,value=1,当浏览器请求进入nginx的content阶段后执行lua脚本,脚本中检查redis中是否存在要更新的主机,如果发现某个主机要更新则通过Nginx API for Lua中的ngx.exec接口内部跳转到另一台主机。
如果两个都不更新,则根据nginx自己的方式(默认轮询)分发请求。