linux 常用目录和文件说明
环境信息
- Centos 7
常用目录和文件说明
etc 目录常用文件说明
文件路径 | 说明 | 示例 |
---|---|---|
/etc/motd | 登录成功后的欢迎信息,ssh 登录和 console 登录成功后都会显示 | |
/etc/issue | 在登录系统输入用户名之前显示的信息,远程 ssh 连接的时候并不会显示此信息 | 说明示例 |
/etc/services | 记录网络服务名和它们对应使用的端口号及协议 | |
/etc/protocols | 该文件是网络协议定义文件,里面记录了 TCP/IP 协议族的所有协议类型。文件中的每一行对应一个协议类型,它有3个字段,分别表示 协议名称 、协议号 和 协议别名 |
|
/etc/vimrc ~/.vimrc |
vim 启动时会读取 /etc/vimrc (全局配置) 和 ~/.vimrc (用户配置) |
vim |
/etc/passwd /etc/shadow /etc/group |
用户数据库,其中记录了 用户名 ,id ,用户家目录 ,shell 等用户密码文件 组信息 |
|
/etc/fstab | 系统启动时需要自动挂载的文件系统列表 | |
/etc/mtab | 当前系统已挂载的文件系统,并由 mount 命令自动更新。当需要当前挂载的文件系统的列表时使用(例如df命令) |
|
/etc/shells | 系统可使用的 shell |
|
/etc/filesystems | 系统可使用的 文件系统 |
|
/etc/hostname | 存放这主机名 | |
/etc/hosts | 主机名查询静态表,域名和 ip 本地静态表 | |
/etc/nsswitch.conf | 它规定通过哪些途径以及按照什么顺序以及通过这些途径来查找特定类型的信息,还可以指定某个方法奏效或失效时系统将采取什么动作 | hosts: files dns myhostname 此配置设定:在查找域名解析的时候,先查找本地 /etc/hosts ,再发送给 DNS 服务器查询 |
/etc/rsyslog.conf | rsyslog 服务的配置文件,用来托管其他服务的日志 |
linux rsyslog 服务 |
/etc/logrotate.conf | linux 日志切割工具 | linux logrotate 服务 |
/etc/rsyncd.conf | rsync 服务的配置文件 |
rsyncd 服务 |
/etc/sysctl.conf /etc/sysctl.d/ |
内核的运行参数配置文件,sysctl 命令对内核参数的修改仅在当前生效,重启系统后参数丢失,如果希望参数永久生效可以修改此配置文件 |
Linux 常用内核参数说明 |
python set 用法
在 Python 中,set
是一种无序的、可变的集合数据类型,用于存储唯一的元素。它主要用于快速去重和集合运算(如交集、并集、差集等)。
环境信息
- Python 3
set 基本操作
创建集合
可以使用花括号 {}
或 set()
函数来创建集合。
使用花括号创建集合
# 创建一个包含一些元素的集合
my_set = {1, 2, 3, 4, 5}
print(my_set) # 输出: {1, 2, 3, 4, 5}使用
set()
函数创建集合# 使用 set() 函数从一个可迭代对象创建集合
my_set = set([1, 2, 3, 4, 5])
print(my_set) # 输出: {1, 2, 3, 4, 5}
# 创建一个空集合
empty_set = set()
print(empty_set) # 输出: set()
集合的基本操作
添加元素
使用 add()
方法向集合添加单个元素。
my_set = {1, 2, 3} |
移除元素
使用 remove()
方法移除集合中的指定元素,如果元素不存在会引发 KeyError
。使用 discard()
方法移除元素,如果元素不存在不会引发异常。
my_set = {1, 2, 3} |
清空集合
使用 clear()
方法清空集合中的所有元素。
my_set = {1, 2, 3} |
集合的长度
使用 len()
函数获取集合中元素的个数。
my_set = {1, 2, 3} |
集合运算
并集
使用 |
运算符或 union()
方法。
set1 = {1, 2, 3} |
python 用法小结及常见错误
环境信息
- Python3
字符串转换为变量名
locals() 方法
>>> str1 = 666 |
vars() 方法
|
eval() 方法
>>> str1 = 666 |
yield
yield
指令和 return
相似,都是用来在函数中返回。使用 yield
关键字创建生成器函数时,生成器函数并不会在传统意义上 返回
。相反,生成器函数在遇到 yield
语句时会暂停其执行,并返回一个值给调用者。生成器函数的状态会被保存,因此在下一次调用时,它可以从暂停的地方继续执行。
yield
指令 将函数转换成生成器(Generator
),它在函数中产生一个值,然后暂停函数并保存其状态(下一次调用函数会从此状态恢复执行),再次恢复执行时再生成(返回)yield
的值。
每次调用生成器函数时,并不会立即执行,会创建一个新的生成器对象。
第一次使用 next()
或在 for
循环中开始迭代生成器时,生成器函数开始执行,直到遇到第一个 yield
语句。yield
会暂停生成器函数的执行,并将一个值返回给调用者。再次调用 next()
或继续迭代(for
)时,生成器函数从上次暂停的 yield
处继续执行,直到遇到下一个 yield
语句或执行结束。
生成器函数在没有 yield
语句时结束执行,相当于隐式地在最后一个 yield
语句之后遇到 return
。
当生成器函数结束时,进一步调用 next()
会引发 StopIteration
异常,表示生成器中的值已被全部生成。
yield
有以下优点:
- 能够以更高效的方式处理大量数据,因为它不需要一次性将所有数据存储在内存中。通过减少内存消耗,提高程序性能。
- 它提供了一种新的方法来控制函数的执行流程,使得函数可以在任意点暂停和恢复。生成器函数在被暂停后(遇到
yield
)不会继续执行,直到再次调用next()
或通过迭代器进行迭代(for
)。
yield 读取大文本数据
在处理大文本数据(如超过 10G)时,如果一次性读取所有文本内容,在可用内存较小的情况下可能出现内存不足导致程序执行失败。这时候可以考虑使用 yield
来批量加载数据。
定义如下函数读取文件内容:
def read_large_file(file_path): |
使用以下方法使用大文本中的数据
next
方法。调用生成器函数(read_large_file
),会返回一个 Generator 对象,通过next()
方法会迭代调用生成器的下一个值(yield
表达式的值)file_path = 'large_file.txt'
# next 方法: 首先
line = read_large_file(file_path)
next(line) # 返回第一行
next(line) # 返回第二行,以此类推可以读取所有行for
循环。调用生成器函数返回一个生成器对象,这个对象实现了迭代器协议。def read_large_file(file_path):
"""
Generator function to read a large file line by line.
"""
with open(file_path, 'r') as file:
for line in file:
yield line
# Usage example
file_path = 'large_file.txt'
for line in read_large_file(file_path):
print(line.strip())
分批读取大文件中的数据
在处理大文件的过程中,如果需要批量多行读取文件内容,参考以下代码
def read_file_in_chunks(file_path, chunk_size=1024): |
enumerate
enumerate
是 Python 内置函数之一,用于遍历可迭代对象(如列表、元组或字符串)时获取元素和对应的索引。
语法:
enumerate(iterable, start=0) |
iterable
: 任何可迭代对象(如列表、字符串、元组、文件对象等)。start
: 索引的起始值,默认为0
。如果要让索引号从1
开始,配置start=1
# 示例列表 |
常见错误
NameError: name ‘null‘ is not defined
使用 eval
将 string
转化成 dict
时出错,经过排查,发现 string
数据中包含 null
,在转换时就会报错: NameError: name ‘null‘ is not defined
解决方法
使用 json
进行转换
try: |
笔记
蛙化及蛇化
蛙化現象
是日本 2023 年上半年的 Z 世代(出生介於1995年~2010年)流行用語第一名。這個詞源自格林童話《青蛙王子》,描述對另一半突然感到生理或心理上厭惡。日本大學教授藤澤伸介在2004年的研究指出,「蛙化現象」是一種普遍狀態,尤其容易發生在情竇初開的青少年身上,因為戀愛經驗少,對感情對象抱持完美的想像。
與蛙化現象相對,近期有對情侶在TikTok發明「蛇化現象」,描述無論另一半做了什麼尷尬行為,都感到好可愛。這種現象迅速散播,成為日本Z世代流行用語。
于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡
你永远不可能真正去了解一个人,除非你穿过她的鞋子去走她走过的路,站在她的角度思考问题,可当你走过她走的路时,你连路过都觉得难过。
当一个人因为和你无关的事情而生气并向你抱怨和展示自己的生气和愤怒时,你最好不要对涉及到的人或事发表任何意见,千万不要对涉及到的人或事发表任何意见,千万不要对涉及到的人或事发表任何意见,你最好 当个听客,闭紧嘴巴,不然很可能引火烧身。
当你只能孤注一掷的时候,你只能孤注一掷。如果你犹豫不决,说明你其实还有办法,只是不愿意使用。
对一个人好是一件太过笼统的说法,没法测量,如需测量,可以将这个说法进行分解,比如分解为:
对一个人好
=能为他着想
+站在他的角度考虑
Linux 进程常见状态说明
状态标识 | 状态名称 | 状态说明 | 示例 |
---|---|---|---|
R |
task_running | 进程处于运行或就绪状态 | |
S |
task_interruptible sleeping |
可中断的睡眠状态 | |
D |
task_uninterruptible | 不可中断的睡眠状态 1. 它是一种睡眠状态,意味着处于此状态的进程不会消耗 CPU 2. 睡眠的原因是等待某些资源(比如锁或者磁盘 IO),这也是非常多 D 状态的进程都处在处理 IO 操作的原因 3. 是它不能被中断,这个要区别于 硬件中断 的中断,是指不希望在其获取到资源或者超时前被终止。因此他不会被信号唤醒,也就不会响应 kill -9 这类信号。这也是它跟 S(可中断睡眠) 状态的区别 |
|
T |
task_stopped task_traced Traced |
暂停状态或跟踪状态 | |
Z |
task_dead exit_zombie zombie |
退出状态,进程成为僵尸进程 | |
X |
task_dead exit_dead |
退出状态,进程即将被销毁 | |
I |
idle | 空闲状态 |
进程命令名和进程可执行文件名
在系统中遇到以下进程:
# ps -elf | grep 18686 |
其中 PID 为 18686
的进程名为 /usr/sbin/CROND
,其启动了另外两个子进程。但是在系统中检查,并不存在路径 /usr/sbin/CROND
# ls -l /usr/sbin/CROND |
出现此种现象,主要是因为 在启动时,进程的命令名是根据路径传递给 execve()
函数的参数决定的,而不是直接与系统中的文件进行匹配。
在 Linux 系统中,ps
命令显示的进程信息是从 /proc
文件系统中获取的,而 /proc
文件系统包含有关正在运行的进程的信息,包括每个进程的命令名。因此,即使实际上系统中不存在 /usr/sbin/CROND
文件,但如果进程的命令名是 /usr/sbin/CROND
,那么 ps
命令仍然会显示进程的命令名为 /usr/sbin/CROND
。
进程的命令名可以查看 /proc/<PID>/cmdline
文件,本示例中显示如下:
# cat /proc/18686/cmdline |
对应的系统上的可执行文件的名称可以查看 /proc/<PID>/stat
、/proc/<PID>/comm
、/proc/<PID>/status
等文件
# cat /proc/900/comm |
在本示例中,实际执行的命令为 crond
进程状态查看
top 命令
使用 top
命令可以查看系统负载、CPU 和 内存使用情况。也可以查看单个进程的具体信息。
top
命令常用选项
选项 | 说明 | 示例 |
---|---|---|
-H |
Threads Mode ,线程模式。默认情况 top 展示进程的简要信息,使用此选项显示进程中的线程状态。对应交互式命令 H |
- 显示单个进程的(线程)详细信息
# top -H -p 1423
top - 09:44:42 up 54 days, 23:53, 2 users, load average: 8.82, 6.84, 7.21
Threads: 15 total, 0 running, 15 sleeping, 0 stopped, 0 zombie
%Cpu(s): 40.9 us, 10.8 sy, 0.0 ni, 48.1 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 15790488 total, 466056 free, 7761544 used, 7562888 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 3895716 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1423 root 20 0 1477368 778788 4260 S 39.5 4.9 11999:41 [watchdog:1:6]
2572 root 20 0 1477368 778788 4260 S 37.9 4.9 11363:48 [watchdog:1:6]
1436 root 20 0 1477368 778788 4260 S 34.2 4.9 11286:08 [watchdog:1:6]
1435 root 20 0 1477368 778788 4260 S 33.9 4.9 12059:53 [watchdog:1:6]
1434 root 20 0 1477368 778788 4260 S 33.2 4.9 10249:00 [watchdog:1:6]
1437 root 20 0 1477368 778788 4260 S 30.6 4.9 11717:47 [watchdog:1:6]
1431 root 20 0 1477368 778788 4260 S 28.9 4.9 11222:06 [watchdog:1:6]
21378 root 20 0 1477368 778788 4260 S 27.6 4.9 12143:35 [watchdog:1:6]
1433 root 20 0 1477368 778788 4260 S 17.6 4.9 8738:21 [watchdog:1:6]
1428 root 20 0 1477368 778788 4260 S 8.0 4.9 7650:56 [watchdog:1:6]
1429 root 20 0 1477368 778788 4260 S 0.0 4.9 0:00.04 [watchdog:1:6]
1430 root 20 0 1477368 778788 4260 S 0.0 4.9 0:00.05 [watchdog:1:6]
1432 root 20 0 1477368 778788 4260 S 0.0 4.9 0:00.03 [watchdog:1:6]
1438 root 20 0 1477368 778788 4260 S 0.0 4.9 12260:30 [watchdog:1:6]
1529 root 20 0 1477368 778788 4260 S 0.0 4.9 11068:39 [watchdog:1:6]
参考文档
Ansible templates 使用介绍
环境信息
- ansible-core 2.16
- Docker image python:3.12.3
Ansible 使用 Jinja2 模板语言对变量或者 Facts 进行模板化。 [1]
模板数据处理
Filters
使用 Filters
可以进行数据转换(如 JSON
–> YAML
)、URL 分割等操作。 [2]
为变量提供默认值
在模板中使用的变量未定义的情况下,可能会导致 Ansible 处理失败,为了以更优雅的方式处理此类问题,可以在模板中为变量提供 默认值
{{ some_variable | default(5) }} |
也可以在变量计算值为空或者 false
时使用默认值
{{ lookup('env', 'MY_USER') | default('admin', true) }} |
配置变量为可选变量
默认情况下,Ansible Template 中所有的变量都必须有值,否则会抛出异常。假如需要在模板中的部分变量没有值或未定义的情况下也可以正常部署,可以将其配置为 可选(optional)
要将变量配置为 **可选(optional)**,可以将其 默认值(default value) 设置为特殊变量 omit
- name: Touch files with an optional mode |
变量类型
如果需要对变量类型进行转换,可以参考以下方法
获取变量类型
2.3 以上版本中,可以使用 type_debug
显示变量类型
{{ myvar | type_debug }} |
字典转换为列表
New in version 2.6.
{{ dict | dict2items }} |
原始字典数据:
tags: |
使用 {{ dict | dict2items }}
转换后的列表数据:
- key: Application |
转换后的列表默认以关键字 key
指示之前的字典中的 key
值,以关键字 value
指示之前的字典中的 value
值。如果想要自定义 key 名称,dict2items
接受关键字参数 key_name
和 value_name
# Dictionary data (before applying the ansible.builtin.dict2items filter): |
列表转换为字典
{{ tags | items2dict }} |
List data (before applying the ansible.builtin.items2dict
filter):
tags: |
Dictionary data (after applying the ansible.builtin.items2dict
filter):
Application: payment |
假如 List Data 中的关键字不是 key
和 value
,此时必须使用参数 key_name
和 value_name
指定
{{ fruits | items2dict(key_name='fruit', value_name='color') }} |
强制类型转换
使用以下语法强制转换变量数据类型 [5]
some_string_value | bool |
YAML 和 JSON 数据转换
可以使用以下语法将数据转换为 JSON 或者 YAML 格式
{{ some_variable | to_json }} |
可以使用以下语法将数据转换为方便人类阅读 JSON 或者 YAML 格式
{{ some_variable | to_nice_json }} |
制定行首缩进程度
{{ some_variable | to_nice_json(indent=2) }} |
参考链接
脚注
docker compose 简介
Compose
项目是 Docker
官方的开源项目,负责实现对 Docker 容器集群
的快速编排。
Compose
定位是 「定义和运行多个 Docker
容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig
。
使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML
格式)来定义一组相关联的应用容器为一个项目(project
)。Compose
中有两个重要的概念:
服务 (service)
: 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目 (project)
: 由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose
目前分为 2 个大版本: [1]
Compose V1
: 目前已经不提供官方支持。使用Python
编写,通过docker-compose
命令来调用。Compose V1
的docker-compose.yml
最开始要包含version
命令,取值范围2.0
到3.8
Compose V2
: 使用Go
编写,通过docker compose
命令来调用。Compose V2
忽略docker-compose.yml
最开始的version
指令。Compose V2
向后兼容Compose V1
版本
docker 容器中安装常见工具
YAML 语法格式
YAML(YAML Ain’t Markup Language)是一种专门用于数据序列化的格式,常用于配置文件、数据交换等场景。它以其可读性和简洁性而受到开发者的青睐。YAML设计的目标是易于人类阅读和编写,并且易于与其他编程语言进行交互。下面是YAML语法的详细介绍
基本结构
数据类型 :YAML 支持标量(如字符串、整数、浮点数)、序列(列表)和映射(字典)三种基本数据类型。
缩进 :YAML 使用缩进表示结构层级关系,通常每个层级缩进两个或四个空格(禁止使用制表符)。
标量数据类型
标量(Scalars) 是单个的、不可分割的值。可以是字符串、整数或浮点数。标量可以是单行的值,也可以是多行的值
# 单行字符串 |
多行字符串可以使用字面量样式(|
)或折叠样式(>
):
# 字面量样式保留换行符 |
- 可以显式指定数据类型,例如字符串可以用单引号或双引号包围
- 字符串通常不需要引号,但如果含有特殊字符,则需要使用单引号或双引号。
true
,false
,null
等特定词汇表示布尔值和Null
。- 时间和日期需要遵循ISO格式。
列表(Sequences)
列表(Sequences) 是一组按顺序排列的值(类似于数组或列表),用破折号加空格表示新的元素,每个列表项占一行,也需要正确缩进。
# 列表 |
字典(Mappings)
映射/字典(Mappings) 是键值对的集合(类似于字典或哈希表),用冒号加空格表示键值对,键值对需要正确缩进
# 字典 |
嵌套结构
列表和字典可以嵌套使用,形成复杂的结构
# 嵌套的列表和字典 |
锚点和别名
YAML支持定义锚点(&
)和别名(*
)来重用(引用)文档中的某部分,使用 &
创建一个锚点(alias),之后可以用 *
引用这个锚点。
使用 <<
和 *
来合并已有(引用)的映射。
# 使用锚点和别名 |
注释
使用井号 #
开始一个注释,井号后面的内容将被视为注释,注释内容直到行尾。
多文档支持
一个 YAML 文件可以包含多个文档,每个文档用三个短横线 ---
分隔。
--- |
Prometheus Process exporter 使用
安装部署
为 process-exporter
生成 systemd
服务启动配置文件:
[Unit] |
建议将 process-exporter
的配置写入文件并使用 -config.path
指定配置文件。
配置进程监控
process-exporter
在配置文件中使用模板变量来配置筛选要监控的进程,可以使用的模板变量包括:
变量 | 说明 | 示例 |
---|---|---|
{{.Comm}} |
匹配进程的命令名(不包括路径)。主要来源于 /proc/<pid>/stat 输出中的第二部分命令名是指进程执行时的名称。在 Linux 系统中,可以通过 /proc/<PID>/comm 文件来获取进程的命令名。例如,如果一个进程执行的命令是 /usr/local/bin/php ,那么它的命令名就是 php 。 |
|
{{.ExeBase}} |
匹配进程的可执行文件名,不包括路径 可执行文件名是指进程的完整路径的最后一个部分。例如,如果一个进程的完整路径是 /usr/local/bin/php ,那么它的可执行文件名就是 php 。 |
|
{{.ExeFull}} |
匹配进程的可执行文件的完整路径,例如 /usr/local/php73/bin/php |
|
{{.Username}} |
匹配进程的用户名 | |
{{.Matches}} |
匹配进程的命令行参数列表 | |
{{.StartTime}} |
||
{{.Cgroups}} |
监控系统上的所有进程
要监控系统上的所有进程的运行情况,可以参考以下配置: [1]
process_names: |
- 以上配置会获取到系统上的所有进程(子进程被统计入父进程中)
- 假如配置中有多个匹配项,以上配置不能放到第一个,否则因为其可以匹配到系统中所有的进程,后续配置的匹配不会再有机会生效
监控系统上面指定进程
假如系统中运行了多个 php
的子进程,为了获取到各个子进程的统计数据,可以参考以下配置
process_names: |
使用此配置,可以获取到系统中以下进程的统计数据:
/usr/local/php73/bin/php /home/www/admin/artisan Pulldata
/usr/local/php73/bin/php /home/www/admin/artisan schedule:run
/usr/local/php73/bin/php /home/www/admin/artisan queue:work
除可以获取到以上特定进程的统计数据外,还可以统计到除此之外的其他所有进程的统计数据。
因为配置中匹配进程的顺序的关系,假如系统中还有除此之外的其他
php
进程,那么由最后的{{.Comm}}
统计到的php
进程资源使用数据中不再包含前面 3 个特定进程的资源使用数据。
脚注
Nextcloud 安装配置
Nextcloud All-in-One
Nextcloud All-in-One 在一个 Docker 容器中提供了方便部署和维护的 Nextcloud 方式。[1]
使用 docker compose 部署
为方便后期管理及迁移,建议使用 docker compose
方式部署。docker-compose.yml
参考文件如下: [2]
version: "3" |
使用 docker compose
方式部署注意事项:
name: nextcloud_aio_mastercontainer
: Volume 名称必须是nextcloud_aio_mastercontainer
,否则会报错找不到卷nextcloud_aio_mastercontainer
:It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.). Using a different name is not supported since the built-in backup solution will not work in that case!
启动成功后,根据提示在浏览器中打开 Nextcloud AIO setup
页面并记录页面显示的密码
You should be able to open the Nextcloud AIO Interface now on port 8080 of this server! |
根据页面提示登陆,跟随页面提示进行新实例初始化。
初始化过程中要提供域名,系统会自动为域名颁发证书(使用系统 443 端口映射到容器中的 8443 端口)
默认的 Nextcloud AIO 未部署反向代理,要使用反向代理请参考文档: Reverse Proxy Documentation
脚注
Prometheus 安装配置
环境信息
- Centos 7
- Prometheus Server 2.4
- Node Exporter v1.4.0
- Grafana v9.2.5
安装
在 Docker 中安装 Prometheus Server
创建 Prometheus Server 配置文件,如 /root/prometheus/prometheus.yml
,内容如下 [1]
# my global config |
使用 Docker 启动时挂载此文件,作为 Prometheus Server 的配置文件,之后需要修改配置,可以直接修改此文件。
docker run -d -p 9090:9090 \ |
启动后,可以通过 $Prometheus_IP:9090
访问 Prometheus Server UI
Prometheus Redis exporter 使用
Prometheus ValKey & Redis Metrics Exporter
Prometheus Redis Metrics Exporter 下载页面
redis_exporter 安装
wget https://github.com/oliver006/redis_exporter/releases/download/v1.59.0/redis_exporter-v1.59.0.linux-amd64.tar.gz |
为 redis_exporter
生成 systemd
服务配置文件 /usr/lib/systemd/system/redis_exporter.service
[Unit] |
启动 redis_exporter
服务
# systemctl daemon-reload |
redis_exporter
服务启动后,默认启动 9121
端口提供 Metrics 数据供 Prometheus 抓取。
redis_exporter 配置
redis 实例及认证信息配置
如果要通过一个 redis_exporter
实例监控多个 Redis 实例,可以参照以下配置文件配置 Redis 实例及其认证信息,如果无需密码认证,则保留密码项为空。
|
修改 redis_exporter
启动参数,使其读取上面配置的实例和其认证信息
/usr/bin/redis_exporter -redis.password-file /etc/redis_exporter_pwd_file.json |
配置 Prometheus 抓取 redis_exporter 指标
参考以下配置使用文件发现的方式配置被监控的 Redis 实例
|
targets-redis-instances.yml
文件内容包含 Targets 内容:
- labels: |
向 Telegram 发送消息
环境信息
- Centos 7
- Python 3
在 Telegram 中生成 Bot
首先在 telegram 中搜索
@BotFather
,和其对话,根据提示创建 机器人,记录下生成的token
信息创建新的 Channel 或者 Group 或者将刚刚新建的 Bot 加入已有的 Channel/Group。
获取 ChatGroup ID,可以使用以下方法之一
添加机器人
@getmyid_bot
到 Channel,会自动显示Chat ID
使用以下代码获取
>>> import requests
>>> response = requests.get(f'https://api.telegram.org/bot{token}/getUpdates')
>>> data = response.json()
>>> chat_id = data['result'][0]['message']['chat']['id']
>>> chat_id
-992754669
使用 curl 向 telegram 发送消息
$ curl -v "https://api.telegram.org/bot{token}/sendMessage?text=sa&chat_id=-992754669" |
使用 python 向 telegram 发送消息
使用 requests 库
>>> import requests |
使用 telegram 库
需要安装 python-telegram-bot
pip install --upgrade python-telegram-bot |
发送消息代码
>>> import telegram |
如果需要在非异步环境中(例如 Django 试图函数) 运行以上异步代码,会报错: RuntimeError: There is no current event loop in thread 'Thread-1'
。需要特殊处理,可以使用 asyncio.run()
函数来运行异步代码,它可以在非异步环境中创建一个新的事件循环并运行异步函数。
Django 视图中参考代码如下
def send_message_to_tg(chat_id: int, text: str): |
Nginx 安装及升级
本文档主要做为需要安装或升级 Nginx 版本或者需要重新编译 Nginx 为其添加新模块时的参考。Nginx 服务常用配置说明
环境信息
- Centos 7 5.4.225-1
- nginx stable 1.24.0
编译安装 Nginx
编译安装 Nginx 之前,首先需要安装依赖包 [1]
pcre
cd /tmp |
zlib
cd /tmp |
openssl
cd /tmp |
编译安装 Nginx
下载 Nginx stable 版本编译安装
wget https://nginx.org/download/nginx-1.24.0.tar.gz |
要启用或者停用指定的 Nginx 自带模块,参考 Nginx 编译配置选项说明
此处编译配置添加第三方模块 nginx-module-vts
以支持 Prometheus。执行以下命令编译 Nginx 并添加第三方模块 nginx-module-vts
。Nginx 和 nginx-module-vts 版本兼容列表
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.tar.gz |
编译安装后的软件包,只需要安装好依赖,便可以迁移到其他机器上面使用,本文档编译安装后的软件包下载链接
为 Nginx 配置 systemd 管理配置文件
为了能使用 systemctl
管理源码编译安装的 nginx,可以为其使用以下配置文件将其托管到 systemd
[Unit] |
Prometheus 采集 Nginx 监控数据
参考步骤安装 nginx-module-vts
模块,以支持 Prometheus 采集 Nginx 统计数据。
如果要统计 Nginx 所有的 vhost 数据,则将 nginx-module-vts
模块相关配置放置于 http
模块内,否则可以在只想要监控(统计)的 vhost (server
配置段) 中添加配置。
nginx-module-vts
模块相关配置命令说明:
命令 | 说明 | 用法示例 |
---|---|---|
vhost_traffic_status_zone |
定义 vhost_traffic_status 模块使用的共享内存区域。用于存储虚拟主机的流量统计信息 |
vhost_traffic_status_zone shared_memory_name size; shared_memory_name 是共享内存区域的名称,size 是共享内存区域的大小。 |
vhost_traffic_status_filter_by_host |
按主机名过滤虚拟主机状态信息 默认会将流量全部计算到第一个 server_name 上;启用后,只会显示与请求的主机名匹配的虚拟主机状态信息。 |
vhost_traffic_status_filter_by_host on; |
vhost_traffic_status_filter_by_set_key |
根据自定义键值对来过滤虚拟主机的状态信息 | vhost_traffic_status_filter_by_set_key $host$request_uri; |
vhost_traffic_status_filter_by_set_zone |
过滤器使用的共享内存区域 | |
vhost_traffic_status_display |
用于显示虚拟主机状态信息的格式 支持 json 、CSV 和 html |
vhost_traffic_status_display_format html; |
vhost_traffic_status_display_format |
用于显示虚拟主机状态信息的字段格式。 可以选择显示的字段有:request、status、request_time、request_length、request_method、request_uri、request_length、request_time、request_time_counter、request_time_counter_overflows、request_time_min、request_time_max、request_time_avg、request_time_median、request_time_percentile。 |
vhost_traffic_status_display_format field1 field2 ...; |
为了获取所有域名的统计信息,在 Nginx 的 http
模块内添加以下配置:
http { |
重载配置后查看请求内容:
# curl localhost:8888/status |
统计信息输出结果支持多种格式:
localhost:8888/status/format/json
- Jsonlocalhost:8888/status/format/html
- Htmllocalhost:8888/status/format/jsonp
- Jsonplocalhost:8888/status/format/prometheus
- Prometheuslocalhost:8888/status/format/control
- control
在 Prometheus 中添加以下 Targets 配置抓取 nginx-module-vts
模块暴露出的统计信息
- job_name: "Nginx" |
在 Prometheus 中检查抓取到的数据
常见错误
error while loading shared libraries
Nginx 编译安装成功后,启动报错
$ /usr/local/nginx-1.24.0/sbin/nginx -t |
问题原因 为 Nginx 在系统的库文件路径中未找到已经安装的 libpcre2-8.so.0
库文件。可以通过以下方式验证
- 搜索
libpcre2-8.so.0
,可以看到系统上已经存在此库文件/usr/local/lib/libpcre2-8.so.0
$ find / -name libpcre2-8.so.0
/usr/local/lib/libpcre2-8.so.0 - 检查此库文件是否在系统已加载的库文件中。执行以下命令搜索系统已经加载的库文件,发现没有
/usr/local/lib/libpcre2-8.so.0
$ ldconfig -p | grep libpcre
libpcre32.so.0 (libc6,x86-64) => /lib64/libpcre32.so.0
libpcre16.so.0 (libc6,x86-64) => /lib64/libpcre16.so.0
libpcreposix.so.0 (libc6,x86-64) => /lib64/libpcreposix.so.0
libpcrecpp.so.0 (libc6,x86-64) => /lib64/libpcrecpp.so.0
libpcre.so.1 (libc6,x86-64) => /lib64/libpcre.so.1 - 检查系统共享库文件的查找路径的配置文件
/etc/ld.so.conf
,发现其中不包括路径/usr/local/lib/
,因此位于此路径下的共享库文件无法被搜索到$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
要解决此问题,可以使用以下方法之一:
添加
/usr/local/lib/
到系统共享库查找路径配置文件/etc/ld.so.conf
/etc/ld.so.conf include ld.so.conf.d/*.conf
/usr/local/lib/执行以下命令,使配置生效
ldconfig
设置系统环境变量
LD_LIBRARY_PATH
,这个变量定义了系统共享库的查找目录。将/usr/local/lib
添加到此变量的值中,要永久生效需要将其写入配置文件,如~/.bash_profile
等export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
创建符号链接
ln -s /usr/local/lib/libpcre2-8.so.0 /usr/local/nginx-1.24.0/sbin/libpcre2-8.so.0
或者
ln -s /usr/local/lib/libpcre2-8.so.0 /lib64/libpcre2-8.so.0
SSL modules require the OpenSSL library
执行以下命令执行编译前配置时报错 ./configure: error: SSL modules require the OpenSSL library.
:
# ./configure --prefix=/usr/local/nginx-1.24.0 \ |
此报错原因为未找到 OpenSSL 的库文件。
针对此场景,可以通过在编译配置时指定 OpenSSL 的源码中库文件的具体位置(--with-openssl=/tmp/openssl-1.1.1t
),参考以下命令
./configure --prefix=/usr/local/nginx-1.24.0 \ |
Error 127
Nginx 执行 make
命令时报错: /bin/sh: line 2: ./config: No such file or directory
# ./configure --prefix=/usr/local/nginx-1.24.0 \ |
错误信息表明在编译 nginx 时,make
命令无法找到 OpenSSL 的配置脚本 config
。此脚本位于 OpenSSL 的源码目录中。可以通过 --with-openssl=/tmp/openssl-1.1.1t
指定。
修改编译前的配置命令如下:
./configure --prefix=/usr/local/nginx-1.24.0 \ |
getpwnam(“nginx”) failed
nginx 报错
nginx: the configuration file /usr/local/nginx-1.24.0/conf/nginx.conf syntax is ok |
问题原因 为 nginx
用户不存在,创建 nginx
用户或者修改配置文件,使用已有的用户运行 nginx
参考链接
脚注
Prometheus 指标汇总
环境信息
- Prometheus 2.44.0
- Grafana 9.5.2
- Kubernetes 1.24
Kubernetes 相关指标
Kubernetes 中部署并监控 Kubernetes 集群参考。配置 Prometheus 监控 Kubelet 之后可以采集到 Kubelet 监控指标。
配置 Prometheus 读取 cAdvisor 之后可以通过 cAdvisor 采集到容器相关的监控指标。
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
kubelet_pod_start_duration_seconds_count |
Pod 启动的时间 | ||
kubelet_pod_start_duration_seconds_bucket |
Pod 启动的时间的延迟直方图数据 | kubelet_pod_start_duration_seconds_bucket{le="0.5"} |
|
kubelet_running_pods |
运行的 Pod 的数量 | ||
kubelet_running_containers |
运行的 Containers 的数量 | ||
kubelet_runtime_operations_errors_total |
Kubelet 和 CRI 交互产生的错误(类型) | ||
kubelet_started_containers_total |
Kubelet 启动的 Container 总数 | ||
kubelet_started_pods_total |
Kubelet 启动的 Pod 总数 | ||
kubelet_volume_stats_available_bytes |
PV Volume 可以使用的磁盘空间 | ||
kube_node_status_allocatable kube_node_status_capacity |
节点的可分配的 资源 数量 | kube_node_status_allocatable{resource="pods"} 节点可分配的 Pod 的数量 |
|
kubelet_started_pods_total |
Counter |
已启动的 Pod 数量 | |
container_cpu_usage_seconds_total |
Counter |
Container 使用的 CPU | |
container_memory_usage_bytes |
Gauge |
Pod 使用的内存 | container_memory_usage_bytes{namespace="default"} |
kube_pod_container_status_restarts_total |
Counter |
Pod 的重启次数 |
nginx-ingress-controller 相关指标
配置 Prometheus 监控 Ingress-Nginx-Controller 指标 后,Prometheus 可以读取到 Ingress-Nginx-Controller 暴露的监控指标。
Grafana 中配置使用 Ingress-Nginx-Controller 指标示例
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
nginx_ingress_controller_requests |
Counter |
Ingress Nginx Controller 接收到的所有请求数,,包括各个状态码 | irate(nginx_ingress_controller_requests[2m]) - 请求速率 |
nginx_ingress_controller_nginx_process_connections |
连接数,包括各个状态码 | ||
nginx_ingress_controller_request_duration_seconds_sum |
请求持续时间的总和 请求持续时间是从请求进入 Ingress 控制器开始,到响应返回给客户端结束的整个时间 |
||
nginx_ingress_controller_request_duration_seconds_count |
请求持续时间的计数。 | 计算平均请求持续时间:平均请求持续时间 = 请求持续时间总和 / 请求持续时间计数 | |
nginx_ingress_controller_ingress_upstream_latency_seconds_sum |
upstream 占用时间的总和 upstream 占用时间是指请求从 Ingress 到达 upstream(backend)服务器的时间 |
||
nginx_ingress_controller_ingress_upstream_latency_seconds_count |
upstream 上游占用时间的计数 | 计算平均上游占用时间:平均上游占用时间 = 上游占用时间总和 / 上游占用时间计数。 |
node 相关指标
主机信息
包括 CPU 架构、内核版本、操作系统类型、主机名等,集中在指标 node_uname_info
中。
CPU
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_cpu_seconds_total |
Counter |
CPU 使用时间 | node_cpu_seconds_total{mode="idle"} - CPU 空闲时间 |
统计节点 CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
Memory
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_memory_MemTotal_bytes |
Gauge |
总的内存 | |
node_memory_MemFree_bytes |
Gauge |
空闲内存 | |
node_memory_Cached_bytes |
Gauge |
Cache 内存 | |
node_memory_Buffers_bytes |
Gauge |
Buffers 内存 |
统计节点的 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 |
Network
指标名称 | 类型 | 说明 | 示例 |
---|---|---|---|
node_network_receive_bytes_total |
Counter |
网卡接收的流量 | |
node_network_transmit_bytes_total |
Counter |
网卡发送的流量 |
网卡流量带宽
irate(node_network_receive_bytes_total{device!~"cni0|docker.*|flannel.*|veth.*|virbr.*|lo",kubernetes_io_hostname=~"$node"}[$prometheusTimeInterval]) |
Django model 使用
环境信息
- Python 3.10
- Django 4.1
在 Project/App 的 models.py
文件中创建 model
,当 model 定义完成,Django 会自动生产一个后台管理接口,允许认证用户添加、更改和删除对象,只需在管理站点上注册模型即可 [1]
创建 model
在 Project/App 的 models.py
文件中创建 model
from django.db import models |
对修改后的 model
进行 migrate
,以使在数据库中变更更改。
python manage.py makemigrations |
model 注册到后台
在 Project/App 的 admin.py
文件中注册 model
from django.contrib import admin |
更多有关 admin 配置方法,请参考 Django admin 配置