OpenVZ + 强迫症 + Nginx Amplify

OpenVZ ♥ Nginx Amplify !

如果你苦恼于 OpenVZ 架构的 VPS 使用 Nginx Amplify 一直有很多 Metrics Unavailable,这篇博客给出了解决方案。

什么是 Nginx Amplify

大概就是 Nginx 官方出品的一款 Nginx 和服务器系统的数据监控平台。

NGINX Amplify is a SaaS‑based monitoring tool for the open source NGINX software and NGINX Plus. With NGINX Amplify you can monitor performance, keep track of infrastructure assets, and improve configuration with static analysis. NGINX Amplify also monitors the underlying OS, application servers (like PHP-FPM), databases, and other components. NGINX Amplify is simple to set up yet powerful enough to provide critical insight into NGINX and system performance.

安装 Nginx Amplify Agent

首先前往 amplify.nginx.com 注册一个账户,然后按照提示一步一步键入指令安装 nginx-amplify-agent。

先下载安装脚本(用 curl 或者 wget)

1
$ curl -L -O https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh

或者

1
$ wget https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh

接着执行(需要 sudo 权限):

1
$ API_KEY='YOUR_API_KEY' sh ./install.sh

接着查看你的 Nginx 服务器是否带有 http_stub_status_module 模块。

1
$ sudo nginx -V 2>&1 | grep -o http_stub_status_module

如果没有,则需要重新编译安装 Nginx 服务器。

然后在 /etc/nginx/conf.d/ 下新建 stub_status.conf 文件,并粘贴入以下内容:

1
2
3
4
5
6
7
8
9
server {
listen 127.0.0.1:80;
server_name 127.0.0.1;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}

并重启 Nginx 服务器。

等一会儿后你的数据应该就会在 amplify.nginx.com 显示了。

进一步配置 Nginx Amplify Agent

参见 https://amplify.nginx.com/docs/guide-metrics-and-metadata.html#additional-nginx-metrics

具体呢就是在你的 Nginx 配置下,增加一个 log_format:

1
2
3
4
5
6
7
8
log_format  main_ext  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$host" sn="$server_name" '
'rt=$request_time '
'ua="$upstream_addr" us="$upstream_status" '
'ut="$upstream_response_time" ul="$upstream_response_length" '
'cs=$upstream_cache_status' ;

然后将你的 access log 设为这个 format,并且把 error log 的等级设置为 warn。

最后重新加载 Nginx 配置就可以了。

解决 NGINX HTTP Errors 等 NGINX Metrics 无法被收集的问题(干货 x1)

如果配置完上一步之后,Amplify 网站中 NGINX HTTP Errors 等 Metrics 仍然显示 Metrics Unavailable,很大的可能性是因为你的 Nginx 服务器是以 root 身份运行的(至少我是这样)。然而 Amplify Agent 默认是以 Nginx 用户运行的,因为权限的原因,Amplify Agent 无法读到 Nginx 的日志。

首先看看 Amplify Agent 的运行日志(默认是 /var/log/amplify-agent/agent.log )。如果看到类似 supervisor failed to initialize pipeline for "/var/log/nginx/access.log" due to IOError (maybe has no rights?) 的日志,那么就是上述的问题没跑了。

怎么解决呢?最自然的办法当然是让 Amplify Agent 以 root 运行。

让 Amplify Agent 以 root 运行

打开 Amplify Agent 的配置文件(默认是 /etc/amplify-agent/agent.conf ),修改 [nginx] 选项下的配置:

1
2
[nginx]
user = 0

然后重启 Amplify Agent 服务:

1
$ sudo service amplify-agent restart

等几分钟后应该就可以看到 Nginx Metrics 都已经开始统计了。

不过,让程序以 root 运行可不是什么好习惯,有很大的安全隐患。有没有其他的方法呢?既然是 Amplify Agent 无法读到 root 用户的文件,那不妨让 Nginx 以非 root 运行,并且让 Nginx 和 Amplify Agent 处于同一用户之下,这样不就解决了吗。

这样的方法看上去很诱人,但坑却很多,而且做不到完美。至今我仍然找不到让 Amplify Agent 顺利收集 Nginx Disk I/O 的方法。

这里容我吐槽一下。 Nginx Disk I/O 未能被收集的原因是 Amplify Agent 没有对 /proc/[pid]/io 的读取权限,但是我看这个文件的拥有着明明是 nginx 而且权限是 -r--------,并且我把文件cp出去之后就能读取了.... 我深度怀疑是 SELinux 的锅,虽然我的服务器貌似并没有装 SELinux .... 经过各种怀疑人生之后,我还是决定以 root 运行 Amplify Agent,并且打算有空去折腾 docker "nginx-with-amplify" images。

让 Nginx 以非 root 运行

首先,建立一个账户,我这里就用 nginx 账户了。

然后,将 Nginx 的相关文件和目录都改为 nginx 账户所属。

1
2
3
$ sudo chown nginx /usr/sbin/nginx/
$ sudo chown -R nginx /etc/nginx/
$ sudo chown -R nginx /var/log/nginx/

从上到下依次是:Nginx 的可执行文件、Nginx 的配置目录、Nginx 的日志目录。

然后修改 Nginx 的配置:

1
2
3
4
nginx.conf

# user = nginx;
pid /var/run/nginx/nginx.pid

然后创建 Nginx 所需的 pid 文件所在的目录:

1
2
$ sudo mkdir /var/run/nginx
$ sudo chown -R nginx /var/run/nginx/

注意这里还要将其他与 Nginx 相关的文件和目录改变归属使得 Nginx 有权限访问。例如我的 https 证书存在 /etc/letsencrypt/ 下,那就应该运行如下命令:

1
$ sudo chown -R nginx /etc/letsencrypt/

Linux 系统对非 root 用户的限制是不能绑定 1024 以下的端口,所以我们还需要赋予 Nginx 绑定 80 和 443 端口的权限。

1
2
$ sudo nginx -s quit
$ sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/sbin/nginx

最后,以 nginx 用户身份启动 Nginx:

1
$ sudo -u nginx nginx

这样 Nginx 和 Amplify Agent 就都以同一用户运行了,自然 Nginx 的相关信息也就可以被 Amplify Agent 所收集到了。

解决 Disk I/O 等 System Metrics 无法被收集的问题(干货 x2)

这个问题主要出在 psutil 模块对 OpenVZ 系统的不完全支持,目前我提交的修复性 Pull Request 已经被合并,而且新版本也已经发布,所以只要把 Amplify Agent 所使用的 psutil 模块替换成最新的版本就可以了。

找到 Amplify Agent 的程序包位置(我的是 /usr/lib/python2.7/dist-packages/amplify),把其下的 psutil 文件夹整个删除。然后用 pip 安装最新的 psutil:pip install psutil

但是这样操作之后数据还是没有出来,我读了 Amplify 的源码发现 Amplify 不处理虚拟设备,也不会发送总 Disk 统计。然而 OpenVZ 的所有 Disk 一般都是虚拟设备,这也就导致没有任何有关 Disk 的数据被发送,所以我们还需要修改 amplify/agent/collectors/system/metrics.py 文件。

disk_io_counters() 函数定义下修改:

1
2
3
4
5
6
7
8
9
10
146         for disk, io in disk_counters.iteritems():
147 # do not process virtual devices
148 disk_is_physical = False
149 for real_dev_name in real_block_devs:
150 if disk.startswith(real_dev_name):
151 disk_is_physical = True
152+
153+ if disk == 'ploop14245': # 这里改成你的块设备的名字(可以在 /sys/block/ 下查看)
154+ disk_is_physical = True
155+

修改之后重启 Amplify Agent:

1
$ sudo service amplify-agent restart

稍等一会儿在 Nginx Amplify 页面上的 System 分页就可以看到 Disk I/O 等 Metrics 出现啦。


写在后面的话

这次的捉虫子经历对于我一个 Linux 小白来说,真的是精疲力竭。尤其是我还在旅途中,大部分时间只能用着手机连上服务器的 SSH 进行调试和查看 log。

这次捉虫子也让我学到了很多吧。有点打算去看看 Linux 内核相关的东西了。

给你们看看当时我在空间里的吐槽orz:

一开始我只是因为懒 想找个 nginx 图形化管理配置的面板
然后没找到但是看到了 amplify 一个可以分析配置的面板
然后果断安装但是一直有磁盘数据出不来
然后看官方文档说是权限问题 然后以 root 运行还是没用
然后去看源码 发现是psutil问题
然后去看 psutil 源码 发现是 openvz 架构不存在 /proc/diskstats
然后去服务商提工单 对面表示爱莫能助 要么加钱
然后去 psutil 提 issue 对面表示 pr is welcomed 也就是说希望你自己搞定并且贡献给开源社会
然后去查能不能伪造一个 /proc/diskstats 说在 /proc 下写文件需要写内核驱动
然后就开始研究 linux 内核驱动
…………………………
我真的一开始只是因为懒啊…


好啦这个长满荒草的博客或许终于又要开始更新啦。汇报一下最近可能的 bloggin 吧。最近正在肝一个 self-host 的评论系统 Alanine,采用了阿里的 eggjs 框架,因为实在找不到好用的评论系统,然后所以最近可能会写一点开发时踩的坑什么的。然后呢 SICP 系列或许可能真的应该要开始更新了吧。然后 NexT 这边的话,Leancloud Counter 还是有一大堆问题,半个月前重构了代码换用 REST API,但还是感觉配置过程太繁琐,不够优雅,所以最近可能会把插件重新写一遍,争取都能做到自动配置。


顺便说一声,博客的评论因为没有提醒所以万年不看。微博私信知乎私信同理。如果有事找我,请邮箱。


录了上科大,也马上 18 了。

安好。


LEAFERx

2018年8月18日

写于赛里木湖畔,新疆

如果这篇文章对你有帮助,那么不妨?
0%