https://www.shiyanlou.com/courses/1403
Linux 命令
查看目录中的内容:ls
查看所有文件
$ ls -a
进入目录:cd
输入cd ..可以回到上一级目录,类似 Windows 的「向上」。
$ cd ..
cd -表示回到上一次所在的目录,类似 Windows 的「后退」。
$ cd -
cd ~表示回到当前用户的主目录,类似 Windows 的「回到桌面」。
$ cd ~
cd /表示进入根目录,它是一切目录的父目录
$ cd /
查看目录结构:tree [文件夹名]
获取当前目录的绝对路径:pwd
新建目录:mkdir [文件夹名]
新建空白文件:touch [文件名]
复制文件:cp [需要复制的文件] [复制到的地址]
复制目录:cp -r [需要复制的文件夹] [复制到的地址]
删除文件:rm [文件名]
删除文件夹:rm -r [文件夹名]
移动文件/目录与重命名:mv[需要复制的文件/文件夹] [复制到的地址]
将文件中的内容打印到屏幕上:cat 文件路径
带行号地打印文件内容:cat -b 文件路径
获取帮助:man [具体命令] 按q退出man
查看帮助文档:[具体命令] —help

部署Nginx Web服务器
什么是 Web 服务器
我们使用浏览器访问网站的时候,网站所在的服务器上就需要运行一个称为Web 服务器的软件。在浏览器中显示的各种页面,都是通过这个软件发送给我们的。
Nginx 是一种很流行的 Web 服务器软件,具备高性能、高扩展性、高可靠性、低内存消耗等优势。
Nginx 是一个 高性能的代理服务器,能够反向代理HTTP、HTTPS、SMTP、POP3、IMAP,也可以作为一个负载均衡器和 HTTP 缓存。同时,它还是一个免费的、开源的、高性能的 HTTP 服务器。
Nginx 以其高性能、稳定性、丰富的特性、以及简单配置和低资源消耗而著称。 Nginx 是由Igor Sysoev开发设计来供俄罗斯的大型门户网站和搜索引擎 Rambler 的使用。此软件在 BSD-like 协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,和 Microsoft Windows 等操作系统中运行。
与传统的服务器不同,Nginx 不依赖线程来处理请求。 相反,它使用了一个更具可扩展性的事件驱动(异步)体系结构。这种体系结构使用较小的内存量,但更重要的是,内存的使用量在有负载的时候更加可预测。即使你不希望同时处理数千个请求,但仍然可以从 Nginx 的高性能和小内存占用中受益。Nginx 在所有方向都可以扩展:从最小的 VPS(Virtual Private Servers)到大型的服务器集群。
启动nginx:sudo service nginx start
查询nginx运行状态:sudo service nginx status
查询nginx版本信息:nginx -v nginx -V
格式化查询输出:nginx -V 2>&1 | sed ‘s/ /\n/g’
配置文件
Nginx 及其模块的工作方式是在配置文件中确定的,默认的配置文件(nginx.conf)存放在目录/etc/nginx下。
可以使用下面的命令来查看默认配置文件。
$ cat /etc/nginx/nginx.conf
内容看上去比较多,但好像很多以#开头的行(其实是注释),为了看起来更舒服,可以采用下面的方式不显示注释和空白行。
$ cat /etc/nginx/nginx.conf | grep -vE "#|^$"
grep 去除了带#的行和^$(即空白行)。同样的,我们不用关心 grep 命令的用法,只需要关心输出是否变得易读。
最后,只剩下了下面的内容:

注意到倒数第二行和倒数第三行的include,它表示将/etc/nginx/conf.d/目录下以.conf结尾的文件和目录/etc/nginx/site-enabled/下的所有文件直接包含进来。你可以理解为将文件的内容直接复制到这里(即/etc/nginx/nginx.con中)。
比如我在/etc/nginx/conf.d/目录中有一个test.conf,它的内容是:
server {#...}
那么这些内容将替换include /etc/nginx/conf.d/*.conf。nginx.conf的内容,相当于:
#...http {#...gzip on;gzip_disable "msie6"server {#...}include /etc/nginx/sites-enabled/*;}
一般来说,Nginx 的配置文件的结构可以抽象成如下示意图:

Main就是我们的配置文件,配置文件中的events{...}对应Events,http{...}对应Http。
在nginx.conf中是不是没有发现定义的server {}?
原因是:为了方便维护我们 server 相关配置,不会让某一个配置文件过于庞大。通常是将所有的虚拟主机配置文件(也就是 server 配置块的内容)存放在/etc/nginx/conf.d/或者/etc/nginx/sites-enabled/目录中,在主配置文件中已经默认声明了会读取这两个文件夹下所有*.conf文件。
在我们实际的使用中,主要也是配置 server 块的内容,接下来,让我们通过例子来学习它吧~
server 和 location
💡 server 配置块
一个典型、完整的静态 Web 服务器还会包含多个 server 配置块,例如/etc/nginx/sites-enabled/default。
我们查看它的方式可以参考之前查看 nginx.conf 的方式。
$ cd /etc/nginx/sites-enabled/$ cat ./default | grep -vE "#|^$"
文件的内容如下:

文件中的配置含义在下面的注释中(以#开头)。
# 虚拟主机的配置server {# 侦听 80 端口,分别配置了 IPv4 和 IPv6listen 80 default_server;listen [::]:80 default_server ipv6only=on;# 定义服务器的默认网站根目录位置root /usr/share/nginx/html;# 定义主页的文件名index index.html index.htm;# 定义虚拟服务器的名称server_name localhost;# location 块location / {try_files $uri $uri/ =404;}}
在配置文件中可以看到,如果我们想修改 Server 的端口为 8080,那么就可以修改listen 80为listen 8080。访问网站的时候应该是网站:8080,其中:8080表示访问 8080 端口。如果是 80 端口,可以省略不写。
如果我们想更改网站文件存放的位置,修改root就可以了。
要注意:各个指令都是以分号结尾的!!!记住这一点可以让你快速找出 “让实验楼网站恢复” 挑战中的错误。
💡 location 配置块
其中 location 用于匹配请求的 URI。
URI 表示的是访问路径,除域名和协议以外的内容,比如说我访问了https://www.shiyanlou.com/louplus/linux,https://是协议,www.shiyanlou.com是域名,/louplus/linux是 URI。
location 匹配的方式有多种:
- 精准匹配
- 忽略大小写的正则匹配
- 大小写敏感的正则匹配
- 前半部分匹配
其语法如下:
location [ = | ~ | ~* | ^~ ] pattern {# ......# ......}
其中各个符号的含义:
=:用于精准匹配,想请求的 URI 与 pattern 表达式完全匹配的时候才会执行 location 中的操作~:用于区分大小写的正则匹配;~*:用于不区分大小写的正则匹配;^~:用于匹配 URI 的前半部分;
我们以这样的实例来进一步理解:
location = / {# [ 配置 A ]}location / {# [ 配置 B ]}location /documents/ {# [ 配置 C ]}location ^~ /images/ {# [ 配置 D ]}location ~* \.(gif|jpg|jpeg)$ {# [ 配置 E ]}
- 当访问
www.shiyanlou.com时,请求访问的是/,所以将与配置 A 匹配; - 当访问
www.shiyanlou.com/test.html时,请求将与配置 B 匹配; - 当访问
www.shiyanlou.com/documents/document.html时,请求将匹配配置 C; - 当访问
www.shiyanlou.com/images/1.gif请求将匹配配置 D; - 当访问
www.shiyanlou.com/docs/1.jpg请求将匹配配置 E。
当一个 URI 能够同时配被多 location 匹配的时候,则按顺序被第一个 location 所匹配。
在 location 中处理请求的方式有很多,如上文中的try_files $uri $uri/ =404;,它是一种特别常用的写法。
我们来分析一下try_files $uri $uri/ =404;。这里假设我定义的root为/usr/share/nginx/html/,访问的 URI 是/hello/shiyanlou。
- 第一步:当 URI 被匹配后,会先查找
/usr/share/nginx/html//hello/shiyanlou这个文件是否存在,如果存在则返回,不存在进入下一步。 - 第二步:查找
/usr/share/nginx/html//hello/shiyanlou/目录是否存在,如果存在,按index指定的文件名进行查找,比如index.html,如果存在则返回,不存在就进入下一步。 - 第三步:返回 404 Not Found。
尝试创建虚拟服务器
看了这么多,我们也来尝试创建一个虚拟服务器。
💡 准备一下网站文件
首先,我们确定一下网站文件存放在哪里,想来想去,最终决定放在/var/myweb/。
先使用下面命令创建网站根目录:
$ sudo mkdir /var/myweb/
然后我们需要创建一个index.html
$ cd /var/myweb/$ sudo touch index.html
使用 Vim 编辑器编辑文件。
$ sudo vim index.html
按i键进入插入模式。
键入下面的内容:
<html><head><title>my website</title></head><body><h1>Hello, Shiyanlou!</h1></body></html>
编辑完成后,先按 ECS 键(一般在键盘的左上角),然后在按:键(键盘上对应为 Shift +;)进入到末行模式,再输入wq即保存并退出。编辑工作完成。
下面给出了整个过程的演示:

💡 开始配置
准备工作就完成了,接下来需要编辑 Nginx 配置文件,这里我们为了不影响原来的配置文件,所以新创建一个。
$ cd /etc/nginx/sites-enabled/$ sudo touch myweb.conf
使用 Vim 编辑器编辑配置文件。
$ sudo vim myweb.conf
这里,我们监听本地 8070 端口,root 为/var/myweb/,所以需要写入的内容如下:
server {listen 8070 default_server;root /var/myweb/;index index.html index.htm;server_name localhost;location / {try_files $uri $uri/ =404;}}
可以参考下图进行操作:

在重启 Nginx 使配置文件生效之前,我们还应检查一下是否有语法错误:
$ sudo nginx -t
当看到 OK 字样后,再重新启动 Nginx
$ sudo service nginx restart

最后,打开 Web 浏览器输入localhost:8070看一下结果吧,是不是有点小激动!
真正的工作者
Nginx 的架构是以高度模块化为设计的基础,除了非常少量的核心代码,其他的一切皆是模块,高度抽象的模块接口,结构的设计简单,使得 Nginx 十分的灵活与高效,默认情况下只会加载默认、必须的模块,其他的一些功能实现需要加载一些第三方的模块。
而配置文件中的各个指令配置项其实便是对模块的一个功能配置。
这里我们以 Nginx 中的 stub_status 模块为例子,它主要用于查看 Nginx 的一些状态信息。它能显示一个状态页,对于想了解 Nginx 的状态以及监控 Nginx 非常有帮助。
为了后续的 zabbix 监控,我们需要学习一下如何对它进行配置。
💡 启用状态页
同样的新建一个 conf 文件
$ cd /etc/nginx/sites-enabled/$ sudo touch status.conf
使用 Vim 编辑器进行编辑。
$ sudo vim status.conf
键入下面的内容:
server {listen 8080 default_server;server_name localhost;location /nginx_status {stub_status on;}}
它表示监听 8080 端口,对于 URI/nginx_status,我们启用模块stub_status进行响应。

💡 重启 Nginx
在重启 Nginx 使配置文件生效之前,我们还应检查一下是否有语法错误:
$ sudo nginx -t
当看到 OK 字样后,再重新启动 Nginx
$ sudo service nginx restart

💡 查看 status
打开浏览器查看localhost:8080/nginx_status页面。

状态页面中一共提供了七个指标:
active connections– 活跃的连接数量server accepts handled requests—accepts表示总共处理了 1 个连接,handled表示成功创建 1 次握手,requests表示总共处理了 1 个请求reading— 读取客户端的连接数writing— 响应数据到客户端的数量waiting— 开启 keep-alive 的情况下,这个值等于 active – (reading+writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接
除了浏览器查看,我们还可以通过curl工具读取。
$ curl localhost:8080/nginx_status

Nginx 的学习就到此结束啦~
其实 Nginx 还是优秀的代理服务器,想深入学习 Nginx 的同学可以了解一下课程:Linux Web 运维(Nginx)实战。
Zabbix 监控平台搭建
Zabbix 是一个常用的监控软件,在 Linux 运维工作中,监控系统的搭建和维护是必不可少的一部分。
作为监控领域优秀的开源软件,Zabbix 功能齐全、图形展示功能强大、插件多,可以适用于大部分的监控需求。
Zabbix 介绍
☞ 什么是监控系统呢
指标,监控和警报都是相互关联的概念,它们共同构成了监控系统的基础。
指标代表系统中的数据,监控是收集、汇总和分析这些值的过程,用以提高对组件特征和行为的了解。
他们能够提供对系统运行状况的可见性,帮助了解系统使用或行为的趋势,并了解所做的更改的影响。如果指标超出预期范围,系统可以发送通知以提示操作员查看,然后可以提供帮助信息以确定可能的原因。
☞ 关于 Zabbix
Zabbix 是一个基于 Web 界面的企业级的分布式开源监控软件。它可以对各种网络参数以及服务器的健康性和完整性进行监控,保证系统的安全运行。

下面的图中罗列了 Zabbix 可以监控的内容:Network(网络)、Server(服务器)、Cloud(云资源)、Application(应用)、Services(服务)。

最重要的是:它的源代码免费发行,可供公众任意使用。你可以从它的官网了解更多信息:https://www.zabbix.com/。
Zabbix 的组成
Zabbix 由以下几个主要软件组件构成:
- Server
- 存储数据库
- Web 界面
- Agent 监控代理
💡 服务端

核心部分包括 Server 、Web 前端 和 存储数据库。
Zabbix server 是监控代理程序、报告系统可用性、系统完整性和统计信息的核心组件。
Zabbix 使用数据库(例如 MySQL)来存储数据,所有配置信息和 Zabbix 收集到的数据都被存储在数据库中。由图中的结构可知,Web GUI 和 Server 都要与数据库交互,因此两者都要配置数据库相关的信息,这在本实验后面的部分中会介绍到。
Zabbix 的前端使用 Web 界面。用户可以直接通过 web 界面和 Zabbix 进行交互。
💡 Agent
Zabbix Agent 监控代理部署在监控目标上,能够主动监控本地资源和应用程序,并将收集到的数据报告给 Zabbix Server,完成信息的收集。
Zabbix 除了这些组件之外,可选的组件还有:Zabbix Proxy、Zabbix_Java_Gateway 等等。本实验着重介绍最基础的一种 Zabbix 监控架构。
搭建 Zabbix 监控环境
现在我们开始在实验环境中实践部署一个 Zabbix 监控平台。
搭建 Zabbix 监控平台有三个关键:界面、服务器和数据库。
它们是可以安装在同一台服务器上(本实验即采用这种方式)。但是如果你拥有一个更大更复杂的环境,将它们安装在不同的主机上也是一个选择。
准备工作
下载配置包,该软件包包含了 apt(软件包管理器)配置文件,它给出了 zabbix 的源。
# 确保当前工作路径在家目录$ cd ~# 下载安装包$ wget https://labfile.oss.aliyuncs.com/courses/1403/zabbix-4.0-xenial_all.deb

使用 dpkg 进行安装:
$ sudo dpkg -i zabbix-4.0-xenial_all.deb

修改安装源为阿里云
$ sudo vim /etc/apt/sources.list.d/zabbix.list # 将自带的源注释掉,换成阿里云的deb http://mirrors.cloud.aliyuncs.com/zabbix/zabbix/4.0/ubuntu xenial maindeb-src http://mirrors.cloud.aliyuncs.com/zabbix/zabbix/4.0/ubuntu xenial main
然后获取 key:
curl -o - "http://mirrors.cloud.aliyuncs.com/zabbix/zabbix-official-repo.key" | sudo apt-key add -
最后,更新一下源:
$ sudo apt-get update

服务器与界面

启动 MySQL
在实验楼的环境中,我们已经安装好了 MySQL,因此用户不需要进行操作。
使用 service 命令就可以启动 MySQL
$ sudo service mysql start

环境中的 MySQL 无需密码就可以登录。因此登录 MySQL 的方式非常简单,只需要使用-u指定用户名就可以了,这里使用root用户。
$ mysql -u root

登录之后不要退出,接下来的步骤需要在 MySQL 命令行中进行。
创建数据库和用户
我们需要在 MySQL 上创建 Zabbix 初始化数据库和用户。需要注意的是,数据库名和用户名都是zabbix。
在上一个步骤中,我们已经登录到 MySQL 了。
创建一个名叫zabbix的数据库,字符集设置为 utf8。
CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;

创建数据库之后,默认是没有任何表的,可以使用下面的命令先切换数据库:
USE zabbix;

然后查看所有的表:
SHOW TABLES;

从结果可以看出,数据库中没有任何的表和数据。
这是一个授权的操作,意为允许用户 zabbix 从 localhost 的主机连接到 mysql 服务器的 zabbix 数据库,并使用zabbixPSWD作为密码。
GRANT ALL PRIVILEGES ON zabbix.*TO zabbix@localhostIDENTIFIED BY 'zabbixPSWD';

修改完成后,我们输入quit;再按回车就可以退出 MySQL 命令行,回到我们的终端命令行了。
quit;

导入数据
还记得刚刚的操作SHOW TABLES;吗?它的作用是查看数据库中的所有表,zabbix 数据库创建之后是没有表的。
但是使用了如下命令导入数据之后,zabbix 数据库就会有表和数据。
使用 zcat 初始化查看其中数据,通过 zabbix 用户初始化名为 zabbix 的数据库。
$ zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | \mysql -uzabbix -pzabbixPSWD zabbix
注意:当输入\之后,命令就可以换行输入,避免一行命令太长。这里 mysql 命令的-u与root连写,及后面的-p与密码连写,都是为了防止 MySQL 无法识别。

数据的导入需要一定的时间,用户需要耐心等待命令执行完成。
接下来,我们使用刚刚创建的 zabbix 用户进行登录。
$ mysql -uzabbix -pzabbixPSWD

查看所有的数据库。我们会发现,有一个 zabbix 数据库。
SHOW DATABASES;

切换数据库
USE zabbix;

可以看到 zabbix 数据库已经导入了表。
SHOW TABLES;

使用下面的命令可以查看 users 表中的 1 行数据(一个记录)。表中已经导入了数据。
SELECT * FROM users LIMIT 1;
由于终端窗口的大小原因,显示不是很美观,但证明了表中是有数据的。

操作完成后,我们输入quit;再按回车退出 MySQL 命令行。
quit;

修改 Zabbix Server 的配置
在 zabbix_server.conf 中编辑数据库配置,这里我们使用 Vim 编辑器。
$ sudo vim /etc/zabbix/zabbix_server.conf

首先找到关于 DBHost 的配置。
DBHost=localhost
这里默认已经配置了数据库的地址为 localhost,所以不需要进行更改。

DBName=zabbixDBUser=zabbix
这两行是配置数据库的名字和用户名。因为我们创建的用户和数据库都是同名的,因此也不需要更改。

最后是配置登录 zabbix 用户的密码。
DBPassword=zabbixPSWD
注:zabbixPSWD 是 MySQL 的 Zabbix 数据库密码。

编辑完成后,保存并退出。

启动 Zabbix Server
$ sudo service zabbix-server start

Zabbix 前端配置
需要先使用下面的命令启动一下 Apache2
$ sudo service apache2 start

虽然有一个报错,但是 Apache 也是启动成功了的。可以用下面的命令查看它的状态。
$ sudo service apache2 status

在进行修改之前,我们先确定一下 PHP 的版本。
$ php -v
注意:这里是小写的 v。

经过确认,是 PHP 7.0,我们还需要安装 PHP 与 Apache 通信的库。
$ sudo apt-get install libapache2-mod-php7.0

然后,我们开始动手修改配置文件吧!Zabbix 前端的 Apache 配置文件位于/etc/apache2/conf-enabled/zabbix.conf,使用下面的命令调用 Vim 编辑器进行编辑。
$ sudo vim /etc/apache2/conf-enabled/zabbix.conf

这里我们设置时区为Asia/Shanghai,注意是修改 php 7 的!

编辑完成后,保存并退出。

前端配置完成后,需要重新启动 Apache Web 服务器:
$ sudo service apache2 restart

与刚刚一样的报错,可以忽略掉。
初始化 Zabbix
Zabbix 前端可以在浏览器中通过http://localhost/zabbix进行访问。在浏览页面中大家按照提示框一步一步进行 zabbix 初始安装。步骤如下:
☞ 步骤(1)左边红色框中是前端登录界面的步骤,选择右下角的Next step按钮。

☞ 步骤(2)然后是一些先决条件,可以看到我们之前配置的date.timezone显示的是Asia/Shanghai。

☞ 步骤(3) 接着是连接 DB 数据库,需要输入之前设定的数据库密码(Tips:如果按照文档进行,密码为zabbixPSWD)。

☞ 步骤(4)之后是一些服务细节的确认(默认设置即可),看到这个界面就表示成功了,点击:finish。

☞ 步骤(5)下面这个页面就是zabbix的登录页面,默认登录名是Admin和密码是zabbix。

☞ 步骤(6) 登录成功后就进入到zabbix的监控界面。

注意圈出来的部分,它说明 Server 运行正常。如果你搭建的 zabbix 状态显示的是no说明配置没有成功,需要检查一下是否有步骤遗漏。
让界面更加友好
是不是感觉英文的 Zabbix 有点不太友好?没关系,它是可以设置为中文的。
首先点击由右上角用户图标。

点击之后就会进入到用户的配置界面,点击 Language 就可以切换语言,选择 Chinese 就能调整为中文。切换语言之后需要点击 Update 才能生效。

完整的示范一下操作过程:

开始使用 Zabbix
Zabbix 的核心部分已经部署完成了,接下来还需要在 Zabbix 中添加 Agent 主机和主机群组。
本地的主机既是 Server 也是被监控端,所以还需要安装 Agent:
$ sudo apt-get install -y zabbix-agent

启动 Zabbi Agent 的方式如下。
$ sudo service zabbix-agent start
添加主机
回到 Zabbix 的 Web GUI,我们开始添加一个 Agent 到 Server 中。
点击顶部的 “配置” -> “主机”

然后点击 “创建主机”

按照下图中圈出来的部分依次填写主机的信息,其他信息我们暂时用不到,可以不用管。

确认一下加密一栏中是 “非加密”。确定了之后就可以点击添加。

这样,本地的 Agent 就添加到 Zabbix Server 中了。
添加主机组
刚刚我们将主机添加到了 Linux Server 和 Zabbix Server 这两个组。现在我们创建一个自定义的主机群组,并把Host_Shiyanlou主机添加进去。
如下图所示,点击 “主机群组” 之后,再点击 “创建主机群组”。
填写群组名。

点击添加之后就创建完成了。

接下来,我们将主机添加到这个主机群组中。先点击顶部的 “主机”,再点击Host_shiyanlou(我们自己创建的主机)。

进入到配置页面之后就可以修改它的主机群组了。如下图进行操作,先点击群组的选择按钮,添加到Shiyanlou HostGroup,再下拉页面点击更新。

至此,一个完整的 zabbix 平台搭建就完成了,在下一节中将继续给大家讲解如何去使用 zabbix。此环境大家记得保存下来,避免在下一节实验中重新安装和配置。
Zabbix 监控 Nginx Web 服务
配置 Nginx 状态页面
在第二个实验部署 Nginx Web 服务器实验中,我们已经学会了 Nginx 的基本使用方式和开启状态页面的方式,本部分是对之前内容的回顾。
Nginx 的配置主要包括两个部分,一是修改默认端口,二是配置状态页。
💡 修改默认端口
由于实验中的 Apache2 要使用 80 端口,而 Nginx 的默认端口也是 80,所以我们需要将 Nginx 的 default 配置修改为 80 端口以外的其他端口。
首先,实验楼环境下已经安装了 Nginx,可以查看下本实验环境下的 Nginx 版本和配置参数信息等。
$ sudo vim /etc/nginx/sites-enabled/default
将里面的 80 全部替换掉,主要就是 listen 的那个配置项改成 8090 这个端口或者其他没有用的端口即可。
注意:8080 端口需要配置开启状态页,所以不能使用。

💡 配置状态页
和之前的方式一样,新建一个 conf 文件
$ cd /etc/nginx/sites-enabled/$ sudo touch status.conf
使用 Vim 编辑器进行编辑。
$ sudo vim status.conf
键入下面的内容:
server {listen 8080 default_server;server_name localhost;location /nginx_status {stub_status on;}}
它表示监听 8080 端口,对于 URI/nginx_status,我们启用模块stub_status进行响应。

💡 重新启动 nginx
先检查一下是否有语法错误:
$ sudo nginx -t
当看到 OK 字样后,再重新启动 Nginx
$ sudo service nginx restart

💡 查看状态页
通过curl工具读取状态页的内容。
$ curl localhost:8080/nginx_status

启动实验环境
如果你没有使用保存的实验环境,需要先参考上一节实验的文档进行安装和配置。
如果是使用保存的环境,那么需要启动一下相关的服务。
$ sudo service zabbix-server start$ sudo service zabbix-agent start$ sudo service apache2 start$ sudo service mysql start

Shell 脚本入门
因为接下来对 Agent 的配置需要一定的 Shell 知识,所以在这里补充一下。但作为入门课程,我们不会详细地讲解 Shell 脚本的方方面面。
我们可以把 Shell 脚本看做很多命令的集合,它会按照我们规定的顺序执行这些命令。
💡 简单的尝试
首先,我们使用 touch 命令来创建一个 Shell 脚本。
$ cd ~$ touch test1.sh
然后使用 Vim 来编辑它:
$ vim test1.sh
写入下面的内容
#!/bin/bashecho "hello,shiyanlou1"echo "My Fist Script"
在终端中输入下面的命令来执行我们编写的脚本
$ /bin/bash test1.sh
完整的演示:

💡 变量
和第一个脚本采用的方式相同,先touch test2.sh,再调用vim test2.sh进行编辑。输入的脚本内容如下:
#!/bin/bashhello="hello,shiyanlou2"echo $hello
它定义了一个变量hello,它的值为hello,shiyanlou2,最后我们打印了这个变量的值。当一个相同的值被多次使用时,定义变量是最好的方式,因为只需修改变量的值,所有引用变量值的地方就都被修改啦~
注意:=的前后不能有空格。
使用下面的命令进行执行。
$ /bin/bash test2.sh

💡 传入参数
变量的值是被写入到文件中,如果我们想根据命令的不同来让脚本有不同的行为,就必须采用传入参数的方式。
让我们通过实战来了解一下如何传入参数。新建一个test3.sh,写入下面的内容。
#!/bin/bashecho $1
这里$1就是我们传入的第一个参数。
输入下面的命令执行脚本。
$ /bin/bash test3.sh "hello,shiyanlou3"
这里"hello,shiyanlou3"就是我们传入的参数,注意"(引号)是不会被打印的。
执行的结果如下:

💡 函数
为了使相同的工作不再重复,我们通常定义函数来将相同的操作写到一个函数中,比如下面的代码中就定义了一个名为hello的函数。
#!/bin/bashfunction hello {echo "hello,shiyanlou4"}$1
只定义一个函数是不会进行任何操作的,我们必须要调用函数,这样它才会执行。当我们调用函数时,它就会执行函数体中的内容,这里的函数体是echo "hello,shiyanlou4"。
为什么最后有$1呢?这其实是我们调用函数的方式,不过这里我们从命令行传入要调用的函数。如果我们执行的命令为/bin/bash test4.sh hello,那么脚本就相当于:
#!/bin/bashfunction hello {echo "hello,shiyanlou4"}hello
这里直接写hello就意味着调用hello函数。
创建一个test4.sh来看一下结果吧 ~

配置 Agent
💡 添加自定义参数
在前面的学习中我们知道对服务的监控需要通过 Agent 去采集数据,所以下面就该对 Agent 进行配置。
在/etc/zabbix/zabbix_agentd.conf配置文件中添加自定义参数,让 Agent 使用脚本来采集 Nginx 的数据,然后发送给 server。
$ sudo vim /etc/zabbix/zabbix_agentd.conf
需要在末尾添加的内容如下:
UserParameter=nginx.status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh $1
这里我们添加一个自定义的UserParameter。我们详细讲解一下自定义参数的含义。
有时候我们想让被监控端执行一个 Zabbix 没有预定义的检测,Zabbix 的用户自定义参数功能提供了这个方法。
其语法规范为:
UserParameter=key,command
key使我们定义的参数,它必须是唯一的,[*]表示里面可以传递多个参数。
如果 Zabbix 调用 key,就会执行对应的 command(命令)。比如这里我们调用的 key 为nginx.status['active'],那么执行的命令为:/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh active,这里的$1会被替换为 key 中传入的第一个参数。

配置完成,重启一下 Zabbix Agent 服务。
$ sudo service zabbix-agent restart

💡 采集脚本
接着我们来编写下用于采集数据的信息的脚本
$ sudo vim /etc/zabbix/zabbix_agentd.d/nginx_status.sh
脚本的内容如下,它定义了许多 Shell 函数,是用来采集信息的关键。脚本的结构非常简单,定义了一些变量用来记录一些函数公用的值。
每个函数的内容都是相似的,比如/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'。看起来非常长,但是仔细一分析你会发现这个命令并不复杂。curl从一个链接"http://$HOST:$PORT/nginx_status"(即我们的 Nginx 状态页)获取数据,然后传递给 grep 筛选,而我们最终只需要它的值(即对应的项的数值),所以又交给awk进行处理。
awk是一个常用的文本处理器,它的用法已经多到可以单独谢一本书。限于篇幅,这里我们不进行展开讲解,只需要知道它的功能就是获取对应监控项的值就可以了。
在函数的最后,我们使用$1来获取要执行的函数(在 Shell 脚本入门一小节中我们已经讲解过了,这里就不再重复它的作用)。
#!/bin/bash# 设置变量BKUP_DATE=`/bin/date +%Y%m%d`LOG="/data/log/zabbix/webstatus.log"HOST=127.0.0.1 # 确保 CURL 能访问这个主机的 IP 地址PORT="8080" # 端口号# 编写函数用于获取 nginx 的统计信息function active {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'}function reading {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Reading' | awk '{print $2}'}function writing {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Writing' | awk '{print $4}'}function waiting {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'}function accepts {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $1}'}function handled {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $2}'}function requests {/usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $3}'}$1
添加脚本的过程和 Shell 脚本入门一小节中是相似的。可以参考下面的演示 ↓

添加好采集脚本之后,需要再次重新启动一下 Zabbix Agent。
$ sudo service zabbix-agent restart
测试数据采集
Zabbix Agent 监控代理获取(采集)数据可以通过zabbix_get进程来取得。可以用zabbix-get来测试一下数据的采集是否成功。
这里我们需要安装一下zabbix-get这个软件包。
$ sudo apt-get install zabbix-get

测试的命令如下:
$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[accepts]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[handled]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[requests]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[reading]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[writing]'$ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[waiting]'
-s: 指定客户端主机名或者 IP 。由于是采集本机的数据,可以使用回环地址127.0.0.1或者localhost。
-k: 你想获取的 key 。这里的 Key 是之前在UserParameter中定义的。
返回一个数据则表示配置成功,如下是测试结果,你得到的值不一定与图片中的相同。

Zabbix 监控配置
💡 配置流程
下面就是 Zabbix 监控系统的配置步骤。
大体的流程是:
- (1)添加要监控的 Agent(这一步骤在上一个实验中已经完成,如果你没有使用保存的环境,就需要重新进行配置)。
- (2)给主机添加监控项,即我们想要监控的指标。
- (3)将我们监控项按组划分为两个图形。
- (4)将图形汇总到一个聚合图形上。
💡 指标分组
在开始进行配置之前,我们先将七个指标进行分组。
回顾一下,之前nginx_status的七个指标:
active connections– 活跃的连接数量server accepts handled requests—accepts表示总共处理的连接数,handled表示成功创建握手的次数,requests表示总共处理的请求数reading— 读取客户端的连接数writing— 响应数据到客户端的数量waiting— Nginx 已经处理完正在等候下一次请求指令的驻留连接数
我们将其分为两个组
- 与连接相关的:
active、reading、writing、waiting - 与处理请求相关的:
accepts、handled、requests
创建监控项
首先打开浏览器,在地址栏输入localhost/zabbix进入 Zabbix 的前端。
依次点击顶部的 “配置” → “主机” → “监控项”。

点击之后进入到监控项页面,点击右上角的 “创建监控项” 按钮。

接下来,我们要分别为 7 个指标添加监控项。创建监控项的方式都是大同小异的,我们只会详细的讲解nginx.accepts的配置,其他的配置与其是相似的。
💡 创建与连接相关的监控项
nginx.accepts
我们需要填写监控项的名字:nginx.accepts。然后要填写键值nginx.status[accepts]。更新时间改为1s。

填写好以后,下拉页面到底部保存。

- nginx.handled
添加监控项nginx.handled:填写监控项的名字:nginx.handled。然后要填写键值nginx.status[handled]。更新时间改为1s。

- nginx.requests
添加监控项nginx.requests:填写监控项的名字:nginx.requests。然后要填写键值nginx.status[requests]。更新时间改为1s。

💡 创建与处理请求相关的监控项
- nginx.active
添加监控项nginx.active:填写监控项的名字:nginx.active。然后要填写键值nginx.status[active]。更新时间改为1s。

- nginx.reading
添加监控项nginx.reading:填写监控项的名字:nginx.reading。然后要填写键值nginx.status[reading]。更新时间改为1s。

- nginx.writing
添加监控项nginx.writing:填写监控项的名字:nginx.writing。然后要填写键值nginx.status[writing]。更新时间改为1s。

- nginx.waiting
添加监控项nginx.waiting:填写监控项的名字:nginx.waiting。然后要填写键值nginx.status[waiting]。更新时间改为1s。

配置完成后,状态栏显示是已启动,如下图:

这表明我们添加的监控项已经成功启用。
创建图形
接下来,我们需要为两组监控项分别创建图形。
如下图,点击 “图形”,再点击 “创建图形”。

我们需要依次创建两个图形:nginx_connect和nginx_interact。
- 💡 nginx_connect
填写图形的名称为nginx_connect,然后将监控项添加到图形中。

添加监控项的方式如下。注意我们要添加的监控项为nginx.accepts、nginx.handled、nginx.requests
添加完成后,点击底部的 “添加” 按钮。

- 💡 nginx_interact
nginx_interact 的配置方式与 nginx_connect 是相似的。要注意:图形命名为nginx_interact;需要添加的监控项为:nginx.active、nginx.reading、nginx.writing、nginx.waiting。

创建聚合图形
依次点击顶部的 “监测中” → “聚合图形”,再点击 “创建聚合图形”。

创建一个名为Nginx Status的聚合图形,配置为 1 列 2 行。配置完成后,点击 “添加” 按钮。

选择 “构造函数” 就会进入到配置界面,将之前的两个图形添加到聚合图形中。

点击更改就可以选择要添加的图形。

添加图形的操作方式如下:

同样的方式添加另外一个图形。

再次回到聚合图形的界面,点击Nginx Status(即聚合图形的名字)。

点击之后就能看到我们的监控数据。

配置 Zabbix 监控 Nginx 的实验到此就结束了。

