https://www.shiyanlou.com/courses/1403

Linux 命令

查看目录中的内容:ls

查看所有文件

  1. $ ls -a

进入目录:cd

输入cd ..可以回到上一级目录,类似 Windows 的「向上」。

  1. $ cd ..

cd -表示回到上一次所在的目录,类似 Windows 的「后退」。

  1. $ cd -

cd ~表示回到当前用户的主目录,类似 Windows 的「回到桌面」。

  1. $ cd ~

cd /表示进入根目录,它是一切目录的父目录

  1. $ cd /

查看目录结构:tree [文件夹名]

获取当前目录的绝对路径:pwd

新建目录:mkdir [文件夹名]

新建空白文件:touch [文件名]

复制文件:cp [需要复制的文件] [复制到的地址]

复制目录:cp -r [需要复制的文件夹] [复制到的地址]

删除文件:rm [文件名]

删除文件夹:rm -r [文件夹名]

移动文件/目录与重命名:mv[需要复制的文件/文件夹] [复制到的地址]

将文件中的内容打印到屏幕上:cat 文件路径

带行号地打印文件内容:cat -b 文件路径

获取帮助:man [具体命令] 按q退出man

查看帮助文档:[具体命令] —help

Linux 运维新手入门课 - 图2

部署Nginx Web服务器

什么是 Web 服务器

我们使用浏览器访问网站的时候,网站所在的服务器上就需要运行一个称为Web 服务器的软件。在浏览器中显示的各种页面,都是通过这个软件发送给我们的。

Nginx 是一种很流行的 Web 服务器软件,具备高性能、高扩展性、高可靠性、低内存消耗等优势。

Nginx 是一个 高性能的代理服务器,能够反向代理HTTPHTTPSSMTPPOP3IMAP,也可以作为一个负载均衡器和 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下。

可以使用下面的命令来查看默认配置文件。

  1. $ cat /etc/nginx/nginx.conf

内容看上去比较多,但好像很多以#开头的行(其实是注释),为了看起来更舒服,可以采用下面的方式不显示注释和空白行。

  1. $ cat /etc/nginx/nginx.conf | grep -vE "#|^$"

grep 去除了带#的行和^$(即空白行)。同样的,我们不用关心 grep 命令的用法,只需要关心输出是否变得易读。
最后,只剩下了下面的内容:

Linux 运维新手入门课 - 图3

注意到倒数第二行和倒数第三行的include,它表示将/etc/nginx/conf.d/目录下以.conf结尾的文件和目录/etc/nginx/site-enabled/下的所有文件直接包含进来。你可以理解为将文件的内容直接复制到这里(即/etc/nginx/nginx.con中)。

比如我在/etc/nginx/conf.d/目录中有一个test.conf,它的内容是:

  1. server {
  2. #...
  3. }

那么这些内容将替换include /etc/nginx/conf.d/*.confnginx.conf的内容,相当于:

  1. #...
  2. http {
  3. #...
  4. gzip on;
  5. gzip_disable "msie6"
  6. server {
  7. #...
  8. }
  9. include /etc/nginx/sites-enabled/*;
  10. }

一般来说,Nginx 的配置文件的结构可以抽象成如下示意图:
Linux 运维新手入门课 - 图4

Main就是我们的配置文件,配置文件中的events{...}对应Eventshttp{...}对应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 的方式。

  1. $ cd /etc/nginx/sites-enabled/
  2. $ cat ./default | grep -vE "#|^$"

文件的内容如下:
Linux 运维新手入门课 - 图5

文件中的配置含义在下面的注释中(以#开头)。

  1. # 虚拟主机的配置
  2. server {
  3. # 侦听 80 端口,分别配置了 IPv4 和 IPv6
  4. listen 80 default_server;
  5. listen [::]:80 default_server ipv6only=on;
  6. # 定义服务器的默认网站根目录位置
  7. root /usr/share/nginx/html;
  8. # 定义主页的文件名
  9. index index.html index.htm;
  10. # 定义虚拟服务器的名称
  11. server_name localhost;
  12. # location 块
  13. location / {
  14. try_files $uri $uri/ =404;
  15. }
  16. }

在配置文件中可以看到,如果我们想修改 Server 的端口为 8080,那么就可以修改listen 80listen 8080。访问网站的时候应该是网站:8080,其中:8080表示访问 8080 端口。如果是 80 端口,可以省略不写。
如果我们想更改网站文件存放的位置,修改root就可以了。

要注意:各个指令都是以分号结尾的!!!记住这一点可以让你快速找出 “让实验楼网站恢复” 挑战中的错误。

💡 location 配置块

其中 location 用于匹配请求的 URI。

URI 表示的是访问路径,除域名和协议以外的内容,比如说我访问了https://www.shiyanlou.com/louplus/linuxhttps://是协议,www.shiyanlou.com是域名,/louplus/linux是 URI。

location 匹配的方式有多种:

  • 精准匹配
  • 忽略大小写的正则匹配
  • 大小写敏感的正则匹配
  • 前半部分匹配

其语法如下:

  1. location [ = | ~ | ~* | ^~ ] pattern {
  2. # ......
  3. # ......
  4. }

其中各个符号的含义:

  • =:用于精准匹配,想请求的 URI 与 pattern 表达式完全匹配的时候才会执行 location 中的操作
  • ~:用于区分大小写的正则匹配;
  • ~*:用于不区分大小写的正则匹配;
  • ^~:用于匹配 URI 的前半部分;

我们以这样的实例来进一步理解:

  1. location = / {
  2. # [ 配置 A ]
  3. }
  4. location / {
  5. # [ 配置 B ]
  6. }
  7. location /documents/ {
  8. # [ 配置 C ]
  9. }
  10. location ^~ /images/ {
  11. # [ 配置 D ]
  12. }
  13. location ~* \.(gif|jpg|jpeg)$ {
  14. # [ 配置 E ]
  15. }
  • 当访问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/

先使用下面命令创建网站根目录:

  1. $ sudo mkdir /var/myweb/

然后我们需要创建一个index.html

  1. $ cd /var/myweb/
  2. $ sudo touch index.html

使用 Vim 编辑器编辑文件。

  1. $ sudo vim index.html

i键进入插入模式。
键入下面的内容:

  1. <html>
  2. <head>
  3. <title>my website</title>
  4. </head>
  5. <body>
  6. <h1>Hello, Shiyanlou!</h1>
  7. </body>
  8. </html>

编辑完成后,先按 ECS 键(一般在键盘的左上角),然后在按:键(键盘上对应为 Shift +;)进入到末行模式,再输入wq即保存并退出。编辑工作完成。
下面给出了整个过程的演示:

Linux 运维新手入门课 - 图6

💡 开始配置

准备工作就完成了,接下来需要编辑 Nginx 配置文件,这里我们为了不影响原来的配置文件,所以新创建一个。

  1. $ cd /etc/nginx/sites-enabled/
  2. $ sudo touch myweb.conf

使用 Vim 编辑器编辑配置文件。

  1. $ sudo vim myweb.conf

这里,我们监听本地 8070 端口,root 为/var/myweb/,所以需要写入的内容如下:

  1. server {
  2. listen 8070 default_server;
  3. root /var/myweb/;
  4. index index.html index.htm;
  5. server_name localhost;
  6. location / {
  7. try_files $uri $uri/ =404;
  8. }
  9. }

可以参考下图进行操作:
Linux 运维新手入门课 - 图7

在重启 Nginx 使配置文件生效之前,我们还应检查一下是否有语法错误:

  1. $ sudo nginx -t

当看到 OK 字样后,再重新启动 Nginx

  1. $ sudo service nginx restart

Linux 运维新手入门课 - 图8

最后,打开 Web 浏览器输入localhost:8070看一下结果吧,是不是有点小激动!

Linux 运维新手入门课 - 图9

真正的工作者

Nginx 的架构是以高度模块化为设计的基础,除了非常少量的核心代码,其他的一切皆是模块,高度抽象的模块接口,结构的设计简单,使得 Nginx 十分的灵活与高效,默认情况下只会加载默认、必须的模块,其他的一些功能实现需要加载一些第三方的模块。

而配置文件中的各个指令配置项其实便是对模块的一个功能配置。

这里我们以 Nginx 中的 stub_status 模块为例子,它主要用于查看 Nginx 的一些状态信息。它能显示一个状态页,对于想了解 Nginx 的状态以及监控 Nginx 非常有帮助。

为了后续的 zabbix 监控,我们需要学习一下如何对它进行配置。

💡 启用状态页

同样的新建一个 conf 文件

  1. $ cd /etc/nginx/sites-enabled/
  2. $ sudo touch status.conf

使用 Vim 编辑器进行编辑。

  1. $ sudo vim status.conf

键入下面的内容:

  1. server {
  2. listen 8080 default_server;
  3. server_name localhost;
  4. location /nginx_status {
  5. stub_status on;
  6. }
  7. }

它表示监听 8080 端口,对于 URI/nginx_status,我们启用模块stub_status进行响应。
Linux 运维新手入门课 - 图10

💡 重启 Nginx

在重启 Nginx 使配置文件生效之前,我们还应检查一下是否有语法错误:

  1. $ sudo nginx -t

当看到 OK 字样后,再重新启动 Nginx

  1. $ sudo service nginx restart

Linux 运维新手入门课 - 图11

💡 查看 status

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

Linux 运维新手入门课 - 图12

状态页面中一共提供了七个指标:

  • active connections– 活跃的连接数量
  • server accepts handled requestsaccepts表示总共处理了 1 个连接,handled表示成功创建 1 次握手,requests表示总共处理了 1 个请求
  • reading— 读取客户端的连接数
  • writing— 响应数据到客户端的数量
  • waiting— 开启 keep-alive 的情况下,这个值等于 active – (reading+writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接

除了浏览器查看,我们还可以通过curl工具读取。

  1. $ curl localhost:8080/nginx_status

Linux 运维新手入门课 - 图13

Nginx 的学习就到此结束啦~

其实 Nginx 还是优秀的代理服务器,想深入学习 Nginx 的同学可以了解一下课程:Linux Web 运维(Nginx)实战

Zabbix 监控平台搭建

Zabbix 是一个常用的监控软件,在 Linux 运维工作中,监控系统的搭建和维护是必不可少的一部分。

作为监控领域优秀的开源软件,Zabbix 功能齐全、图形展示功能强大、插件多,可以适用于大部分的监控需求。

Zabbix 介绍

☞ 什么是监控系统呢

指标,监控和警报都是相互关联的概念,它们共同构成了监控系统的基础。

指标代表系统中的数据,监控是收集、汇总和分析这些值的过程,用以提高对组件特征和行为的了解。

他们能够提供对系统运行状况的可见性,帮助了解系统使用或行为的趋势,并了解所做的更改的影响。如果指标超出预期范围,系统可以发送通知以提示操作员查看,然后可以提供帮助信息以确定可能的原因。

☞ 关于 Zabbix

Zabbix 是一个基于 Web 界面的企业级的分布式开源监控软件。它可以对各种网络参数以及服务器的健康性和完整性进行监控,保证系统的安全运行。

Linux 运维新手入门课 - 图14

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

Linux 运维新手入门课 - 图15

最重要的是:它的源代码免费发行,可供公众任意使用。你可以从它的官网了解更多信息:https://www.zabbix.com/

Zabbix 的组成

Zabbix 由以下几个主要软件组件构成:

  • Server
  • 存储数据库
  • Web 界面
  • Agent 监控代理

💡 服务端

Linux 运维新手入门课 - 图16

核心部分包括 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 的源。

  1. # 确保当前工作路径在家目录
  2. $ cd ~
  3. # 下载安装包
  4. $ wget https://labfile.oss.aliyuncs.com/courses/1403/zabbix-4.0-xenial_all.deb

Linux 运维新手入门课 - 图17

使用 dpkg 进行安装:

  1. $ sudo dpkg -i zabbix-4.0-xenial_all.deb

Linux 运维新手入门课 - 图18

修改安装源为阿里云

  1. $ sudo vim /etc/apt/sources.list.d/zabbix.list # 将自带的源注释掉,换成阿里云的
  2. deb http://mirrors.cloud.aliyuncs.com/zabbix/zabbix/4.0/ubuntu xenial main
  3. deb-src http://mirrors.cloud.aliyuncs.com/zabbix/zabbix/4.0/ubuntu xenial main

然后获取 key:

  1. curl -o - "http://mirrors.cloud.aliyuncs.com/zabbix/zabbix-official-repo.key" | sudo apt-key add -

最后,更新一下源:

  1. $ sudo apt-get update

Linux 运维新手入门课 - 图19

服务器与界面

Linux 运维新手入门课 - 图20

启动 MySQL

在实验楼的环境中,我们已经安装好了 MySQL,因此用户不需要进行操作。

使用 service 命令就可以启动 MySQL

  1. $ sudo service mysql start

Linux 运维新手入门课 - 图21

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

  1. $ mysql -u root

Linux 运维新手入门课 - 图22

登录之后不要退出,接下来的步骤需要在 MySQL 命令行中进行。

创建数据库和用户

我们需要在 MySQL 上创建 Zabbix 初始化数据库和用户。需要注意的是,数据库名和用户名都是zabbix

在上一个步骤中,我们已经登录到 MySQL 了。

创建一个名叫zabbix的数据库,字符集设置为 utf8。

  1. CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;

Linux 运维新手入门课 - 图23

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

  1. USE zabbix;

Linux 运维新手入门课 - 图24

然后查看所有的表:

  1. SHOW TABLES;

Linux 运维新手入门课 - 图25

从结果可以看出,数据库中没有任何的表和数据。

这是一个授权的操作,意为允许用户 zabbix 从 localhost 的主机连接到 mysql 服务器的 zabbix 数据库,并使用zabbixPSWD作为密码。

  1. GRANT ALL PRIVILEGES ON zabbix.*
  2. TO zabbix@localhost
  3. IDENTIFIED BY 'zabbixPSWD';

Linux 运维新手入门课 - 图26

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

  1. quit;

Linux 运维新手入门课 - 图27

导入数据

还记得刚刚的操作SHOW TABLES;吗?它的作用是查看数据库中的所有表,zabbix 数据库创建之后是没有表的。

但是使用了如下命令导入数据之后,zabbix 数据库就会有表和数据。

使用 zcat 初始化查看其中数据,通过 zabbix 用户初始化名为 zabbix 的数据库。

  1. $ zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | \
  2. mysql -uzabbix -pzabbixPSWD zabbix

注意:当输入\之后,命令就可以换行输入,避免一行命令太长。这里 mysql 命令的-uroot连写,及后面的-p与密码连写,都是为了防止 MySQL 无法识别。
Linux 运维新手入门课 - 图28

数据的导入需要一定的时间,用户需要耐心等待命令执行完成。

接下来,我们使用刚刚创建的 zabbix 用户进行登录。

  1. $ mysql -uzabbix -pzabbixPSWD

Linux 运维新手入门课 - 图29

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

  1. SHOW DATABASES;

Linux 运维新手入门课 - 图30

切换数据库

  1. USE zabbix;

Linux 运维新手入门课 - 图31

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

  1. SHOW TABLES;

Linux 运维新手入门课 - 图32

使用下面的命令可以查看 users 表中的 1 行数据(一个记录)。表中已经导入了数据。

  1. SELECT * FROM users LIMIT 1;

由于终端窗口的大小原因,显示不是很美观,但证明了表中是有数据的。
Linux 运维新手入门课 - 图33

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

  1. quit;

Linux 运维新手入门课 - 图34

修改 Zabbix Server 的配置

在 zabbix_server.conf 中编辑数据库配置,这里我们使用 Vim 编辑器。

  1. $ sudo vim /etc/zabbix/zabbix_server.conf

Linux 运维新手入门课 - 图35

首先找到关于 DBHost 的配置。

  1. DBHost=localhost

这里默认已经配置了数据库的地址为 localhost,所以不需要进行更改。
Linux 运维新手入门课 - 图36

  1. DBName=zabbix
  2. DBUser=zabbix

这两行是配置数据库的名字和用户名。因为我们创建的用户和数据库都是同名的,因此也不需要更改。
Linux 运维新手入门课 - 图37

最后是配置登录 zabbix 用户的密码。

  1. DBPassword=zabbixPSWD

注:zabbixPSWD 是 MySQL 的 Zabbix 数据库密码。
Linux 运维新手入门课 - 图38

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

Linux 运维新手入门课 - 图39

启动 Zabbix Server

  1. $ sudo service zabbix-server start

Linux 运维新手入门课 - 图40

Zabbix 前端配置

需要先使用下面的命令启动一下 Apache2

  1. $ sudo service apache2 start

Linux 运维新手入门课 - 图41

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

  1. $ sudo service apache2 status

Linux 运维新手入门课 - 图42

在进行修改之前,我们先确定一下 PHP 的版本。

  1. $ php -v

注意:这里是小写的 v。
Linux 运维新手入门课 - 图43

经过确认,是 PHP 7.0,我们还需要安装 PHP 与 Apache 通信的库。

  1. $ sudo apt-get install libapache2-mod-php7.0

Linux 运维新手入门课 - 图44

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

  1. $ sudo vim /etc/apache2/conf-enabled/zabbix.conf

Linux 运维新手入门课 - 图45

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

Linux 运维新手入门课 - 图46

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

Linux 运维新手入门课 - 图47

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

  1. $ sudo service apache2 restart

Linux 运维新手入门课 - 图48

与刚刚一样的报错,可以忽略掉。

初始化 Zabbix

Zabbix 前端可以在浏览器中通过http://localhost/zabbix进行访问。在浏览页面中大家按照提示框一步一步进行 zabbix 初始安装。步骤如下:

☞ 步骤(1)左边红色框中是前端登录界面的步骤,选择右下角的Next step按钮。

Linux 运维新手入门课 - 图49

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

Linux 运维新手入门课 - 图50

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

Linux 运维新手入门课 - 图51

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

Linux 运维新手入门课 - 图52

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

Linux 运维新手入门课 - 图53

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

Linux 运维新手入门课 - 图54

注意圈出来的部分,它说明 Server 运行正常。如果你搭建的 zabbix 状态显示的是no说明配置没有成功,需要检查一下是否有步骤遗漏。

让界面更加友好

是不是感觉英文的 Zabbix 有点不太友好?没关系,它是可以设置为中文的。

首先点击由右上角用户图标。

Linux 运维新手入门课 - 图55

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

Linux 运维新手入门课 - 图56

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

Linux 运维新手入门课 - 图57

开始使用 Zabbix

Zabbix 的核心部分已经部署完成了,接下来还需要在 Zabbix 中添加 Agent 主机和主机群组。

本地的主机既是 Server 也是被监控端,所以还需要安装 Agent:

  1. $ sudo apt-get install -y zabbix-agent

Linux 运维新手入门课 - 图58

启动 Zabbi Agent 的方式如下。

  1. $ sudo service zabbix-agent start

添加主机

回到 Zabbix 的 Web GUI,我们开始添加一个 Agent 到 Server 中。

点击顶部的 “配置” -> “主机”

Linux 运维新手入门课 - 图59

然后点击 “创建主机”

Linux 运维新手入门课 - 图60

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

Linux 运维新手入门课 - 图61

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

Linux 运维新手入门课 - 图62

这样,本地的 Agent 就添加到 Zabbix Server 中了。

添加主机组

刚刚我们将主机添加到了 Linux Server 和 Zabbix Server 这两个组。现在我们创建一个自定义的主机群组,并把Host_Shiyanlou主机添加进去。

如下图所示,点击 “主机群组” 之后,再点击 “创建主机群组”。

填写群组名。

Linux 运维新手入门课 - 图63

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

Linux 运维新手入门课 - 图64

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

Linux 运维新手入门课 - 图65

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

Linux 运维新手入门课 - 图66

至此,一个完整的 zabbix 平台搭建就完成了,在下一节中将继续给大家讲解如何去使用 zabbix。此环境大家记得保存下来,避免在下一节实验中重新安装和配置。

Zabbix 监控 Nginx Web 服务

配置 Nginx 状态页面

在第二个实验部署 Nginx Web 服务器实验中,我们已经学会了 Nginx 的基本使用方式和开启状态页面的方式,本部分是对之前内容的回顾。

Nginx 的配置主要包括两个部分,一是修改默认端口,二是配置状态页。

💡 修改默认端口

由于实验中的 Apache2 要使用 80 端口,而 Nginx 的默认端口也是 80,所以我们需要将 Nginx 的 default 配置修改为 80 端口以外的其他端口。

首先,实验楼环境下已经安装了 Nginx,可以查看下本实验环境下的 Nginx 版本和配置参数信息等。

  1. $ sudo vim /etc/nginx/sites-enabled/default

将里面的 80 全部替换掉,主要就是 listen 的那个配置项改成 8090 这个端口或者其他没有用的端口即可。
注意:8080 端口需要配置开启状态页,所以不能使用。

Linux 运维新手入门课 - 图67

💡 配置状态页

和之前的方式一样,新建一个 conf 文件

  1. $ cd /etc/nginx/sites-enabled/
  2. $ sudo touch status.conf

使用 Vim 编辑器进行编辑。

  1. $ sudo vim status.conf

键入下面的内容:

  1. server {
  2. listen 8080 default_server;
  3. server_name localhost;
  4. location /nginx_status {
  5. stub_status on;
  6. }
  7. }

它表示监听 8080 端口,对于 URI/nginx_status,我们启用模块stub_status进行响应。
Linux 运维新手入门课 - 图68

💡 重新启动 nginx

先检查一下是否有语法错误:

  1. $ sudo nginx -t

当看到 OK 字样后,再重新启动 Nginx

  1. $ sudo service nginx restart

Linux 运维新手入门课 - 图69

💡 查看状态页

通过curl工具读取状态页的内容。

  1. $ curl localhost:8080/nginx_status

Linux 运维新手入门课 - 图70

启动实验环境

如果你没有使用保存的实验环境,需要先参考上一节实验的文档进行安装和配置。

如果是使用保存的环境,那么需要启动一下相关的服务。

  1. $ sudo service zabbix-server start
  2. $ sudo service zabbix-agent start
  3. $ sudo service apache2 start
  4. $ sudo service mysql start

Linux 运维新手入门课 - 图71

Shell 脚本入门

因为接下来对 Agent 的配置需要一定的 Shell 知识,所以在这里补充一下。但作为入门课程,我们不会详细地讲解 Shell 脚本的方方面面。

我们可以把 Shell 脚本看做很多命令的集合,它会按照我们规定的顺序执行这些命令。

💡 简单的尝试

首先,我们使用 touch 命令来创建一个 Shell 脚本。

  1. $ cd ~
  2. $ touch test1.sh

然后使用 Vim 来编辑它:

  1. $ vim test1.sh

写入下面的内容

  1. #!/bin/bash
  2. echo "hello,shiyanlou1"
  3. echo "My Fist Script"

在终端中输入下面的命令来执行我们编写的脚本

  1. $ /bin/bash test1.sh

完整的演示:
Linux 运维新手入门课 - 图72

💡 变量

和第一个脚本采用的方式相同,先touch test2.sh,再调用vim test2.sh进行编辑。输入的脚本内容如下:

  1. #!/bin/bash
  2. hello="hello,shiyanlou2"
  3. echo $hello

它定义了一个变量hello,它的值为hello,shiyanlou2,最后我们打印了这个变量的值。当一个相同的值被多次使用时,定义变量是最好的方式,因为只需修改变量的值,所有引用变量值的地方就都被修改啦~
注意:=的前后不能有空格。

使用下面的命令进行执行。

  1. $ /bin/bash test2.sh

Linux 运维新手入门课 - 图73

💡 传入参数

变量的值是被写入到文件中,如果我们想根据命令的不同来让脚本有不同的行为,就必须采用传入参数的方式。

让我们通过实战来了解一下如何传入参数。新建一个test3.sh,写入下面的内容。

  1. #!/bin/bash
  2. echo $1

这里$1就是我们传入的第一个参数。
输入下面的命令执行脚本。

  1. $ /bin/bash test3.sh "hello,shiyanlou3"

这里"hello,shiyanlou3"就是我们传入的参数,注意"(引号)是不会被打印的。
执行的结果如下:

Linux 运维新手入门课 - 图74

💡 函数

为了使相同的工作不再重复,我们通常定义函数来将相同的操作写到一个函数中,比如下面的代码中就定义了一个名为hello的函数。

  1. #!/bin/bash
  2. function hello {
  3. echo "hello,shiyanlou4"
  4. }
  5. $1

只定义一个函数是不会进行任何操作的,我们必须要调用函数,这样它才会执行。当我们调用函数时,它就会执行函数体中的内容,这里的函数体是echo "hello,shiyanlou4"
为什么最后有$1呢?这其实是我们调用函数的方式,不过这里我们从命令行传入要调用的函数。如果我们执行的命令为/bin/bash test4.sh hello,那么脚本就相当于:

  1. #!/bin/bash
  2. function hello {
  3. echo "hello,shiyanlou4"
  4. }
  5. hello

这里直接写hello就意味着调用hello函数。
创建一个test4.sh来看一下结果吧 ~

Linux 运维新手入门课 - 图75

配置 Agent

💡 添加自定义参数

在前面的学习中我们知道对服务的监控需要通过 Agent 去采集数据,所以下面就该对 Agent 进行配置。

/etc/zabbix/zabbix_agentd.conf配置文件中添加自定义参数,让 Agent 使用脚本来采集 Nginx 的数据,然后发送给 server。

  1. $ sudo vim /etc/zabbix/zabbix_agentd.conf

需要在末尾添加的内容如下:

  1. UserParameter=nginx.status[*],/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh $1

这里我们添加一个自定义的UserParameter。我们详细讲解一下自定义参数的含义。
有时候我们想让被监控端执行一个 Zabbix 没有预定义的检测,Zabbix 的用户自定义参数功能提供了这个方法。

其语法规范为:

  1. UserParameter=key,command

key使我们定义的参数,它必须是唯一的,[*]表示里面可以传递多个参数。
如果 Zabbix 调用 key,就会执行对应的 command(命令)。比如这里我们调用的 key 为nginx.status['active'],那么执行的命令为:/bin/bash /etc/zabbix/zabbix_agentd.d/nginx_status.sh active,这里的$1会被替换为 key 中传入的第一个参数。

Linux 运维新手入门课 - 图76

配置完成,重启一下 Zabbix Agent 服务。

  1. $ sudo service zabbix-agent restart

Linux 运维新手入门课 - 图77

💡 采集脚本

接着我们来编写下用于采集数据的信息的脚本

  1. $ 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 脚本入门一小节中我们已经讲解过了,这里就不再重复它的作用)。

  1. #!/bin/bash
  2. # 设置变量
  3. BKUP_DATE=`/bin/date +%Y%m%d`
  4. LOG="/data/log/zabbix/webstatus.log"
  5. HOST=127.0.0.1 # 确保 CURL 能访问这个主机的 IP 地址
  6. PORT="8080" # 端口号
  7. # 编写函数用于获取 nginx 的统计信息
  8. function active {
  9. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'
  10. }
  11. function reading {
  12. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Reading' | awk '{print $2}'
  13. }
  14. function writing {
  15. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Writing' | awk '{print $4}'
  16. }
  17. function waiting {
  18. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
  19. }
  20. function accepts {
  21. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $1}'
  22. }
  23. function handled {
  24. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $2}'
  25. }
  26. function requests {
  27. /usr/bin/curl "http://$HOST:$PORT/nginx_status" 2>/dev/null| awk NR==3 | awk '{print $3}'
  28. }
  29. $1

添加脚本的过程和 Shell 脚本入门一小节中是相似的。可以参考下面的演示 ↓
Linux 运维新手入门课 - 图78

添加好采集脚本之后,需要再次重新启动一下 Zabbix Agent。

  1. $ sudo service zabbix-agent restart

测试数据采集

Zabbix Agent 监控代理获取(采集)数据可以通过zabbix_get进程来取得。可以用zabbix-get来测试一下数据的采集是否成功。

这里我们需要安装一下zabbix-get这个软件包。

  1. $ sudo apt-get install zabbix-get

Linux 运维新手入门课 - 图79

测试的命令如下:

  1. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[accepts]'
  2. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[handled]'
  3. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[requests]'
  4. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'
  5. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[reading]'
  6. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[writing]'
  7. $ sudo zabbix_get -s 127.0.0.1 -k 'nginx.status[waiting]'

-s: 指定客户端主机名或者 IP 。由于是采集本机的数据,可以使用回环地址127.0.0.1或者localhost
-k: 你想获取的 key 。这里的 Key 是之前在UserParameter中定义的。

返回一个数据则表示配置成功,如下是测试结果,你得到的值不一定与图片中的相同。

Linux 运维新手入门课 - 图80

Zabbix 监控配置

💡 配置流程

下面就是 Zabbix 监控系统的配置步骤。

大体的流程是:

  • (1)添加要监控的 Agent(这一步骤在上一个实验中已经完成,如果你没有使用保存的环境,就需要重新进行配置)。
  • (2)给主机添加监控项,即我们想要监控的指标。
  • (3)将我们监控项按组划分为两个图形。
  • (4)将图形汇总到一个聚合图形上。

💡 指标分组

在开始进行配置之前,我们先将七个指标进行分组。

回顾一下,之前nginx_status的七个指标:

  • active connections– 活跃的连接数量
  • server accepts handled requestsaccepts表示总共处理的连接数,handled表示成功创建握手的次数,requests表示总共处理的请求数
  • reading— 读取客户端的连接数
  • writing— 响应数据到客户端的数量
  • waiting— Nginx 已经处理完正在等候下一次请求指令的驻留连接数

我们将其分为两个组

  • 与连接相关的:activereadingwritingwaiting
  • 与处理请求相关的:acceptshandledrequests

创建监控项

首先打开浏览器,在地址栏输入localhost/zabbix进入 Zabbix 的前端。

依次点击顶部的 “配置” → “主机” → “监控项”。

Linux 运维新手入门课 - 图81

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

Linux 运维新手入门课 - 图82

接下来,我们要分别为 7 个指标添加监控项。创建监控项的方式都是大同小异的,我们只会详细的讲解nginx.accepts的配置,其他的配置与其是相似的。

💡 创建与连接相关的监控项

  • nginx.accepts

我们需要填写监控项的名字:nginx.accepts。然后要填写键值nginx.status[accepts]。更新时间改为1s

Linux 运维新手入门课 - 图83

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

Linux 运维新手入门课 - 图84

  • nginx.handled

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

Linux 运维新手入门课 - 图85

  • nginx.requests

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

Linux 运维新手入门课 - 图86

💡 创建与处理请求相关的监控项

  • nginx.active

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

Linux 运维新手入门课 - 图87

  • nginx.reading

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

Linux 运维新手入门课 - 图88

  • nginx.writing

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

Linux 运维新手入门课 - 图89

  • nginx.waiting

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

Linux 运维新手入门课 - 图90

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

Linux 运维新手入门课 - 图91

这表明我们添加的监控项已经成功启用。

创建图形

接下来,我们需要为两组监控项分别创建图形。

如下图,点击 “图形”,再点击 “创建图形”。

Linux 运维新手入门课 - 图92

我们需要依次创建两个图形:nginx_connectnginx_interact

  • 💡 nginx_connect

填写图形的名称为nginx_connect,然后将监控项添加到图形中。

Linux 运维新手入门课 - 图93

添加监控项的方式如下。注意我们要添加的监控项为nginx.acceptsnginx.handlednginx.requests

添加完成后,点击底部的 “添加” 按钮。

Linux 运维新手入门课 - 图94

  • 💡 nginx_interact

nginx_interact 的配置方式与 nginx_connect 是相似的。要注意:图形命名为nginx_interact;需要添加的监控项为:nginx.activenginx.readingnginx.writingnginx.waiting

Linux 运维新手入门课 - 图95

创建聚合图形

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

Linux 运维新手入门课 - 图96

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

Linux 运维新手入门课 - 图97

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

Linux 运维新手入门课 - 图98

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

Linux 运维新手入门课 - 图99

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

Linux 运维新手入门课 - 图100

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

Linux 运维新手入门课 - 图101

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

Linux 运维新手入门课 - 图102

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

Linux 运维新手入门课 - 图103

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