2024年8月

精彩回顾 | CommunityOverCode Asia 2024 在杭圆满收官

闪电演讲主题
:《OSGraph:以图谱思维重新思考开源数据》

大家能看到我最近一直在折腾与
OSGraph
这个产品相关的事情,之前在文章
《妙用OSGraph:发掘GitHub知识图谱上的开源故事》
中向大家阐述过这个产品的设计理念和应用价值。比方说以下问题就可以在OSGraph上找到明确的答案。

从技术角度说,我们是用GitHub开放数据结合图技术(TuGraph)解答了上述问题。而在产品的未来规划中,除了功能性的建设之外,还有一个很重要的一个方向就是更丰富的底层图谱数据,而不仅限于当下的GitHub数据。

当然,最典型的莫过于论文数据,这个我也在文章
《论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样》
表述过这部分数据的价值。为此,确实花了不少力气手动整理了图计算系统15年来的论文图谱。200多篇论文加班加点
地逐个翻下来,真的会手指发抖,血压升高……

所幸的是,这些付出并未白费。用
Awesome-Graphs
这个项目,不仅对图计算系统论文做了收录整理,还可以很清楚地描述未来OSGraph上论文图谱的产品形态,同时还可以为每个论文生成一份独一无二的血缘名片,既而带出最近更新的图计算系统论文解读文:

  1. 《我用Awesome-Graphs看论文:解读Pregel》
  2. 《我用Awesome-Graphs看论文:解读PowerGraph》
  3. 《我用Awesome-Graphs看论文:解读X-Stream》
  4. 《我用Awesome-Graphs看论文:解读Naiad》
  5. 《我用Awesome-Graphs看论文:解读GraphBolt》

更意外的是,OSPO的边sir突然找来希望可以在月底的Apache COC上做一个OSGraph主题的lightning talk(闪电演讲)。当时我就在想,既然要讲OSGraph,这块内容不刚好可以加点料么

与一般的演讲不同,lightning talk主打一个字就是“快”

,整个演讲过程只有5min,并且会严格计时。所以,如何在5min内给听众表达清楚你的观点,就很具挑战性了,整个一开源版的“电梯一分钟”。做开源布道这么久以来,演讲没少搞,但带这种特殊要求的还真没搞过,我的“胜负欲”上来了,那不得挑战一下自己么!

玩归玩,闹归闹,认真对待肯定少不了。既然要在5min讲清楚一个完整的故事,那演讲思路必须要清晰。

首先,就是演讲主题要吸睛?OSGraph一直以来的官方的表述是:“一个开源图谱关系洞察工具”,说实话确实太官方、太技术了。为了让主题更鲜明,最终确定了演讲主题是:“像图一样重新思考开源数据”。修改后相比前者会更容易引导听众的好奇心:怎么重新思考的?像图一样应该是什么样?

其次,就是立意要鲜明。就是想输出什么理念,传递什么价值观?说白了,就是勾起用户好奇心的问题,能不能通过你的立意得到解决。这里跳过思考的路径,直接抛出结论:“
我们认为2跳图特征可以作为描述图分析的基本单位,或者叫图分析的第一性原理
”。

听起来有点悬,看一下ppt图就明白了。熟悉OSGraph产品功能的同学,一眼就能看出来,不管是开发者贡献、开源协作、项目社区、开发兴趣等图谱,都可以拆解为2跳图特征去表述。甚至多跳的图特征最终也可以通过多步拆解表述为2跳图特征的组合。

有了2跳图特征的假设,既而推导出现有的图谱渲染逻辑,从而校验了这个假设的正确性。这也就回应了听众的“怎么用图重新思考”这个问题。

然后,就是例证有趣。光有严谨的推导逻辑,还不足以打动听众,结合生动有趣的例子,会让立意的观点更加深刻令人信服。

最后,肯定是展望,也就是“画大饼”环节。这时候,Awesome-Graphs的工作也就派上了用场。

当然,要保证严格的时间控制,一定要做充分预演。前面的slides内容准备完成后,我发现足足有19页,瞬间汗就下来了。简单计算一下,平均每页演讲时间不能超过5 * 60 / 19 = 15.8s,基本上也就2~3句话的时间。这部分就没有捷径了,只能不断retry,最终我这part的lightning talk结束后,用时4'45s,和我自己排练的用时基本一致(Richard Lin看到我在最后1min时偷瞄了一下计时器,连倒计时提醒都省了

)。全程体验完lightning talk,从看别人讲到自己上,简单描述就是:别开生面、紧张刺激、好玩有趣!

最后的最后,谈一下产品的用户反馈。大会期间,我先后给Paul King(Apache Groovy VP)、Dirk-Willem(ASF VP)、Tison等社区朋友当面演示了OSGraph的产品功能,获得了一致的好评,尤其是海外人士都表示这是一件很酷的事情。lightning talk结束后,也陆陆续续听到不少用户认可的反馈,感觉过去所做的一切都是值得的!

7月份的事情暂时收尾了,感谢所有参与到OSGraph项目中的同学、感谢OSPO、感谢社区伙伴,也要感谢一直在路上的自己!

无缝融入,即刻智能[1]:MaxKB知识库问答系统,零编码嵌入第三方业务系统,定制专属智能方案,用户满意度飙升

1.简介

MaxKB(Max Knowledge Base)是一款基于 LLM 大语言模型的开源知识库问答系统,

飞致云是中国领先的开源软件公司。飞致云旗下开源产品包括 1Panel 开源面板、JumpServer 开源堡垒机、DataEase 开源数据可视化分析工具、MeterSphere 开源测试工具、Halo 开源建站工具、MaxKB 开源知识库问答系统等,涵盖运维面板、运维审计、BI 分析、软件测试、CMS 建站、知识库问答等多个领域。飞致云旗下的开源项目在开源社区表现出了卓越的成长性,在代码托管平台 GitHub 上所获得的 Star 总数已经超过 12 万。

1.1 产品优势

  • 开箱即用:支持直接上传文档、自动爬取在线文档,支持文本自动拆分、向量化、RAG(检索增强生成),智能问答交互体验好;

  • 无缝嵌入:支持零编码快速嵌入到第三方业务系统,让已有系统快速拥有智能问答能力,提高用户满意度;

  • 灵活编排:内置强大的工作流引擎,支持编排 AI 工作流程,满足复杂业务场景下的需求;

  • 模型中立:支持对接各种大语言模型,包括本地私有大模型(Llama 3 / Qwen 2 等)、国内公共大模型(通义千问 / 智谱 AI / 百度千帆 / Kimi / DeepSeek 等)和国外公共大模型(OpenAI / Azure OpenAI / Gemini 等)。

记得使用最新版本!!

  • 新增功能


    • 【知识库】支持创建空知识库。
    • 【知识库】创建和设置知识库时支持选择不同的向量模型进行向量化。
    • 【模型管理】支持添加 OpenAI 、Ollama 和本地的向量模型。
    • 【模型管理】支持把模型权限设置为公用或私有。
    • 【应用】高级编排的指定回复节点支持快捷问题输出:快捷问题。
    • 【应用】支持设置浮窗模式的对话框入口图标。(X-Pack)
    • 【应用】支持自定义对话框的AI回复的头像。(X-Pack)
    • 【应用】支持设置浮窗模式的对话框是否可拖拽位置。(X-Pack)
    • 【应用】支持设置对话框是否显示历史记录。(X-Pack)
    • 【系统设置】支持LDAP单点登录。(X-Pack)
    • 【系统设置】支持自定义主题外观,设置系统的网站 logo、登录 logo、主题色、登录背景图、网站名称、欢迎语等。(X-Pack)
    • 【系统设置】开放系统 API。(X-Pack)
  • 功能优化


    • 【知识库】优化文档索引流程,提高知识点召回率。
    • 【知识库】调整分段内容最大长度为 10 万个字符。
    • 【应用】调整关联知识库时只能选择使用相同向量模型的知识库。
    • 【应用】显示知识来源调整至显示设置中。
    • 【模型管理】优化模型列表样式。
    • 【关于】优化关于页面显示信息。

1.2 版本功能 VS版本对比

  • 知识库管理

  • 应用管理

  • 大语言模型对接

  • 系统管理和设置

  • 安装部署/服务规格/产品价格

1.3 MaxKB系统架构

  • 整体架构

  • 实现原理

  • 技术栈
    • 前端:Vue.js、logicflow
    • 后端:Python / Django
    • Langchain:Langchain
    • 向量数据库:PostgreSQL / pgvector
    • 大模型:Ollama、Azure OpenAI、OpenAI、通义千问、Kimi、百度千帆大模型、讯飞星火、Gemini、DeepSeek等。

2.安装部署

2.1 离线安装

  • 环境要求

安装前请确保您的系统符合安装条件:

  • 操作系统:Ubuntu 22.04 / CentOS 7 64 位系统;

  • CPU / 内存: 推荐 2C/4GB 以上;

  • 磁盘空间:100GB;

  • 浏览器要求:请使用 Chrome、FireFox、Edge 等现代浏览器;

  • 生产环境推荐使用离线部署

  • 离线部署 [✔]

注意:离线包仅支持 x86 服务器。

打开社区网站下载 MaxKB 离线包
社区版离线包

上传至服务器后进行解压缩,执行以下命令:

#maxkb-v1.2.0-offline.tar.gz替换成下载包的名字  
tar -zxvf maxkb-v1.2.0-offline.tar.gz

安装 MaxKB, 执行以下命令:

#进入安装包解压缩后目录  
cd maxkb-v1.2.0-offline

#执行安装命令
bash install.sh

  • 如果遇到docker安装相关问题可以参考下述链接:

一文带你入门向量数据库milvus:含docker安装、milvus安装使用、attu 可视化,完整指南启动 Milvus 进行了向量相似度搜索

安装成功后,可通过浏览器访问 MaxKB:

http://目标服务器 IP 地址:8080

默认登录信息
用户名:admin
默认密码:MaxKB@123..

  • 离线升级


2 离线部署
执行步骤一样.

2.2 在线安装

  • 环境要求

安装前请确保您的系统符合安装条件:

  • 操作系统:Ubuntu 22.04 / CentOS 7 64 位系统;

  • CPU / 内存: 推荐 2C/4GB 以上;

  • 磁盘空间:100GB;

  • 浏览器要求:请使用 Chrome、FireFox、Edge 等现代浏览器;

  • 可访问互联网

  • 在线快速部署

MaxKB 支持一键启动,仅需执行以下命令:

docker run -d --name=maxkb -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data cr2.fit2cloud.com/1panel/maxkb

友情提示:社区版限制 1 个团队成员,5 个应用,50 个知识库。

安装成功后,可通过浏览器访问 MaxKB:

http://目标服务器 IP 地址:目标端口

默认登录信息
用户名:admin
默认密码:MaxKB@123..

如果使用的是云服务器,请至安全组开放目标端口。

  • 在线升级

注意:升级前确认数据持久化目录(-v 后的目录),创建新容器时要跟上一次数据持久化目录保持一致,否则启动后数据为空。
执行以下命令:

1 下载最新镜像

docker pull cr2.fit2cloud.com/1panel/maxkb

2 确认上一次数据持久化目录,复制保存,第 4 步使用

3 删除正在运行的 MaxKB 容器

4 创建并启动 MaxKB 容器

docker run -d --name=maxkb -p 8080:8080 -v /opt/maxkb/pgsql/data:/var/lib/postgresql/data cr2.fit2cloud.com/1panel/maxkb

#注意:确认数据持久化目录(-v后的目录)要跟【第 2 步】的目录保持一致,否则启动后数据为空。

2.3 1Panel安装

关于 1Panel 的安装部署与基础功能介绍,请参考 1Panel 官方文档。在完成了 1Panel 的安装部署后,根据提示网址打开浏览器进入 1Panel,如下界面。

  • 安装 MaxKB

进入应用商店应用列表,在【 AI / 大模型】分类下找到 MaxKB 应用进行安装。

在应用详情页选择最新的 MaxKB 版本进行安装,进行相关参数设置。

  • 名称:要创建的 MaxKB 应用的名称。
  • 版本:选择 MaxKB 最新版本。
  • 端口:MaxKB 应用的服务端口。
  • 容器名称:MaxKB 应用容器名称。
  • CPU 限制:MaxKB 应用可以使用的 CPU 核心数。
  • 内存限制:MaxKB 应用可以使用的内存大小。
  • 端口外部访问:MaxKB 应用可以使用 IP:PORT 进行访问(MaxKB 应用必须打开外部端口访问)。

点击开始安装后,页面自动跳转到已安装应用列表,等待安装的 MaxKB 应用状态变为已启动。

  • 访问 MaxKB

安装成功后,通过浏览器访问如下页面登录 MaxKB:

地址: http://目标服务器IP地址:服务运行端口(默认 8080)     
用户名: admin    
密码: MaxKB@123..

第一次登录需修改 admin 用户的密码,修改密码后,重新登录系统即可使用 MaxKB。

2.4 kbctl运维工具

  • kbctl 命令

MaxKB 离线安装包默认内置了命令行运维工具 kbctl,通过执行 kbctl help,可以查看相关的命令说明。

Usage:
kbctl [COMMAND] [ARGS...]
kbctl --help

Commands: 
status              查看 MaxKB 服务运行状态
start               启动 MaxKB 服务
stop                停止 MaxKB 服务
restart             重启 MaxKB 服务
reload              重新加载 MaxKB 服务
uninstall           卸载 MaxKB 服务
upgrade             升级 MaxKB 服务
version             查看 MaxKB 版本信息

3. MaxKB快速实践

3.1 登录 MaxKB 系统

使用浏览器打开服务地址:http://目标服务器IP地址:目标端口。
默认的登录信息:
用户名:admin
默认密码:MaxKB@123..

3.2 添加模型

3.2.1 添加千帆大模型

点击【添加模型】,选择供应商【千帆大模型】,直接进入下一步填写千帆大模型表单。 或者左侧供应商先选择【千帆大模型】,然后点击【添加模型】,则直接进入千帆大模型表单。

  • 模型名称: MaxKB 中自定义的模型名称。
  • 模型类型: 大语言模型。
  • 基础模型: 为供应商的 LLM 模型,支持自定义输入官方模型,选项中列了的一些常用的大语言模型。 注意自定义基础模型名称需保证与供应商平台的模型名称一致才能校验通过。
  • API Key 和 Secret Key:千帆大模型中应用的 API Key 和 Secret Key(需要先创建应用)

3.2.2 添加 Ollama 模型

API 域名和 API Key: 为供应商的连接信息(Ollama 服务地址, 如:
http://42.92.198.53:11434
)。若没有 API Key 可以输入任意字符。
点击【添加】后 校验通过则添加成功,便可以在应用的 AI 模型列表选择该模型。

3.2.3 添加 Azure OpenAI 模型

基础模型: 为供应商的 LLM 模型,支持自定义输入和下拉选项,当前可下拉选择的大语言模型如:gpt-3.5-turbo-0613、gpt-3.5-turbo-0301、gpt-3.5-turbo-16k-0613 等。

API 域名、API Key、部署名称: 是 Azure OpenAI 的模型部署中提供的,需要填写一致,参考下图:

3.2.4 添加 OpenAI 大模型

基础模型: 为供应商的 LLM 模型,支持自定义输入,下拉选项是 OpenAI 常用的一些大语言模型如:gpt-3.5-turbo-0613、gpt-3.5-turbo、gpt-4 等。
API 域名(国外):
https://api.openai.com/v1
。 API 域名:国内服务器反向代理地址 / v1。 API Key:访问 OpenAI 的 Key。

3.2.5 添加讯飞星火大模型

基础模型: 支持自定义输入,对应接口文档中 domain,下拉选项是讯飞星火常用的一些大语言模型。
API 域名:每个基础模型对应的 API 域名不同,请根据所选基础模型输入对应的 API 域名,参考
讯飞星火官方文档

APP ID、API Key、Secret Key 需要现在讯飞星火开放平台创建应用,并且应用的剩余 tokens>0,才能添加成功。


3.2.6 添加智谱 AI 大模型

API Key: 需要现在智谱 AI 开放平台创建。

3.2.7 添加通义千问大模型

API Key: 需要在阿里云 ->DashScope 灵积模型服务 ->API Key 管理中获取。


3.2.8 添加 Kimi 大模型

API 域名:
https://api.moonshot.cn/v1
API Key: 在 Kimi 账户中心的 API Key 管理中获取 key。

3.2.9 添加 DeepSeek 大模型

API Key: 在
DeepSeek 官方
获取 API Key。

3.2.10 添加 Gemini 大模型

注意:使用 Gemini API 需要确保程序所在服务器位于
Gemini API 所支持的地区
,否则无法调用 API,并且无法进入 Google AI Studio。

3.3 创建通用型知识库

打开【知识库】页面,点击【创建知识库】,进入创建知识库页面。 输入知识库名称、知识库描述、选择通用型知识库类型。 然后将离线文档通过拖拽方式或选择文件上传方式进行上传。

  • 上传文档


    • 上传文档要求:
      • 支持文本文件格式为:Markdown、TXT、PDF、DOCX、HTML; 支持 QA 问答对格式为:Excel、CSV;
      • 每次最多上传 50 个文件;
      • 每个文件不超过 100 MB; 支持选择文件夹,上传文件夹下符合要求的文件。
  • 文档规范建议:


    1. 规范分段标识:离线文档的分段标识要有一定规范,否则拆分出来的段落会不规整。
    2. 段落要完整:一个分段中最好能描述一个完整的功能点或问题。

  • 设置分段规则

智能分段

MarkDown 类型的文件分段规则为:根据标题逐级下钻式分段(最多支持 6 级标题),每段的字符数最大为 4096 个字符;   
                        当最后一级的文本段落字符数超过设置的分段长度时,会查找分段长度以内的回车进行截取。     
HTML、DOCX 类型的分段规则为:识别标题格式转换成 markdown 的标题样式,逐级下钻进行分段(最多支持 6 级标题)每段的字符数最大为 4096 个字符;
TXT和 PDF 类型的文件分段规则为:按照标题# 进行分段,若没有#标题的则按照字符数4096个字符进行分段,会查找分段长度以内的回车进行截取。  

高级分段

用户可以根据文档规范自定义设置分段标识符、分段长度及自动清洗。   
分段标识支持:#、##、###、####、#####、######、-、空行、回车、空格、分号、逗号、句号,若可选项没有还可以自定义输入分段标识符。   
分段长度:支持最小 50个字符,最大 4096 个字符。   
自动清洗:开启后系统会自动去掉重复多余的符号如空格、空行、制表符等。     

导入时添加分段标题为关联问题

勾选后会把所有分段的标题设置为分段的关联问题。

预览

  • 分段规则设置完成后,需要点击【生成预览】查看最新规则的分段效果。

  • 用户可在分段预览中对不合理的分段进行编辑和删除。

  • 点击【创建并导入】后,系统会对文档进行自动分段 -> 存储 -> 向量化处理操作。在创建完成页面可以看到导入的文档数量、分段数量和字符数。

4. 创建应用

点击【创建应用】,输入应用名称,选择【简易配置应用】,点击【创建】

  • 应用创建完成,进入简易配置应用的设置页面,左侧为应用信息,右侧为调试预览界面。
  • 应用名称:用户提问时对话框的标题和名字。
  • 应用描述:对应用场景及用途的描述。
  • AI 模型: 在【系统设置】-【模型管理】中添加的大语言模型。
  • 提示词:系统默认有智能知识库的提示词,用户可以自定义通过调整提示词内容,可以引导大模型聊天方向. 多轮对话: 开启时当用户提问携带用户在当前会话中最后 3 个问题;不开启则仅向大模型提交当前问题题。
  • 关联知识库:用户提问后会在关联的知识库中检索分段。
  • 开场白:用户打开对话时,系统弹出的问候语。支持 Markdown 格式;[-] 后的内容为快捷问题,一行一个。
  • 问题优化:对用户提出的问题先进行一次 LLM 优化处理,将优化后的问题在知识库中进行向量化检索;
  • 开启后能提高检索知识库的准确度,但由于多一次询问大模型会增加回答问题的时长。

应用信息设置完成后,可以在右侧调试预览中进行提问预览,调试预览中提问内容不计入对话日志。

  • 参数设置详细说明
    1. 检索模式:


      • 向量检索
        :使用向量模型通过向量距离计算与用户问题最相似的文本分段;
      • 全文检索
        :通过关键词检索,返回包含关键词最多的文本分段;
      • 混合检索
        :同时执行全文检索和向量检索,再进行重排序,从两类查询结果中选择匹配用户问题的最佳结果。
    2. 相似度:


      • 相似度越高代表问题和分段的相关性越强。
    3. 引用分段数:


      • 提问时按相似度携带 N 个分段生成提示词询问 LLM 模型。
    4. 引用最大字符数:


      • 引用分段内容设置最大字符数,超过时则截断。
    5. 无引用知识库时,有 2 种处理方式可设置:


      • 继续提问
        :可以自定义设置提示词,需要有 {question} 用户问题的占位符,才会把用户问题发送给模型。
      • 指定回复内容
        :当没有命中知识库分段时可以指定回复内容。

以上 4 步完成后,便可进行问答对话了。

5. 效果展示

在应用列表页面,点击【演示】或者点击应用面板,在概览页面点击演示或复制公开访问链接至浏览器进入问答页面进行提问。

6. 对话日志

在对话日志钟记录了所有用户会话中的问答详情,包括用户对 AI 回答的反馈信息。 维护人员可以通过查看对话日志和用户反馈来修正答案。

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

更多优质内容请关注CSDN:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

zabbix搭建

简介

Zabbix 是一个开源的监控解决方案,用于监控各种网络服务、服务器和其他网络硬件。它能够采集各类监控数据,并提供强大的报警和报告功能。

1. 前置环境准备

我们采用编译安装的方式,需要提前准备好一个LNMP或者LAMP的环境

1.1 搭建LNMP

[root@oe01 ~]# yum install nginx php php-fpm -y

默认安装完之后php-fpm是采用socker通信的。我们将他修改为监听9000端口

[root@oe01 ~]# vim /etc/php-fpm.d/www.conf
38 listen = /run/php-fpm/www.sock
39 listen = 127.0.0.1:9000
[root@oe01 ~]# systemctl restart php-fpm

多添加一行即可,安装完php之后他会默认帮我们产生2个nginx的配置文件,我们不用他的。将他改名

[root@oe01 ~]# mv /etc/nginx/conf.d/php-fpm.conf /etc/nginx/conf.d/php-fpm.conf.bak
[root@oe01 ~]# mv /etc/nginx/default.d/php.conf /etc/nginx/default.d/php.conf.bak

然后我们重新编写一个nginx的配置文件

[root@oe01 ~]# cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
cp: overwrite '/etc/nginx/nginx.conf'? y
[root@oe01 ~]# vim /etc/nginx/nginx.conf
 43         location / {
 44             root   /data/zabbix;
 45             index  index.php index.html index.htm;
 46         }

 65         location ~ \.php$ {
 66             root           /data/zabbix;
 67             fastcgi_pass   127.0.0.1:9000;
 68             fastcgi_index  index.php;
 69             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 70             include        fastcgi_params;
 71         }

你的行号跟我的可能不太一样,大概是这些内容。然后重启nginx

[root@oe01 ~]# mkdir -p /data/zabbix
[root@oe01 ~]# systemctl restart nginx

接下来自行去测试php是否可以正常解析。如果可以那我们的LNMP环境就搭建完成了。接下来开始搭建监控。如果解析不了注意看网站根目录是在
/data/zabbix
,不要放错地方了

2. zabbix准备工作

现在我们开始安装php模块

2.1 安装php模块以及编译所需工具

root@oe01 ~]# yum install php-gd php-mbstring php-bcmath php-xml php-ldap php-mysqlnd mysql-devel pcre-devel openssl-devel zlib-devel libxml2-devel net-snmp-devel net-snmp libssh2-devel OpenIPMI-devel libevent-devel openldap-devel libcurl-devel gcc make -y

2.2 修改php配置

默认的php配置是无法让zabbix正常运行的,所以我们需要修改一下

[root@oe01 ~]# sed -i "s/post_max_size = 8M/post_max_size = 16M/g" /etc/php.ini
[root@oe01 ~]# sed -i "s/max_execution_time = 30/max_execution_time = 300/g" /etc/php.ini
[root@oe01 ~]# sed -i "s/max_input_time = 60/max_input_time = 300/g" /etc/php.ini
[root@oe01 ~]# systemctl restart php-rpm

这几个配置必须改,因为不改的话等会安装的时候会过不了环境检测的

2.3 编译安装zabbix

2.3.1 下载tar包

[root@oe01 opt]# wget https://cdn.zabbix.com/zabbix/sources/oldstable/6.2/zabbix-6.2.8.tar.gz
[root@oe01 opt]# ls zabbix-6.2.8.tar.gz 
zabbix-6.2.8.tar.gz

2.3.2 解压

[root@oe01 opt]# tar -zxvf zabbix-6.2.8.tar.gz

2.3.3 创建用户/组

[root@oe01 opt]# groupadd --system zabbix
[root@oe01 opt]# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix User" zabbix

2.3.4 开始安装

[root@oe01 zabbix-6.2.8]# ./configure --sysconfdir=/etc/zabbix --enable-server --enable-agent --with-mysql --with-ssh2 --with-zlib --with-libpthread --with-libevent --with-libpcre --with-net-snmp --with-libcurl --with-libxml2 --with-openipmi --with-openssl --with-ldap

等待执行完成,如果有报错检查一下之前安装的东西是不是缺什么

正常执行完之后应该是这样的

***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

然后我们执行
make install

[root@oe01 zabbix-6.2.8]# make install
Making install in misc
make[1]: Entering directory '/opt/zabbix-6.2.8/misc'
make[2]: Entering directory '/opt/zabbix-6.2.8/misc'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/opt/zabbix-6.2.8/misc'
make[1]: Leaving directory '/opt/zabbix-6.2.8/misc'
make[1]: Entering directory '/opt/zabbix-6.2.8'
make[2]: Entering directory '/opt/zabbix-6.2.8'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/opt/zabbix-6.2.8'
make[1]: Leaving directory '/opt/zabbix-6.2.8'

执行完成是这样的

2.3.5 配置数据库

前面我们没有提到数据库的安装,因为LNMP里面的M就是MySQL/Mariadb,所以你自行安装就可以了,我还是安装一下吧

[root@oe01 zabbix-6.2.8]# yum remove mariadb-server  # 这一步不用执行,我是为了还原数据库
[root@oe01 zabbix-6.2.8]# yum install mariadb-server 
[root@oe01 zabbix-6.2.8]# systemctl restart mariadb
[root@oe01 zabbix-6.2.8]# mysql_secure_installation

完成初始化之后登录数据库

[root@oe01 zabbix-6.2.8]# mysql -uroot -p
MariaDB [(none)]> create database zabbix charset utf8 collate utf8_bin;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> create user 'zabbix'@'%' identified by '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> grant all on zabbix.* to 'zabbix'@'%';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

接下来导入数据到数据库

[root@oe01 zabbix-6.2.8]# cd database/mysql/
[root@oe01 mysql]# mysql -uroot -p123 zabbix < schema.sql 
[root@oe01 mysql]# mysql -uroot -p123 zabbix < images.sql 
[root@oe01 mysql]# mysql -uroot -p123 zabbix < data.sql 
[root@oe01 mysql]# mysql -uroot -p123 zabbix < double.sql 
[root@oe01 mysql]# mysql -uroot -p123 zabbix < history_pk_prepare.sql

注意顺序不要错。错了会导入失败报错的

到这里,zabbix的准备工作全部完成

3. 配置zabbix

3.1 修改配置文件

[root@oe01 ~]# vim /etc/zabbix/zabbix_server.conf
DBHost=192.168.200.179     # 改为数据库地址
DBPassword=123             # 改为数据库的密码
DBPort=3306                # 数据库的端口
ListenPort=10051           # 将这一行取消注释即可

然后我们启动zabbix

[root@oe01 ~]# zabbix_server -c /etc/zabbix/zabbix_server.conf

3.2 Web界面部署

[root@oe01 ~]# cd /data/zabbix/
[root@oe01 zabbix]# cp -r /opt/zabbix-6.2.8/ui/* .
[root@oe01 zabbix]# chown nginx:nginx -R /data/zabbix/

进入浏览器进行后续操作

语言选择简体中文

时间选择北京时间

这里有这个报错我们可以点击下载配置文件,然后传到服务器上去

传好之后点击完成,就会提示你zabbix已经配置好了

默认的登录用户名是
Admin
密码是
zabbix

服务端就已经搞定了

4. 安装agent

agent安装在被监控的节点上

[root@oe01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/6.2/rhel/8/x86_64/zabbix-release-6.2-3.el8.noarch.rpm
[root@oe01 ~]# yum install zabbix-agent2 -y

然后我们修改相关的配置文件

[root@oe01 ~]# vim /etc/zabbix/zabbix_agent2.conf
Server=192.168.200.179
[root@oe01 ~]# systemctl restart zabbix-agent2.service 

将server这里改为zabbix-server的地址

5. 添加主机

点进主机这里的时候会发现这里没有显示中文,我们需要将windows上的字体上传到服务器上

windows字体路径
C:\Windows\Fonts\msyh.ttc

[root@oe01 fonts]# pwd
/data/zabbix/assets/fonts

将字体上传到这个目录

[root@oe01 fonts]# ls
DejaVuSans.ttf  MSYH.TTC
[root@oe01 fonts]# mv DejaVuSans.ttf DejaVuSans.ttf.bak
[root@oe01 fonts]# mv MSYH.TTC DejaVuSans.ttf

将原有的字体文件备份,再将我们上传的字体改为之前的那个文件名即可,回到网页刷新

字体就已经出来了

Kotlin 字符串

字符串用于存储文本。

字符串包含由双引号包围的字符集合:

示例

var greeting = "Hello"


Java
不同,您不必指定变量是字符串。Kotlin 足够智能,可以通过双引号理解上例中的
greeting
变量是字符串。

然而,与其他数据类型一样,如果您坚持,可以指定类型:

示例

var greeting: String = "Hello"

注意:如果您想创建一个字符串但不赋值(并稍后赋值),您必须在声明变量时指定类型:

示例

这样是可以的:

var name: String
name = "John"
println(name)

示例

这样会产生错误:

var name
name = "John"
println(name)

访问字符串

要访问字符串的字符(元素),必须在方括号内引用索引号。

字符串索引从
0
开始。在下面的示例中,我们访问
txt
中的第一个和第三个元素:

示例

var txt = "Hello World"
println(txt[0]) // 第一个元素 (H)
println(txt[2]) // 第三个元素 (l)

[0]
是第一个元素,
[1]
是第二个元素,
[2]
是第三个元素,等等。

字符串长度

Kotlin 中的字符串是对象,包含可以对字符串执行某些操作的属性和函数,通过在特定字符串变量后写一个点字符(
.
)。例如,可以使用
length
属性找到字符串的长度:

示例

var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
println("txt 字符串的长度是: " + txt.length)

字符串函数

有许多可用的字符串函数,例如
toUpperCase()

toLowerCase()

示例

var txt = "Hello World"
println(txt.toUpperCase())   // 输出 "HELLO WORLD"
println(txt.toLowerCase())   // 输出 "hello world"

比较字符串

compareTo(string)
函数比较两个字符串,如果两者相等则返回
0

示例

var txt1 = "Hello World"
var txt2 = "Hello World"
println(txt1.compareTo(txt2))  // 输出 0 (它们相等)

查找字符串中的字符串

indexOf()
函数返回指定文本在字符串中首次出现的位置(包括空格):

示例

var txt = "Please locate where 'locate' occurs!"
println(txt.indexOf("locate"))  // 输出 7

记住,Kotlin 从零开始计数。

0
是字符串中的第一个位置,
1
是第二个,
2
是第三个……

字符串中的引号

要在字符串中使用引号,使用单引号(
'
):

示例

var txt1 = "It's alright"
var txt2 = "That's great"

字符串连接

可以在字符串之间使用
+
运算符将它们添加在一起,形成一个新的字符串。这称为连接:

示例

var firstName = "John"
var lastName = "Doe"
println(firstName + " " + lastName)

请注意,我们添加了一个空文本(
" "
)以在打印时在
firstName

lastName
之间创建一个空格。

您还可以使用
plus()
函数连接两个字符串:

示例

var firstName = "John "
var lastName = "Doe"
println(firstName.plus(lastName))

字符串模板/插值

除了连接,您还可以使用“字符串模板”,这是一种在字符串中添加变量和表达式的简单方法。

只需使用
$
符号引用变量:

示例

var firstName = "John"
var lastName = "Doe"
println("My name is $firstName $lastName")

“字符串模板”是 Kotlin 的一个流行特性,因为它减少了代码量。例如,您不必像在连接示例中那样在
firstName

lastName
之间指定空格。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:
Let us Coding
,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

背景:最近在写一个H5页面项目,头部有个菜单栏,需要固定在顶部不动,但是滑动之后设置并没有生效,之前开发中也遇到过类似的固定失效的情况,就去详细了解了下有哪些可能导致固定定位失效的情况。希望有些场景能帮助到你。下面我总结和详细说明了会导致失效的情况,那么我们接着往下看...

html代码:
(所有情况通用,以下不重复展示)

<body>
  <div class="parents">
    <div class="fixed">顶部固定菜单栏</div>
    <div class="scrollDiv">我定不住啊师傅!!</div>
  </div>
</body>

祖先元素的 CSS 变换(transform)、透视(perspective)或滤镜(filter)属性导致

如果一个元素的任何祖先元素应用了
transform

perspective

filter
属性等,这个元素的固定定位将相对于最近的具有变换的祖先元素进行定位,而不是相对于视口。

css代码:

 * {
      margin: 0;
      padding: 0;
    }

    .parents {
	  // 转换
      transform: translateY(10px)
    }

    .fixed {
      width: 100%;
      position: fixed;
      top: 0px;
      left: 0px;
      background-color: pink;
      text-align: center;
    }

    .scrollDiv {
      width: 100%;
      height: 2000px;
      background: skyblue;
    }
  • 当内容区域高度超出发生滚动时,我们在顶部固定定位的菜单栏是没法固定住,会随着滚动往上走。如下图:

以下其他情况示例图一样,我们就不做多展示,直接给出示例代码

父元素使用了
will-change
属性

类似于
transform
,使用
will-change
也可导致固定定位相对于此属性设置的元素,而非相对于视口。

  • 设置transformZ(0) 可以启动滑动加速,但是如果页面中有使用到固定定位,则会导致固定定位失效,原因是设置transformZ会使得被设置的元素脱离了文档流。

css代码示例:

   	.scrollDiv {
      will-change: transform;
    }
    .fixed {
      position: fixed;
      top: 10px;
      left: 10px;
      background-color: red;
    }

z-index

  • 虽然
    z-index
    不会导致固定定位“失效”,但如果其他元素的
    z-index
    值更高,固定定位的元素可能会被覆盖。确保合理设置
    z-index
    值,使得固定定位的元素在视觉上出现在页面的顶层。
    .fixed {
      position: fixed;
      top: 10px;
      left: 10px;
      background-color: red;
      z-index: 1;
    }
    .scrollDiv {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      z-index: 2;
    }

能滚动的元素使用了
-webkit-overflow-scrolling

  • 这个在 iOS 设备上会出现,如果在祖先元素上使用了 `-webkit-overflow-scrolling: touch;可能会影响固定定位元素的行为。

css代码:

 .scrollDiv {
      width: 100%;
      height: 2000px;
      background: skyblue;
     -webkit-overflow-scrolling: touch;
  }

视口单位(vh、vw)与固定定位结合使用

  • 正常情况下是没有问题的,但是当使用视口单位(如
    vh

    vw
    )来设置固定定位元素的大小或位置时,在虚拟键盘弹出或地址栏显示/隐藏时可能会有问题。

css代码:

.fixed {
      position: fixed;
      top: 10vh; /* 10% of viewport height */
      left: 10vw; /* 10% of viewport width */
      background-color: red;
}  

打印或预览模式

在打印或打印预览模式中,固定定位可能不会按预期工作,因为许多浏览器在打印时会忽略固定定位。

移动设备上的兼容性问题

一些移动设备上的浏览器对
fixed
定位的支持可能存在问题,尤其是当键盘弹起或处理复杂的页面交互时。

屏幕阅读器和辅助技术

使用屏幕阅读器等辅助技术时,
fixed
定位可能不会以预期的方式呈现。

写在后边

布局定位涉及到很多设备兼容的问题,有很多特殊场景我们可能并没有解释到。可能有些标准用法在某个设备上也会有异常,只是我们只需要兼容大多数,然后去解决必须兼容的设备。我们的开发就是不断完善+解决bug。

最后你有遇到过什么其他原因导致定位失败的吗?或者你有哪些开发中奇葩的样式问题。欢迎评论区讨论!