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 和 IPv6
listen 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 main
deb-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@localhost
IDENTIFIED 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=zabbix
DBUser=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/bash
echo "hello,shiyanlou1"
echo "My Fist Script"
在终端中输入下面的命令来执行我们编写的脚本
$ /bin/bash test1.sh
完整的演示:
💡 变量
和第一个脚本采用的方式相同,先touch test2.sh
,再调用vim test2.sh
进行编辑。输入的脚本内容如下:
#!/bin/bash
hello="hello,shiyanlou2"
echo $hello
它定义了一个变量hello
,它的值为hello,shiyanlou2
,最后我们打印了这个变量的值。当一个相同的值被多次使用时,定义变量是最好的方式,因为只需修改变量的值,所有引用变量值的地方就都被修改啦~
注意:=
的前后不能有空格。
使用下面的命令进行执行。
$ /bin/bash test2.sh
💡 传入参数
变量的值是被写入到文件中,如果我们想根据命令的不同来让脚本有不同的行为,就必须采用传入参数的方式。
让我们通过实战来了解一下如何传入参数。新建一个test3.sh
,写入下面的内容。
#!/bin/bash
echo $1
这里$1
就是我们传入的第一个参数。
输入下面的命令执行脚本。
$ /bin/bash test3.sh "hello,shiyanlou3"
这里"hello,shiyanlou3"
就是我们传入的参数,注意"
(引号)是不会被打印的。
执行的结果如下:
💡 函数
为了使相同的工作不再重复,我们通常定义函数来将相同的操作写到一个函数中,比如下面的代码中就定义了一个名为hello
的函数。
#!/bin/bash
function hello {
echo "hello,shiyanlou4"
}
$1
只定义一个函数是不会进行任何操作的,我们必须要调用函数,这样它才会执行。当我们调用函数时,它就会执行函数体中的内容,这里的函数体是echo "hello,shiyanlou4"
。
为什么最后有$1
呢?这其实是我们调用函数的方式,不过这里我们从命令行传入要调用的函数。如果我们执行的命令为/bin/bash test4.sh hello
,那么脚本就相当于:
#!/bin/bash
function 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 的实验到此就结束了。