# 知识库

# 科学上网

#### 参考网站

- github:[https://github.com/shadowsocks/go-shadowsocks2?tab=readme-ov-file](https://github.com/shadowsocks/go-shadowsocks2?tab=readme-ov-file)
- 官方帮助:[https://pkg.go.dev/github.com/shadowsocks/go-shadowsocks2#readme-install](https://pkg.go.dev/github.com/shadowsocks/go-shadowsocks2#readme-install)
- #### 安装

---

找一台海外linux服务器，推荐使用阿里云的轻应用服务器，节点选香港或者新加坡

- **安装服务器端**

```

# 服务器端下载

wget http://iovhm.com/uploads/shadowsocks2/shadowsocks2-linux


cp ./shadowsocks2-linux /usr/local/bin

chmod 777  /usr/local/bin/shadowsocks2-linux



```

- **编写服务配置文件**

```

# vi /usr/lib/systemd/system/shadowsocks2.service


[Unit]
Description=shadowsocks2
After=network.target
Wants=network-online.target

[Service]
Restart=always
Type=simple
ExecStart=/usr/local/bin/shadowsocks2-linux -s 'ss://aes-256-gcm:<password>@:8080' -verbose
# 工作于client模式
# ExecStart=/usr/local/bin/shadowsocks2-linux -c 'ss://aes-256-gcm:<password>@<server_ip>:8080' -socks :1080  -verbose


[Install]
WantedBy=multi-user.target

```

- #### 客户端配置（netch 虚拟网卡模式）

**下载软件**

- 官方下载：[https://github.com/netchx/netch/releases](https://github.com/netchx/netch/releases)
- 加速下载：[https://iovhm.com/uploads/software/tools/Netch.zip](https://iovhm.com/uploads/software/tools/Netch.zip)

**增加 shadowsocks服务器配置**

[![](https://iovhm.com/book/uploads/images/gallery/2026-04/scaled-1680-/FZRXb6uLijQsyZeH-image-1775182451414.png)](https://iovhm.com/book/uploads/images/gallery/2026-04/FZRXb6uLijQsyZeH-image-1775182451414.png)

**选择模式**

[![](https://iovhm.com/book/uploads/images/gallery/2026-04/scaled-1680-/oQouGWW40A2umLCC-image-1775182797927.png)](https://iovhm.com/book/uploads/images/gallery/2026-04/oQouGWW40A2umLCC-image-1775182797927.png)

**设置dns也代理**

[![](https://iovhm.com/book/uploads/images/gallery/2026-04/scaled-1680-/TJIUuTbnroYaejdJ-image-1775182924578.png)](https://iovhm.com/book/uploads/images/gallery/2026-04/TJIUuTbnroYaejdJ-image-1775182924578.png)

[![](https://iovhm.com/book/uploads/images/gallery/2026-04/scaled-1680-/9cnuN2Z2qaXAmgpo-image-1775182837013.png)](https://iovhm.com/book/uploads/images/gallery/2026-04/9cnuN2Z2qaXAmgpo-image-1775182837013.png)

**点击启动，启动成功后，会多出一个aicloud的虚拟网卡**

**也兼容socks5插件方式**

[![](https://iovhm.com/book/uploads/images/gallery/2026-04/scaled-1680-/mMpefC0S1loCib0M-image-1775183532023.png)](https://iovhm.com/book/uploads/images/gallery/2026-04/mMpefC0S1loCib0M-image-1775183532023.png)

---

- #### 客户端配置(socks5浏览器插件方式)

---

- **客户端下载**

windows 客户端下载: [https://iovhm.com/uploads/shadowsocks2/shadowsocks-4.4.1.0.zip](https://iovhm.com/book/attachments/3)

解压缩后，双击小火箭图标，会在任务栏出现小图标，右键任务栏小图标，填入配置信息

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/zC4e6oATJhURSUZZ-image-1691682136470.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/zC4e6oATJhURSUZZ-image-1691682136470.png)

- **填入服务器配置**

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/KIlDmFJ7JWvkJEbs-image-1691681748196.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/KIlDmFJ7JWvkJEbs-image-1691681748196.png)

- **浏览器插件下载**

[https://iovhm.com/uploads/shadowsocks2/extension\_2\_5\_21\_0.crx](https://iovhm.com/uploads/shadowsocks2/extension_2_5_21_0.crx)

- **安装浏览器扩展**

浏览器地址输入 chrome://extensions/ 或者找到扩展工具设置，将 **extension\_2\_5\_21\_0.crx** 拖到窗口进行安装。

- **让扩展程序显示在地址栏**

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/gZ5ZZ1WoxDKMUrLq-image-1691682632677.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/gZ5ZZ1WoxDKMUrLq-image-1691682632677.png)

- **设置浏览器扩展**

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/kJywxZahJ1DiaOAf-image-1691682671245.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/kJywxZahJ1DiaOAf-image-1691682671245.png)

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/mkT6kUa9KG8skTtT-image-1691682688044.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/mkT6kUa9KG8skTtT-image-1691682688044.png)

- 代理协议：SOCKS5
- 代理服务器: 127.0.0.1
- 代理端口：1080 ，既第一步中，配置的本地监听端口

---

- **设置不代理地址列表，国内地址不经过代理**

填入以下地址，选择右边的**应用选项**保存

```
*.baidu.com
*.jd.com
*.taobao.com
*.zhihu.com
*.qq.com
*.cn
*.huaweicloud.com
*.alipay.com
*.aliyun.com
*.alicdn.com
*.csdn.net
*.csdn.com
*.douyin.com
::1
127.0.0.1
localhost

```

- **选择浏览器使用代理方式连接到网络**

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/c3YpoyuMqalL27DQ-image-1691682858284.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/c3YpoyuMqalL27DQ-image-1691682858284.png)

- #### 注意事项

系统代理选择禁用，**不要选择PAC模式和全局模式**，此2个模式会将所有的网络流量全部走代理,浪费代理资源。比较科学的办法是将插件安装在edge浏览器上用于科学上网；正常访问使用chrome浏览器，便捷不用切来切去。

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/HDY4YgxFKU7Z6mok-image-1691683057918.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/HDY4YgxFKU7Z6mok-image-1691683057918.png)

#### linux使用方法

```shell
./shadowsocks2-linux -c 'ss://aes-256-gcm:<password>@<server_ip>:8080' -socks :1080  -verbose

# 设置环境变量
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
export all_proxy=socks5://127.0.0.1:1080

# 取消设置环境变量
unset http_proxy
unset https_proxy
unset all_proxy



```

#### docker使用代理上网

- 参见docker使用代理上网：[https://iovhm.com/book/books/k8s/page/docker](https://iovhm.com/book/books/k8s/page/docker)
- #### 翻墙违法
    
    
    - 仅限于工作需要的 google、github 等
    - 请不要通过代理搜索、查看、传阅敏感话题
    - 请不要通过代理观看、下载视频
    - 请不要通过代理浏览非法网站、娱乐网站、社交网站等
    - 没有访问外网需要时，请选择直连或者系统代理，节约资源

# 免费申请ssl证书

#### 注册账号

在网站 **https://zerossl.com/** 注册账号，按下图步骤获取acme key , 将**EAB KID** 和 **EAB HMAC key**记录下来

[![](https://iovhm.com/book/uploads/images/gallery/2023-08/scaled-1680-/97ycr8aAqAZ7LU2g-image-1693483356434.png)](https://iovhm.com/book/uploads/images/gallery/2023-08/97ycr8aAqAZ7LU2g-image-1693483356434.png)

#### 安装和使用

参考网址：https://github.com/acmesh-official/acme.sh

```
# 安装
wget -O -  https://get.acme.sh | sh

# 增加别名（非必要）
alias acme.sh=~/.acme.sh/acme.sh

# 进入到执行目录（非必要）
cd /root/.acme.sh


# 2023-1-1 更新，更换了默认证书提供商为zerossl
# https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA


# 绑定和配置账号，填入你前面记录的EAB KID和EAB HMAC key
./acme.sh  --register-account  --server zerossl \
       --eab-kid  <your kid>  \
       --eab-hmac-key  <your key>

      
# 配置默认证书提供商
./acme.sh --set-default-ca  --server zerossl


# 第一步
./acme.sh --debug  --issue  --dns -d *.saas.vppark.cn  --yes-I-know-dns-manual-mode-enough-go-ahead-please --server zerossl


# 增加DNS txt验证记录


# 申请证书，多了一个参数 --renew
./acme.sh --debug  --issue --renew  --dns -d *.saas.vppark.cn  --yes-I-know-dns-manual-mode-enough-go-ahead-please --server zerossl


# 查看本地证书

./acme.sh --list


# 更新所有的证书
acme.sh --renew-all --server zerossl


# 安装证书， 主要是两个文件，私匙(key)和证书(cer)
key: *.saas.vppark.cn.key
cer: fullchain.cer

# 查看证书过期日期
openssl x509 -enddate -noout -in fullchain.cer
openssl x509 -text -noout -in fullchain.cer

# 如果后续进行更新，使用的是zerossl，需要到zerossl网站下载更新的证书。并且将两个证书进行合并，否则会提示证书链不完整。

# 升级软件
acme.sh --upgrade


```

#### 使用 阿里云 dnsapi自定添加域名认证

更多其他域名提供商api使用方法：[https://github.com/acmesh-official/acme.sh/wiki/dnsapi](https://github.com/acmesh-official/acme.sh/wiki/dnsapi)

使用阿里云dns api时，需要先获取到Ali\_Key和Ali\_Secret,获取方法为

- 进入阿里云账号，点击 **AccessKey管理**[![](https://iovhm.com/book/uploads/images/gallery/2024-08/scaled-1680-/DpUL0DFhvQKnn7C3-image-1723436230975.png)](https://iovhm.com/book/uploads/images/gallery/2024-08/DpUL0DFhvQKnn7C3-image-1723436230975.png)
- 获取和创建你的api key

[![](https://iovhm.com/book/uploads/images/gallery/2024-08/scaled-1680-/x5OU5geXdLOZ4oK8-image-1723436364752.png)](https://iovhm.com/book/uploads/images/gallery/2024-08/x5OU5geXdLOZ4oK8-image-1723436364752.png)

```shell

# 参考网站：https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_ali

# 设置阿里云dns api需要的key和secret
export Ali_Key="<key>"
export Ali_Secret="<secret>"


# 申请证书

./acme.sh --issue --dns dns_ali -d *.iovhm.com -d iovhm.com

# --dns dns_ali 使用阿里云dns api
# key保存于 /root/.acme.sh/account.conf
# 保存的key和secret被重命名为  SAVED_Ali_Key='<key>'和SAVED_Ali_Secret='<secret>'

# 如果你的dns提供商不支持acme api或者你没有权限管理主域名，可以使用dns cname模式


# 使用dns别名自动验证域名并申请证书
./acme.sh --issue --dns dns_ali -d vppark.cn  -d *.vppark.cn  -d *.saas.vppark.cn -d *.ihg.vppark.cn -d *.devops.vppark.cn  --challenge-alias acme-vppark-cn.iovhm.com --force

# --challenge-alias acme-vppark-cn.iovhm.com 指定dns别名，acme 将自动在别名域名上添加相关认证记录，使认证域名记录变成 _acme-challenge.acme-vppark-cn.iovhm.com

# 既主域名设置的别名于别名记录有一定的匹配关系

# 主域名的别名设置应该是 _acme-challenge.saas.vppark.cn => _acme-challenge.acme-vppark-cn.iovhm.com

# 而不是 _acme-challenge.saas.vppark.cn => acme-vppark-cn.iovhm.com


# 证书列表
./acme.sh --list

# 重新申请证书
./acme.sh --renew -d iovhm.com --force

# 更新证书
# 只需要写主域名既可以自动将所有证书全部更新
./acme.sh --renew -d iovhm.com --force

# 查看证书过期日期
openssl x509 -enddate -noout -in fullchain.cer
openssl x509 -text -noout -in fullchain.cer


```

# VUE前端缓存不刷新问题

#### nginx配置增加

```
    location / {
        # 不缓存首页，解决VUE单页面发版后不生效
        add_header Cache-Control "no-cache no-store must-revalidate proxy-revalidate,max-age=0";
        add_header Last-Modified $date_gmt;
        # 这个有顺序，需要加在最后面
        etag off; 
    }



```

#### index.html增加

```
    <meta http-equiv="Cache-Control" content="no-store" />

```

#### 增加一个新的入口页面，并在APP或者微信公众号设置入口为这个新的页面，例如取名为root.html

```

<html lang="en">

<head>
    <title>数字营业厅</title>
    <script type="text/javascript">

        function generateRandomChar() {
            const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
            return chars[Math.floor(Math.random() * chars.length)];
        }

        function generateRandomString() {
            const length = 3;
            let str = '';
            for (let i = 0; i < length; i++) {
                str += generateRandomChar();
            }
            return str;
        }

        var rnd = generateRandomString();

        // 需要根据前端项目是URL模式还是history模式自行修改
        location.assign(`./?${rnd}`);


    </script>
</head>

<body>

</body>

</html>

```

</body></html>

# git使用指南

```
# Git global setup
git config --global user.name "你的名字"
git config --global user.email "your email"



# Create a new repository
git clone http://10.0.0.43:10080/tjxt/htc-dashboard.git
cd htc-dashboard
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master


# Existing folder
cd existing_folder
git init
git remote add origin http://10.0.0.43:10080/tjxt/htc-dashboard.git
git add .
git commit -m "Initial commit"
git push -u origin master


# Existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin http://10.0.0.43:10080/tjxt/htc-dashboard.git
git push -u origin --all
git push -u origin --tags



```

```

# 增加文件
git add .


# 提交更改
git commit -m [comment]

# 推送到远程
git push origin loacl:remote

# 获取
git pull origin branch-name


# 修改文件
git status

# 删除文件
git rm

# 移动文件
git mv

# 列出本地分之
git branch

# 列出远程分之
git branch -r

# 列出所有分之
git branch -a

# 新建分支
git branch [branch-name]

# 切换分之
git checkout [branch-name]

# 从指定分之合并
git merge [branch-name]

# 删除分之
git branch -d [branch-name]

# 删除远程分之
git push origin --delete branch-name

# 递归获取
git fetch [remote]

```

# centos 配置telnet登陆

##### 相关软件安装

```
yum install telnet telnet-server xinetd

```

##### 修改 pam 模块 telnet 权限

将etc/pam.d/remote中的auth required pam\_securetty.so注释掉

```
修改 pam 模块 telnet 权限
# 修改前
[root@localhost ~]# grep 'pam_securetty.so' /etc/pam.d/remote 
auth       required     pam_securetty.so

# 修改后 -- 注释掉
[root@localhost ~]# grep 'pam_securetty.so' /etc/pam.d/remote 
# auth       required     pam_securetty.so

```

##### 新建配置文件

```
[root@localhost ~]# cat << EOF > /etc/xinetd.d/telnet
service telnet
{
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/in.telnetd
    log_on_failure += USERID
    disable = no
}
EOF

```

##### 启动服务

```
systemctl start telnet.socket
systemctl start xinetd

```

# ansible使用

- #### 安装

```
# 安装扩展源
yum install epel-release
yum install ansible

```

- #### 编写配置文件

```
# 编辑配置文件
vi /etc/ansible/hosts

# 加入主机
[groupName]
192.168.0.10
10.vpclub.io

192.168.0.11 ansible_user=<name>,ansible_password=<passwrd>

# 支持的参数有
# ansible_port 端口
# ansible_user 用户名
# ansible_password 密码


```

- #### 配置免密登录

如果不想在ansible填写用户密码，可以配置免密登录

```

# 生产RSA密匙对
ssh-keygen -t rsa 


# 使用命令将密公钥复制到目标主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.2



```

- #### 使用命令

```
ansible all -m <模块名> -a "参数"

ansible groupName  -m <模块名> -a "参数"

ansible 10.vpclub.io -m <模块名> -a "参数"

```

# openssh升级

**重要，使用新的客户端成功连接前，千万不要断开ssh连接，否则就接不上了；确定升级完成、新的客户端可以连接后才断开,请确保电脑连接了电源，网络畅通**

#### 升级openssl

openssl 源代码网站：[https://www.openssl.org/source/](https://www.openssl.org/source/)

```shell

# 下载源代码
wget https://www.openssl.org/source/openssl-3.3.1.tar.gz

# 解压缩
tar -xvzf openssl-3.3.1.tar.gz

# 安装依赖
yum install perl-IPC-Cmd

# 配置
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
# --prefix=/usr/local/openssl 安装目录
# --openssldir=/usr/local/openssl 配置目录

# 编译
make -j$(nproc)

# 测试，非必要，测试失败不意味着编译安装会失败
make test

# 安装，openssl将被安装到 /usr/local/openssl
make install

# 验证版本
/usr/local/openssl/bin/openssl version

```

openssl将被安装到 **/usr/local/openssl** 。可能提示找不到 libcrypto.so.3 库，需要建立共享库搜寻路径

```shell

# 创建共享库搜索路径
echo "/usr/local/openssl/lib64" | sudo tee /etc/ld.so.conf.d/openssl.conf

# 更新动态链接库缓存
ldconfig


```

#### openssh升级

openssh 源代码发布网站：[https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/](https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/)

```shell

# 查看sshd版本
ssh -V
sshd -V

# 下载最新的ssh源代码
# https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/
# 2025年9月23日
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p2.tar.gz

# 解压源代码
tar -xvzf openssh-10.0p2.tar.gz

# 安装GCC编译器
yum install gcc

# 安装zlib依赖
yum install zlib-devel

# 安装pam依赖
yum install pam-devel

# 备份原配置文件
cp -a /etc/ssh/ /etc/ssh_bak/

# 配置与编译(通常情况下升级SSH都会要求升级ssl，请直接看后面部分)
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib


```

此时还可能提示openssl不存在、版本太低，如果本机没有openssl，则参见openssl升级

```shell

# 查看openssl版本
openssl version

# 查看openssl位置
which openssl

查看openssl库文件位置
ldd /usr/bin/openssl

# 指定openssh需要使用的openssl库文件位置
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-zlib --with-ssl-dir=/usr/local/openssl

# 编译 并 安装
make -j$(nproc)

make install

# 验证ssh版本
ssh -V
sshd -V

# 验证配置文件正确性
/usr/sbin/sshd -t -f /etc/ssh/sshd_config

# 修改配置文件权限，如果验证配置文件正确性语句出错的话
chmod 0600 /etc/ssh/ssh_host_rsa_key
chmod 0600 /etc/ssh/ssh_host_ecdsa_key
chmod 0600 /etc/ssh/ssh_host_ed25519_key

# 修改配置文件，如果验证配置文件正确性语句出错的话
vi /etc/ssh/sshd_config

# 修个sshd_config配置文件，启用以下两个配置
UsePAM yes
PermitRootLogin yes
# 修个sshd_config配置文件，禁用以下四个配置
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

# 重启sshd服务，
systemctl restart sshd

# 此时可能重启失败，使用journalctl -xe 查看错误信息，一般是提示找不到 libcrypto.so.3 库
# 将库建立软连接到共享库目录
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3

# 重启sshd服务卡主，修改服务通知类型为simple
vi /usr/lib/systemd/system/sshd.service
# Type=simple

systemctl daemon-reload
# 重启sshd服务
systemctl restart sshd

# 禁用ssh客户端
vi /etc/ssh/ssh_config


```

升级完成后，旧版的xshell提示，找不到匹配的host key算法 , 这是旧版xhsell的bug，需要升级xshell

#### 直接在服务器使用ssh命令连接到其他机器报错：/etc/ssh/ssh\_config line 59: Unsupported option "gssapiauthentication"

```shell

# 修改配置文件，是ssh，不是sshd
vi /etc/ssh/ssh_config

# 注释本行
# GSSAPIAuthentication yes


```

# 制作离线yum源

#### 在有网的机器制作离线仓库包

```

# 1. 准备目录
mkdir -p /data

# 2. 装工具（一次就够）
yum install -y yum-utils createrepo

# 3. 下载 gcc 及所有递归依赖
yumdownloader --resolve --destdir=/data/offline-repo   gcc zlib-devel pam-devel perl-IPC-Cmd createrepo

# 连同依赖一起下载
repotrack -a x86_64 -p /data/offline-repo/ gcc zlib-devel pam-devel perl-IPC-Cmd createrepo

# 4. 生成仓库元数据（repodata）
createrepo /data/offline-repo 


# 5. 打包（rpm + repodata 一起带走）

cd /data
tar -cvzf offline-repo.tar.gz ./offline-repo



```

#### 在没网的机器制作本地仓库

```
# 6. 上传并解压到固定目录

mkdir -p /data
tar -xvzf offline-repo.tar.gz -C /data/offline-repo

# 7. 写本地仓库文件

tee /etc/yum.repos.d/offline.repo <<'EOF'

[offline]
name=Local Offline Repo
baseurl=file:///data/offline-repo
enabled=1
gpgcheck=0
EOF

# 8. 清缓存 & 识别新仓库
yum clean all
yum makecache

# 9. 升级gcc(非必须)
yum install -y gcc

# 10. 安装其他组件

yum install -y  zlib-devel pam-devel perl-IPC-Cmd  perl perl-Time-Piece


```

# centos7 阿里源

#### CentOS-Base.repo

```shell


# 保存位置
# /etc/yum.repos.d/CentOS-Base.repo

# CentOS-Base
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 替换阿里ecs内网环境
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo


# epel.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

# docker源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo



```

# 手工编译qt6.7.1 WebEngine

#### QWebEngine默认不支持html video播放

QWebEngine默认不支持html video播放，原因是默认编译没有包括视频解码部分

#### 源代码编译

```
# 下载源代码并解压缩
# 下载地址：https://download.qt.io/official_releases/qt/6.7/6.7.1/single/qt-everywhere-src-6.7.1.zip

# 安装vistudi 2019或者更高
# 安装qt creatro

# 下载几个需要依赖的文件，在qt5安装文件有，将这个路径加入到path
# D:\Qt\Qt5.14.2\5.14.2\Src\gnuwin32\bin
# 或者使用我从qt5目录复制出来的
# https://iovhm.com/book/attachments/7

# 找到 qtcreatro 安装后自带的 Qt 6.7.1 (MSVC 2019 64-bit) 快捷方式，或者使用如下命令命令行启动命令窗口
C:\Windows\System32\cmd.exe /A /Q /K D:\Qt\Qt6.7.1\6.7.1\msvc2019_64\bin\qtenv2.bat

# 加载vc编译器，具体需要看你的visual studio位置
"C:\Program Files\Microsoft Visual Studio\2022\community\VC\Auxiliary\Build\vcvarsall.bat" amd64

# 设置环境变量
Set PATH=D:\Qt\Qt6.7.1\Tools\mingw1120_64\bin;%PATH%

# 配置编译选项
configure.bat  -prefix d:/qt6.7.1  -debug-and-release -webengine-proprietary-codecs -opensource -confirm-license -platform win32-msvc -nomake examples -nomake tests
 
# 编译
cmake --build . --parallel

# 安装
cmake --install .

```

# ansible 一键修改服务器密码脚本

# 脚本安装

1. 执行安装脚本setup.sh 安装ansible和yq命令

```
#!/bin/bash

# 安装ansible
yum install ansible-2.9.27-1.el7.noarch.rpm -y

# 安装yq
cp -a yq /usr/local/bin/

```

注： yq是解析yaml工具

2. 配置inithost,第一次连接服务器的用户名和密码 例：

```
hosts:
  #192.168.40.36:
  #  ansible_user: root
  #  ansible_password: 123456
  #192.168.40.37:
  #  ansible_user: root
  #  ansible_password: 123456

```

3. 配置ansible hosts文件 例：

```
#[test]
#192.168.40.36
#
#[test1]
#192.168.40.37

```

4.生成初始连接凭据

```
bash ./inithost.sh

```

注：初始文件生成后，可以删除inithost以保证安全

### 常见操作

1. **修改单个服务器密码**

```bash
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=root password=123456" changepasswd.yaml

```

2. **修改ansible组密码**

```bash
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=test user=root password=123456" changepasswd.yaml

```

3. **修改hosts文件里所有服务器的密码**

```bash
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=all user=root password=123456" changepasswd.yaml

```

4. **修改其他用户密码**

```bash
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=test password=123456" changepasswd.yaml

```

- 提示: 在执行上述操作前，需要确保服务器上已存在对应的用户。

### 常见的问题

如果遇到以下错误信息："Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known\_hosts file to manage this host."  
解决方法：先使用ssh连接目标主机，获取主机的key。 附录1： inithost.sh脚本

```
#!/bin/bash

# 获取从命令行传入的第一个参数作为vault_password
vault_password="3d$R7#X9"

# 创建connect目录，如果它还不存在
mkdir -p connect

# 读取主机名列表
hosts=$(yq e '.hosts | keys' inithost.yaml | sed 's/- //')

# 遍历每个主机名
for host in $hosts; do
  # 检查主机名是否为空
  if [ -z "$host" ]; then
    continue
  fi

  # 删除引号，以便获取干净的主机名
  host=${host//\"/}
  # 从yaml文件中读取ansible_user和ansible_password
  user=$(yq e .hosts.\"$host\".ansible_user inithost.yaml)
  password=$(yq e .hosts.\"$host\".ansible_password inithost.yaml)

  # 检查用户名和密码是否为空
  if [ -z "$user" ] || [ -z "$password" ]; then
    continue
  fi

  # 删除引号，以便获取干净的用户名和密码
  user=${user//\"/}
  password=${password//\"/}

  # 创建新的yaml文件，文件名为IP地址，并写入ansible_user和ansible_password
  # 新文件将在connect目录下创建
  echo "ansible_user: $user" > connect/$host.yaml
  echo "ansible_password: $password" >> connect/$host.yaml

  # 创建秘密文件
  echo "$vault_password" > .vault_pass
  # 使用ansible vault对文件进行加密，使用传入的vault_password作为密码
  echo $vault_password | ansible-vault encrypt connect/$host.yaml --vault-password-file=.vault_pass
  # rm -fr .vault_pass
done

```

附录2：changepasswd.yaml的playbook

```
- hosts: "{{ target_hosts }}"
  vars_files:
    - "connect/{{ inventory_hostname }}.yaml"
  tasks:
    - name: debug
      debug:
        msg: "connect/{{ inventory_hostname }}.yaml"

    - name: 修改服务器密码
      user:
        name: "{{ user }}"
        password: "{{ password | password_hash('sha512') }}"
      become: yes
      become_user: "{{ ansible_user }}"

    - name: 修改ansible连接root密码文件
      local_action:
        module: script
        args: ansible_rootpasswd_change.sh connect/{{ inventory_hostname }}.yaml {{ password }}
      when: user == 'root'

```

附录3 修改root密码的脚本

```
#!/bin/bash

# 定义你的 vault 密码
#vault_password=$1
# 定义 inventory_hostname
vault_file=$1
# 定义新的 ansible_password
new_ansible_password=$2

# 定义 vault 文件路径
#vault_file="${vault_file_path}"

# 创建一个临时文件
temp_file=$(mktemp)

# 使用 ansible-vault 解密 vault 文件并将内容写入临时文件
#echo $vault_password | ansible-vault decrypt $vault_file --output $temp_file
ansible-vault decrypt $vault_file --output $temp_file --vault-password-file=.vault_pass

# 修改 ansible_password
yq eval ".ansible_password = \"$new_ansible_password\"" $temp_file

# 使用 ansible-vault 重新加密临时文件并覆盖原来的 vault 文件
#echo $vault_password | ansible-vault encrypt $temp_file --output $vault_file
ansible-vault encrypt $temp_file --output $vault_file --vault-password-file=.vault_pass

# 删除临时文件
rm $temp_file

```

# qt集成cef(Chromium Embedded Framework) 实现自己的浏览器

虽然QT自带的有WebEngine也是基于chrome的。简单使用没有问题，但是默认没有对视频播放的支持，虽然网上有很多关于编译QT源码以用于支持视频播放。但是耗时耗力，且不一定能成功，想要追随chrome内核更新相当麻烦

几经周折，发现有一款基于cef的包装也可以支持视频播放，在此记录一下

#### 参考网址

- https://github.com/cefview/qcefview
- https://github.com/wodeguaiguai/cef-build-surport-for-mp3-mp4

#### 从源代码编译

```shell
# 设置环境变量，指定QT套件目录
set QTDIR=D:\Qt\Qt6.7.12\6.7.1\msvc2019_64

# 克隆源代码 
git clone --recursive -b v1.1.0 https://github.com/CefView/QCefView.git

# 加载VC编译器
"C:\Program Files\Microsoft Visual Studio\2022\community\VC\Auxiliary\Build\vcvarsall.bat" amd64

# 生成项目
generate-win-x86_64.bat

# 编译
cmake --build .build/windows.x86_64

# 替换热心网友修改过的支持视频播放的cef
# 替换到 QCefView\CefViewCore\dep 这里

# 重新执行
generate-win-x86_64.bat
cmake --build .build/windows.x86_64

```

在看看，播放器就支持视频播放了

#### 在qt creator调试的时候的注意事项

需要把所有的依赖的dll拷贝到输出目录，使用环境变量设置依赖文件跑不起来

# docker centos 支持中文

```
FROM centos:7
EXPOSE 8080

RUN yum install -y https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm && \
    yum install -y nscd kde-l10n-Chinese && \
    yum reinstall -y  glibc-common &&  \
    yum clean all

RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

ENV LC_ALL zh_CN.utf8
ENV LANG zh_CN.utf8
ENV LANGUAGE zh_CN.utf8

COPY ./ffmpeg/linux/** /usr/local/bin/
COPY ./entrypoint.sh /root/entrypoint.sh
COPY ./target/srs-push-1.0-SNAPSHOT.jar /root/srs-push-1.0-SNAPSHOT.jar

WORKDIR /root

ENTRYPOINT ["/root/entrypoint.sh"]



```

# busybox&&docker镜像支持systemd

k8s环境中，经常需要一个工具容器进行一些调试，特意打包了常用小工具。你可以可以使用下面的dockerfile制作自己的容器

##### 镜像地址

```shell

harbor.iovhm.com/public/busybox:latest


```

##### Dockerfile

```Dockerfile

FROM harbor.iovhm.com/hub/centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
    curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo  && \
    yum makecache &&  \
    yum install -y which wget openvpn telnet net-tools mariadb openssh-clients && \
    yum clean all &&  \
    curl -o /usr/bin/systemctl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py && \
    chmod +x /usr/bin/systemctl  &&  \
    true

COPY ./entrypoint.sh /root/entrypoint.sh
RUN chmod +x /root/entrypoint.sh

CMD [ "/root/entrypoint.sh" ]

WORKDIR /root






```

##### entrypoint.sh

```shell

#!/bin/bash
set -x

echo "busybox ..."

# 判断环境变量 OPENVPN 是否存在并且值为 1，决定是否开启 OpenVPN 客户端
if [ "${OPENVPN}" == "1" ]; then
    echo "start openvpn-client ..."
    /usr/sbin/openvpn --config /data/vpclub/ovpn_configuration_file.ovpn &
    # 等待 OpenVPN 启动
    sleep 10
else
    echo "OPENVPN environment variable not set or not equal to 1. Skipping OpenVPN client setup."
fi

# 判断环境变量 IP_FORWARD 是否存在且值为 1，决定是否开启 IP 转发
if [ "${IP_FORWARD}" == "1" ]; then
    echo "Enabling IP forwarding..."
    echo 1 >/proc/sys/net/ipv4/ip_forward

    echo "start ip_forward ..."

    # 从文件读取 IP_FORWARD_RULES
    if [ -f "/data/vpclub/IP_FORWARD_RULES.txt" ]; then
        IP_FORWARD_RULES=$(cat /data/vpclub/IP_FORWARD_RULES.txt)
    else
        echo "IP_FORWARD_RULES file not found. Skipping batch IP forwarding setup."
        continue
    fi

    # 批量设置 IP 转发规则
    if [ -n "${IP_FORWARD_RULES}" ]; then
        IFS=$'\n' read -r -d '' -a rules <<<"${IP_FORWARD_RULES}"
        for rule in "${rules[@]}"; do
            # 修改解析逻辑，支持新的格式
            IFS=',' read -r SRC_IP_PORT DEST_IP_PORT DEST_PROTO <<<"$rule"
            IFS=':' read -r SRC_IP SRC_PORT <<<"$SRC_IP_PORT"
            IFS=':' read -r DEST_IP DEST_PORT <<<"$DEST_IP_PORT"
            DEST_PROTO=${DEST_PROTO:-tcp} # 默认协议为tcp

            # 添加PREROUTING规则
            iptables -t nat -I PREROUTING ! -s ${DEST_IP}/32 -p ${DEST_PROTO} --dport ${SRC_PORT} -j DNAT --to ${DEST_IP}:${DEST_PORT}

            # 添加POSTROUTING规则
            iptables -t nat -I POSTROUTING -d ${DEST_IP}/32 -p ${DEST_PROTO} -j MASQUERADE
        done
    else
        echo "No IP_FORWARD_RULES provided. Skipping batch IP forwarding setup."
    fi
else
    echo "IP_FORWARD environment variable not set or not equal to 1. Skipping IP forwarding setup."
fi

echo "success ..."

tail -f /dev/null



```

#### 隐藏秘籍，内置了openvpn-client

#### 注意事项，如果开启内置的openvpn-client，如果服务器设置的路由与本地网络冲突，需要再配置文件中增加 **route-nopull**

例如，本机网络为192.168.0.0/24,VPN上也进行了这个设置，则会导致路由冲突，可能导致vpn客户不可用

[![](https://iovhm.com/book/uploads/images/gallery/2025-05/scaled-1680-/P4nWjoCsVxQTwdUy-image-1747401380798.png)](https://iovhm.com/book/uploads/images/gallery/2025-05/P4nWjoCsVxQTwdUy-image-1747401380798.png)

**增加不从服务器获取路由route-nopull**

2025年5月16日，已经在命令增加了 **route-nopull** ，不需要修改配置文件了

[![](https://iovhm.com/book/uploads/images/gallery/2025-05/scaled-1680-/fgfASgrK2XG6WF6Y-image-1747401587111.png)](https://iovhm.com/book/uploads/images/gallery/2025-05/fgfASgrK2XG6WF6Y-image-1747401587111.png)

```
version: "3"
services:
  busybox:
    image: harbor.iovhm.com/public/busybox:latest
    container_name: busybox
    network_mode: host  # 注意一定要是host模式,因为他默认监听在容器内，并不能与主机直接通讯
    privileged: true
    restart: always
    volumes:
      - ./ovpn_configuration_file.ovpn:/data/vpclub/ovpn_configuration_file.ovpn
    command: "/usr/sbin/openvpn --config /data/vpclub/ovpn_configuration_file.ovpn --route-nopull"


```

#### 链接到集群内

##### 增加两个环境变量

- 开启内置的VPN： **OPENVPN=1**
- 开启端口转发：**IP\_FORWARD=1**

[![](https://iovhm.com/book/uploads/images/gallery/2025-04/scaled-1680-/PBMnftYcV9mbpUcH-image-1745893639413.png)](https://iovhm.com/book/uploads/images/gallery/2025-04/PBMnftYcV9mbpUcH-image-1745893639413.png)

##### 编写configmap

**重要：两个配置的名称要对应上，因为启动脚本里面写死了**

- 端口转发规则 **IP\_FORWARD\_RULES.txt**

格式为：**SRC\_IP:SRC\_PORT,DST\_IP:DST\_PORT** ， 一行一个

```

0.0.0.0:6388,10.100.156.69:6379
0.0.0.0:5672,10.103.194.230:5672
0.0.0.0:15672,10.103.194.230:15672


```

其中的IP为服务发现的IP

[![](https://iovhm.com/book/uploads/images/gallery/2025-04/scaled-1680-/Jp7NR8ynOMiBsqwf-image-1745894155647.png)](https://iovhm.com/book/uploads/images/gallery/2025-04/Jp7NR8ynOMiBsqwf-image-1745894155647.png)

- VPN客户端秘钥文件：**ovpn\_configuration\_file.ovpn**

可以到pritunl中下载后用记事本打开后粘贴进去

[![](https://iovhm.com/book/uploads/images/gallery/2025-04/scaled-1680-/PBaWSCvoMSS3goOp-image-1745893923387.png)](https://iovhm.com/book/uploads/images/gallery/2025-04/PBaWSCvoMSS3goOp-image-1745893923387.png)

##### 对configmap进行挂载，挂载路径为/data/vpclub

[![](https://iovhm.com/book/uploads/images/gallery/2025-04/scaled-1680-/iK9PHF4VzgtCqp2N-image-1745893857316.png)](https://iovhm.com/book/uploads/images/gallery/2025-04/iK9PHF4VzgtCqp2N-image-1745893857316.png)

[![](https://iovhm.com/book/uploads/images/gallery/2025-04/scaled-1680-/zmHR3DSvNv8kaM6S-image-1745893806208.png)](https://iovhm.com/book/uploads/images/gallery/2025-04/zmHR3DSvNv8kaM6S-image-1745893806208.png)

# datart通过自定义视图查询数据源数据

#### 一、 功能概述

该功能可以实现动态注册数据源，自定义SQL就可以通过统一接口查询数据。减少开发工作量，提高效率。

#### 二、注册数据源

注册数据源如下图。 [![微信图片_20231207143758.png](https://iovhm.com/book/uploads/images/gallery/2023-12/scaled-1680-/5Bh4Fx0bjyhPSf9m-20231207143758.png)](https://iovhm.com/book/uploads/images/gallery/2023-12/5Bh4Fx0bjyhPSf9m-20231207143758.png)

注意：**连接地址，一定要设置utf8编码，不然中文查询不出来**，示例： jdbc:mysql://121.37.7.167:33314/数据库名?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true

#### 三、添加数据视图

数据视图-新建数据视图-SQL 视图，进入编写要查询数据库的SQL [![微信图片_20231207144517.png](https://iovhm.com/book/uploads/images/gallery/2023-12/scaled-1680-/ECRgXRCI2H7dcrkH-20231207144517.png)](https://iovhm.com/book/uploads/images/gallery/2023-12/ECRgXRCI2H7dcrkH-20231207144517.png)

1.先选择数据源

2.编写查询SQL

3.执行SQL

4.保存视图

5.将数据视图关掉，重新进入，地址栏可以看到视图id [![微信图片_20231207153849.png](https://iovhm.com/book/uploads/images/gallery/2023-12/scaled-1680-/tZ7SPb2UE81vryEb-20231207153849.png)](https://iovhm.com/book/uploads/images/gallery/2023-12/tZ7SPb2UE81vryEb-20231207153849.png)

#### 四、调用接口查询数据

##### 1.获取TOKEN

（1）接口地址：\[POST\] https://{url}/api/v1/users/login

（2）Body 请求参数:

```json
{
"username": "wangbo", //用户名
"password": "admin@2023!" //密码
}

```

（3）响应头Authorization中获取token [![微信图片_20231207160706.png](https://iovhm.com/book/uploads/images/gallery/2023-12/scaled-1680-/jMdxmZYfRxRFCKWd-20231207160706.png)](https://iovhm.com/book/uploads/images/gallery/2023-12/jMdxmZYfRxRFCKWd-20231207160706.png)

##### 2.获取视图数据

(1)接口地址: \[POST\] https://{url}/api/v1/data-provider/view

(2)Header 请求参数

<table id="bkmrk-%E5%8F%82%E6%95%B0%E5%90%8D-%E5%8F%82%E6%95%B0%E5%80%BC-%E6%98%AF%E5%90%A6%E5%BF%85%E5%A1%AB-%E5%8F%82%E6%95%B0%E7%B1%BB%E5%9E%8B-%E5%8F%82%E6%95%B0"><thead><tr><th>参数名</th><th>参数值</th><th>是否必填</th><th>参数类型</th><th>参数说明</th></tr></thead><tbody><tr><td>Authorization</td><td>Bearer eyJhbGciOiJIUzI1xxxxx</td><td>是</td><td>string</td><td>token</td></tr></tbody></table>

(3)Body 请求参数

```
{
	"page": 1,//当前页
	"limit": 20,//每页条数
	"viewId": "a961d8dc8af4496aad3dfe71d9668416",//视图id
	"filters": [  //查询条件，接口执行时会拼在sql语句的where部分
		{
			"column": [  //字段名字
				"create_date"
			],
			"sqlOperator": "GT",  //运算符(EQ:等于,NE:不等于,GTE:大于等于,LTE:小于等于,LT:小于,GT:大于)
			"values": [
				{
					"value": "2023-06-08",  //参数值
					"valueType": "DATE"  //参数类型
				}
			]
		}
	]
}

```

(4)响应示例

```
{
	"data": {  //返回数据
		"list": [  返回数据列表，字段由查询数据决定
			{
				"request_time": 154,
				"ip": "127.0.0.1",
				"id": 1667084925162176513,
				"request_method": "POST",
				"create_date": "2023-06-09 16:23:14",
				"operation": "保存",
				"request_uri": "/renren-admin/kong/kongapp/save",
				"status": 0
			}
		],
		"page": 1,   //当前页
		"limit": 20,  //每页面条数
		"total": 56   //总条数
	},
	"errCode": 0,
	"message": null,
	"success": true  //是否成功
}

```

#### 五、自定义视图变量

(1)添加变量 [![微信图片_20231207163845.png](https://iovhm.com/book/uploads/images/gallery/2023-12/scaled-1680-/zjMEckj6hjwQXoo5-20231207163845.png)](https://iovhm.com/book/uploads/images/gallery/2023-12/zjMEckj6hjwQXoo5-20231207163845.png)

（2）变量使用，变量格式：$变量名称$，使用如下:

```sql
select 
    *
from sys_log_operation where create_date between $START_DATE$ and $END_DATE$

```

(3)接口调用时添加参数

```
{
	"page": 1,//当前页
	"limit": 20,//每页条数
	"viewId": "a961d8dc8af4496aad3dfe71d9668416",//视图id
	"params": {  //视图自定义变量
		"START_DATE": [  //变量名称
			"2023-06-12"  //变量值
		],
		"END_DATE": [
			"2023-06-13"
		]
	}
}

```

# 定时备份mysql

#### 相关容器

```
swr.cn-south-1.myhuaweicloud.com/vp-public/mysql-backup:v1.0

```

#### 相关配置

```yaml
    volumes:
      - ./config:/config # 需要备份的数据库链接信息
      - ./data:/data #备份文件保存目录


```

#### 备份文件配置信息

```yaml
# 5-11.yaml

- host: 192.168.5.11
  user: 
  password: 
  name: mysql    # 没有实际意义，用来区分备份文件名称，按时间生成{name}-20240713-141847-732950.tar.gz 这样的文件
  port: 3306


- host: 192.168.5.12
  user: 
  password: 
  name: mysql2  # 没有实际意义，用来区分备份文件名称，按时间生成{name}-20240713-141847-732950.tar.gz 这样的文件
  port: 3306

```

#### 直接运行

```shell
#!/bin/bash

docker run -it \
        -v $(pwd)/config:/config -v $(pwd)/data:/data \
        --privileged=true \
        swr.cn-south-1.myhuaweicloud.com/vp-public/mysql-backup:v1.0


```

#### 在k8s创建定时容器

- 1 **创建服务**

[![](https://iovhm.com/book/uploads/images/gallery/2024-07/scaled-1680-/H95aABiTxgXEYrmJ-image-1720855399570.png)](https://iovhm.com/book/uploads/images/gallery/2024-07/H95aABiTxgXEYrmJ-image-1720855399570.png)

- 2 **挂载数据**

[![](https://iovhm.com/book/uploads/images/gallery/2024-07/scaled-1680-/U5NRljK1wRmNnsoF-image-1720855503074.png)](https://iovhm.com/book/uploads/images/gallery/2024-07/U5NRljK1wRmNnsoF-image-1720855503074.png)

# MYSQL维护指南

#### 1. **监控数据库性能**

##### 1.1. **主机监控**

定期监控和分析数据库的性能指标，包括查询速度、连接数、CPU和内存使用情况等。这有助于识别性能瓶颈，并采取相应的优化措施。

常用命令：**top** 、 **free -h** 、 **df -h** 检查mysql主机的性能，可用资源应该冗余30%以上。

##### 1.2. **状态监控**

```mysql

-- 这条命令用于查询当前有多少客户端线程连接到数据库。
-- 这个数字可以帮助你了解数据库的负载情况，如果连接数异常高，可能意味着你的数据库正面临过高的请求负载或者连接泄露问题
SHOW GLOBAL STATUS LIKE 'Threads_connected';

-- 这条命令用于显示自数据库启动以来执行的查询总数。
-- 这个指标可以帮助你评估数据库的工作量，了解数据库的使用频率
SHOW GLOBAL STATUS LIKE 'Queries';

-- 这条命令查询排序缓冲区的大小。
-- 排序缓冲区是MySQL用于排序操作的内存区域。调整这个值可以影响排序操作的性能，特别是在处理大量数据时
SHOW VARIABLES LIKE 'sort_buffer_size';

-- 这条命令用于查询InnoDB缓冲池的大小。InnoDB缓冲池是存储InnoDB表数据和索引的内存区域。
-- 这个值的大小直接影响到数据库的性能，特别是在处理大型数据库时
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- 这条命令显示当前MySQL服务器上所有运行的进程信息。
-- 这可以帮助你识别当前正在执行的查询，检查是否有长时间运行的查询或者锁竞争情况
SHOW FULL PROCESSLIST;



```

##### 1.3. **利用MySQL的性能模式（Performance Schema）**

```mysql

-- 检查performance_schema这个系统变量的状态，如果performance_schema=ON，说明performance_schema已经启用
SHOW VARIABLES LIKE 'performance_schema';

-- 如果没有启用performance_schema，可以通过修改my.cnf文件来启用performance_schema，添加如下配置
-- [mysqld]  
-- performance_schema=ON
-- 所有已执行SQL语句的性能摘要,返回了执行次数最多的前20个查询模板，这有助于识别出数据库中最频繁执行的查询，这些查询往往是性能优化的重点目标
use performance_schema;

SELECT
    SCHEMA_NAME,
    DIGEST_TEXT,
    COUNT_STAR as `执行次数`,
    SUM_TIMER_WAIT / COUNT_STAR / 1e12 AS `平均执行时间（秒）`,
    MAX_TIMER_WAIT / 1e12 as `最大执行时间（秒）`,
    SUM_LOCK_TIME / COUNT_STAR / 1e12 AS `平均锁定时间（秒）`,
    SUM_ROWS_SENT / COUNT_STAR AS `平均返回的行数`,
    SUM_ROWS_EXAMINED / COUNT_STAR AS `平均扫描的行数`,
    SUM_ROWS_AFFECTED / COUNT_STAR AS `平均影响的行数`,
    SUM_CREATED_TMP_DISK_TABLES / COUNT_STAR AS `平均创建的临时磁盘表`,
    SUM_SORT_MERGE_PASSES / COUNT_STAR AS `序操作的效率`,
    SUM_NO_INDEX_USED / COUNT_STAR AS `没有使用索引的次数`,
    SUM_NO_GOOD_INDEX_USED / COUNT_STAR AS `没有更好的使用索引的次数`
FROM
    events_statements_summary_by_digest
WHERE
    SCHEMA_NAME NOT IN (
        'mysql',
        'performance_schema',
        'information_schema'
    )
ORDER BY
    `平均执行时间（秒）` DESC
LIMIT
    20;
 

```

##### 1.4. **分析慢日志**

分析查询日志和慢查询日志，找出执行时间长、效率低下的查询语句，并进行优化。

```conf

# 开启慢查询日志
slow_query_log=1

# 慢查询日志文件路径
# slow_query_log_file=/var/log/mysql/mysql-slow.log
# 如果未设置，可以使用 SHOW VARIABLES LIKE 'slow_query_log_file'查看

# 记录查询执行时间超过30秒的查询
long_query_time=10


```

```mysql

-- 查询是否开启慢日志
SHOW VARIABLES LIKE 'slow_query_log';

-- 临时开启慢日志，重启后失效
SET  GLOBAL slow_query_log = 'ON';

-- 查看慢查询阈值
SHOW VARIABLES LIKE 'long_query_time';

-- 设置超过阈值的查询时间为慢查询
SET  GLOBAL long_query_time = 10;

-- 慢日志存储路径
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 查看慢查询日志
SELECT
  *
FROM
  mysql.slow_log
ORDER BY
  start_time DESC
LIMIT
  20;


```

---

#### 2. **备份数据库**

根据数据库的重要性和数据变动频率，制定合理的备份策略。通常建议每天或每周进行一次全备份，并结合增量备份以减少存储空间和时间消耗。

##### 2.1. **备份方式**

可以选择逻辑备份（如使用mysqldump工具）或物理备份（如直接复制数据文件）。逻辑备份生成SQL脚本文件，便于在不同版本的MySQL之间迁移；物理备份则速度更快，恢复时更接近原始状态。

```mysql
-- 备份mysql数据库
mysqldump - u root - p --all-databases > all_databases.sql

-- 恢复mysql数据库
mysql - u root - p < all_databases.sql

```

##### 2.2. **验证备份**

定期验证备份数据的完整性和可恢复性，确保在需要时能够成功恢复数据。

---

#### 3. **优化查询语句和表结构**

##### 3.1. **优化查询语句**

使用合适的索引、避免全表扫描、减少不必要的JOIN操作等，以提高查询效率。

##### 3.2. **优化表结构**

定期检查并优化表结构，删除不必要的字段和表，合并相似的表以减少冗余数据。对于大型表，可以使用OPTIMIZE TABLE命令进行优化，以减少磁盘空间使用和提高查询性能。

##### 3.3. **归档历史数据**

将超过一定历史时限的数据库进行归档，并从实时数据库进行删除，以降低数据量提高数据库性能。

---

#### 4. **更新和维护**

##### 4.1. **更新数据库软件：**

定期更新MySQL服务器和相关组件的软件版本，以修复已知的漏洞、提高性能和增加新功能。

##### 4.2. **安装安全补丁：**

及时安装MySQL的安全补丁，以防止黑客攻击和数据泄露。

---

#### 5. **安全管理**

##### 5.1. 设置强密码与密码密码过期策略

为用户和数据库设置复杂且不易猜测的密码，并定期更换密码。设置密码过期策略

```mysql
-- 全局的密码生命周期
SET GLOBAL default_password_lifetime = 180;

 
-- 设置密码过期时间
ALTER USER 'your_username' @'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;


```

##### 5.2. **最小权限原则：**

- 遵循最小权限原则：为用户和应用程序分配必要的最小权限集合，以减少安全风险。
- 定期审计：定期审计数据库的访问日志和权限分配情况，及时发现并处理潜在的安全问题。
- 不允许使用ROOT直接：不允许使用ROOT用户直连数据库，应该为每个应用程序单独设置连接用户。

---

#### 6. **其他维护任务**

##### 6.1. **检查磁盘空间**

确保数据库服务器有足够的磁盘空间来存储数据和日志文件。

##### 6.2. **清理无用数据**

定期清理无用的数据、临时表和日志文件等，以释放磁盘空间和提高性能。

##### 6.3. **配置和优化MySQL参数**

根据监控结果和实际需求，调整MySQL的配置参数，如缓冲区大小、连接数等，以优化数据库性能。

# mysql主从复制&&读写分离

#### 主服务器配置

修改配置文件，编辑MySQL的配置文件（通常是/etc/my.cnf或/etc/mysql/my.cnf），重启MySQL服务，使配置生效。

```cnf

# 启用二进制日志
log-bin=master-binlog

# 二进制日志格式
binlog-format=row

#设置服务器ID，确保每个服务器的ID唯一。
server-id=1

# 数据库名（可选）：
# binlog-do-db=指定需要复制的数据库。

# 设置中继日志
relay-log=relay-bin


```

#### 创建复制用户

创建复制用户：在主服务器上创建一个复制用户，并授权复制权限

```sql

CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';  
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';  
FLUSH PRIVILEGES;


```

#### 从服务器配置

修改配置文件，编辑从服务器的MySQL配置文件，设置完成后重启MySQL服务

```cnf


# 确保服务器ID与主服务器不同
# 其他相关配置可根据需要设置
server-id=2

# 启用二进制日志
log-bin=master-binlog

# 二进制日志格式
binlog-format=row

# 设置中继日志
relay-log=relay-bin

# 设置从库为指读模式
# read-only=1


```

#### 查看主服务二进制日志状态

在主服务器上执行以下命令，记录二进制日志文件名和位置，这些信息将用于从服务器的配置

```sql
SHOW MASTER STATUS;


```

#### 配置从服务器的主复制配置信息

在从服务器上将执行，将配置复制指向主服务器

```sql
CHANGE MASTER TO  
MASTER_HOST='10.64.100.91',  
MASTER_USER='replicator',  
MASTER_PASSWORD='password',  
MASTER_LOG_FILE='binlog.000009',  
MASTER_LOG_POS=154;

```

```sql
# 启动复制
START SLAVE;

# 验证复制状态：
SHOW SLAVE STATUS\G;

# 主要是2个

Slave_I0 Running，YES
Slave SqL Rurning，YES


```

# 不重新打包修改nginx-web镜像写死的API地址

由于各种原因前端的API地址被写死了，而临时需要修改地址，打包发布麻烦,不知道哪个版本的代码对应这个版本，可以这样做。

#### nginx.conf中写死的服务发现

- 方法一，使用主机别名，类似hosts功能

[![](https://iovhm.com/book/uploads/images/gallery/2024-12/scaled-1680-/TuqseE0Eyb0mPVUv-image-1734747602297.png)](https://iovhm.com/book/uploads/images/gallery/2024-12/TuqseE0Eyb0mPVUv-image-1734747602297.png)

- 方法二，使用下面的字符串替换

#### 页面中写死的API地址

- **编写一段API替换脚本和nginx启动脚本**

**注意第一句的#!/bin/bash , 根据镜像不同，可能是#!/bin/sh**

```shell
#!/bin/bash
# 根据基础镜像的不同，可能是/bin/sh，而且这句要是第一句

# 如果环境变量存在则用环境变了，如果环境变量不存在，则使用默认值，注意前面的减号语法(-)
OLD_URL=${OLD_URL:-"https://park.wvpark.com:802/"}
NEW_URL=${NEW_URL:-"http://weipin.hmncloud.top/"}

# 文件名称很确定，直接替换
sed -i "s|${OLD_URL}|${NEW_URL}|g" /usr/share/nginx/html/assets/iframe-view-4c8b16ca.js

# 不管什么文件，直接替换
# grep -rl "ak=${OLD_AK}" /usr/share/nginx/html | xargs sed -i "s|ak=${OLD_AK}|ak=${NEW_AK}|g"

# 文件名称相对确定，查找替换
# SEARCH_DIR="/usr/share/nginx/html/assets"
# FILE_PREFIX="iframe-view*.js"
# for FILE in $(find "$SEARCH_DIR" -type f -name "${FILE_PREFIX}"); do
#     # 使用 sed 进行替换操作，-i 选项表示直接编辑文件
#     sed -i "s|${OLD_URL}|${NEW_URL}|g" "$FILE"
#     # 打印已处理的文件名
#     echo "Processed file: $FILE"
# done

# 启动nginx
nginx -g 'daemon off;'



```

- **将配置文件放入configmap并挂载或则直接挂载进容器,并设置挂载文件为777权限**

docker和docker-compose挂载为777 请自行百度

[![](https://iovhm.com/book/uploads/images/gallery/2024-12/scaled-1680-/7aLrlKhkog4WnKj3-image-1734733921783.png)](https://iovhm.com/book/uploads/images/gallery/2024-12/7aLrlKhkog4WnKj3-image-1734733921783.png)

[![](https://iovhm.com/book/uploads/images/gallery/2024-12/scaled-1680-/itsb3yTwEgpLIqjQ-image-1734733960919.png)](https://iovhm.com/book/uploads/images/gallery/2024-12/itsb3yTwEgpLIqjQ-image-1734733960919.png)

[![](https://iovhm.com/book/uploads/images/gallery/2024-12/scaled-1680-/YjEME16QwY115Kcx-image-1734734124040.png)](https://iovhm.com/book/uploads/images/gallery/2024-12/YjEME16QwY115Kcx-image-1734734124040.png)

- **将容器的启动命令设置为自己的启动脚本**

[![](https://iovhm.com/book/uploads/images/gallery/2024-12/scaled-1680-/atbTXHc9ztaC2iEH-image-1734734175536.png)](https://iovhm.com/book/uploads/images/gallery/2024-12/atbTXHc9ztaC2iEH-image-1734734175536.png)

# 在无GUI界面的Linux服务器上执行jmeter

#### 准备工作

首先在有GUI的电脑，例如windows上将测试计划参数配置好，先使用一个并发运行一次，保证测试计划可以成功运行，将测试计划保存为**jmx**

#### 在服务器上运行

**jmeter**是使用java编写的，需要安装jdk，将**apache-jmeter-5.6.3.zip** 复制到服务器并解压缩，将前面保存的**jmx**也上传到服务器，进入到 **/apache-jmeter-5.6.3/bin** 目录

```shell

# cd /apache-jmeter-5.6.3/bin

./jmeter -n -f -t /data/test.jmx -l /data/test.jtl -e -o /data/report

# -n 无GUI界面
# -t  /data/test.jmx 测试计划文件
# -l /data/test.jtl  执行结果路径
# -e 测试完成后生成报告
# -o 测试报告生成路径
# -f 强制删除现有结果，默认情况是追加到已有结果，可能造成数据干扰


```

然后把测试报告打包下载回来查看，

```shell

tar -cvf report.tar ./report/


```

#### 使用docker-compose运行，不推荐，但是可以快速验证，内置一个nginx,可以使用浏览器查看测试报告

```

version: "3"
services:
  jmeter:
    image: harbor.iovhm.com/hub/openjdk:17
    container_name: jmeter
    privileged: true
    volumes:
      - ./apache-jmeter-5.6.3:/apache-jmeter-5.6.3
      - ./data:/data
    command: "tail -f /dev/null"
  jmeter-nginx:
    image: harbor.iovhm.com/hub/nginx:1.21.3
    container_name: jmeter-nginx
    ports:
      - "5500:80"
    volumes:
      - ./data:/usr/share/nginx/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

# 进入到容器
# docker exec -it jmeter /bin/bash
# 增加ll别名
# alias ll='ls -l --color=auto'
# 进入到jmeter的bin目录
# cd /apache-jmeter-5.6.3/bin
# 执行jmeter
# ./jmeter -n -f -t /data/test.jmx -l /data/test.jtl -e -o /data/report


```

- 开启nginx目录浏览

```
server {
    listen       80;
    #listen 443 ssl;
    server_name  localhost;

    root /usr/share/nginx/html;
    index index.html;

    location / {
        autoindex on;           # 开启目录浏览功能
        autoindex_localtime on; # 可选，显示文件修改时间为服务器本地时间
    }

}



```

#### 查看测试报告二

如果你不想使用浏览器查看结果，可以将生成的jtl文件下载回来，在有界面的jmeter查看

[![](https://iovhm.com/book/uploads/images/gallery/2025-01/scaled-1680-/EFWzeLRvnssnD8e4-image-1737119279341.png)](https://iovhm.com/book/uploads/images/gallery/2025-01/EFWzeLRvnssnD8e4-image-1737119279341.png)

# 室内地图制作方法

#### 项目源代码

[https://gitee.com/vpclub-wh/indoor-map](https://gitee.com/vpclub-wh/indoor-map)

#### 室内地图制作

用threejs实现的室内地图展示，原理非常简单

- 使用正交相机创建2D效果
- 根据地图数据多边形形状
- 使用**OrbitControls**进行地图控制

所有的代码都在**src/components/indoor-map.vue** 中

#### 制作地图形状数据

要实现平面地图倒是很简单，绘制多边形形状与标记，以便于数据绑定，则需要借助一些外部工具，因此，我们使用**Tiled mapeditor** 制作地图形状与标记

Tiled下载：[https://www.mapeditor.org/](https://www.mapeditor.org/)

#### 最终效果图

[![](https://iovhm.com/book/uploads/images/gallery/2025-02/scaled-1680-/07Pxev1BMc1CXhA6-image-1740375398127.png)](https://iovhm.com/book/uploads/images/gallery/2025-02/07Pxev1BMc1CXhA6-image-1740375398127.png)

#### 约定

首先，我们约定一张地图有四个图层，需要在图层中定义

- 背景图：**bg**，类型为图像层,图片的长和宽要求是2的整数倍
- 地板或者公共空间:**floor**，类型为对象层
- 房间:**rooms**，类型为对象层
- 文本标记:**label**，类型为对象层

[![](https://iovhm.com/book/uploads/images/gallery/2025-02/scaled-1680-/oWGura5W1rrerADR-image-1740375410222.png)](https://iovhm.com/book/uploads/images/gallery/2025-02/oWGura5W1rrerADR-image-1740375410222.png)

#### 进行区块标记

[![](https://iovhm.com/book/uploads/images/gallery/2025-02/scaled-1680-/RlX5rAwN4ASDYcCO-image-1740375416334.png)](https://iovhm.com/book/uploads/images/gallery/2025-02/RlX5rAwN4ASDYcCO-image-1740375416334.png)

**约定**

- 所有的对象均使用多边形，既使用矩形绘制的区块，也需要转换为多边形，可以在对象上右键，转换为多边形
- 为便于协作，对象的name属性作为与数据绑定的唯一依赖关系
- 因为文字内容需要动态变化，而文字的长和宽需要计算，因此label使用点位置进行标记，再动态计算放到与此坐标点的居中位置
- 导出格式为**json**

#### tiledmap快捷键

- 放大：ctrl++
- 缩小：ctrl+-
- 默认大小：ctrl+0
- 平移：滚轮或者按住空格
- 填充到窗口正中间：ctrl+/

# linux密码规则设置

#### 安装密码策略工具

```shell

cat /etc/os-release

rpm -qa|grep libpwquality

yum -y install libpwquality


```

#### 配置密码复杂度策略

```shell


vi /etc/security/pwquality.conf
cat  /etc/security/pwquality.conf

# 最小长度为8位
minlen = 8

# 至少包含1个数字
dcredit = -1

# 至少包含1个大写字母
ucredit = -1

# 至少包含1个小写字母
lcredit = -1


# 至少包含1个特殊符号
ocredit = -1

# 至少需要满足多少个条件（数字，大写，小写，特殊符号）
minclass = 4

# 禁止使用常见弱密码（如"123456"）
dictpath = /usr/share/cracklib/pw_dict



```

##### 一键运行脚本

```shell

sudo cp /etc/security/pwquality.conf{,.bak.$(date +%F-%T)} && \
sudo tee /etc/security/pwquality.conf >/dev/null <<'EOF'
# 最小长度为8位
minlen = 8

# 至少包含1个数字
dcredit = -1

# 至少包含1个大写字母
ucredit = -1

# 至少包含1个小写字母
lcredit = -1

# 至少包含1个特殊符号
ocredit = -1

# 至少需要满足多少个条件（数字，大写，小写，特殊符号）
minclass = 4
EOF



```

#### 验证是否起效

```

echo "123456" | pwscore
echo "12345678" | pwscore
echo "123456#Abc" | pwscore
echo "cZ2{sX" | pwscore
echo "oY0{dA5]" | pwscore


```

#### 查看所有用户

```shell

awk -F: '($7 !~ /nologin|false/) && ($2 !~ /^[*!]/ || $2 ~ /^\$/ ) {printf "%-12s UID:%-5s Shell:%s\n", $1, $3, $7}' /etc/passwd /etc/shadow


```

# linux时间同步

```shell

sudo tee -a /etc/chrony.conf << 'EOF'
server ntp.aliyun.com iburst
server ntp1.tencent.com iburst
EOF


systemctl restart chronyd

# 验证时间源
chronyc sources -v

# 立即同步

chronyc -a makestep


```

# windows下安装wget

- 下载地址：http://downloads.sourceforge.net/gnuwin32/wget-1.11.4-1-setup.exe
- 加入到环境变量的path:C:\\Program Files (x86)\\GnuWin32\\bin

# ibd2mysql&&mysql数据库idb文件修复

- [https://github.com/ddcw/ibd2sql](https://github.com/ddcw/ibd2sql)

```
# 下载
wget https://github.com/ddcw/ibd2sql/archive/refs/tags/v2.0.tar.gz

# 解压

# 生成建表语句和insert语句
python main.py /data/mysql/bad_db/bigdata_viproomdb/ods_od_work.ibd --ddl --sql --output bigdata_viproomdb

# 恢复


```

# tmux终端复用&&后台运行终端

有时候需要长时间执行一个shell,但是网络断开后，终端也随之关闭，可以使用tmux来新开一个持续运行的终端，不受ssh断开影响。

```
# 安装
yum install tmux

# 创建一个新的会话终端
tmux

# 创建一个新的会话终端，自定义名字
tmux new -s <name>

# 执行成功后，ctrl+b,d可以关闭终端窗口，但是shell程序可以继续在后台运行

# 查看运行中的复用终端
tmux ls

# 链接到终端
tmux attach -t 0


# 强杀某个终端



```

# linux时间同步

```
# 安装
yum install chrony -y

# 启用
systemctl enable chronyd --now

# 查看状态
systemctl status chronyd

# 填入配置
vi /etc/chrony.conf

server ntp.myhuaweicloud.com minpoll 4 maxpoll 10 iburst
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp2.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp3.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp4.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp5.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp6.aliyun.com minpoll 4 maxpoll 10 iburst



# 重启服务使配置生效
systemctl restart chronyd

# 查看时间同步源的状态
chronyc sources -v

# 查看时间同步的总体统计
chronyc tracking


```

```
chronyc tracking
Reference ID    : CB6B0658 (203.107.6.88)
Stratum         : 3
Ref time (UTC)  : Wed Feb 25 07:36:29 2026
System time     : 0.000241572 seconds slow of NTP time
Last offset     : +0.000208973 seconds
RMS offset      : 0.002260513 seconds
Frequency       : 6.410 ppm slow
Residual freq   : -14.559 ppm
Skew            : 3.548 ppm
Root delay      : 0.051426787 seconds
Root dispersion : 0.002829272 seconds
Update interval : 16.3 seconds
Leap status     : Normal



```

[![](https://iovhm.com/book/uploads/images/gallery/2026-02/scaled-1680-/uUCvoh9Vm9qjD7j5-image-1772005038437.png)](https://iovhm.com/book/uploads/images/gallery/2026-02/uUCvoh9Vm9qjD7j5-image-1772005038437.png)

# 升级gcc

```shell

# 下载安装包

wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/scl-utils-20130529-19.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/scl-utils-build-20130529-19.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/Packages/d/devtoolset-9-binutils-2.32-16.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/Packages/d/devtoolset-9-gcc-9.3.1-2.2.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/Packages/d/devtoolset-9-gcc-c++-9.3.1-2.2.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/Packages/d/devtoolset-9-libstdc++-devel-9.3.1-2.2.el7.x86_64.rpm
wget http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/Packages/d/devtoolset-9-runtime-9.1-0.el7.x86_64.rpm


# 打包(如果需要离线安装)
tar -czvf devtoolset9-vault.tar.gz ./

# 安装
yum install -y ./*.rpm


# 设置
scl enable devtoolset-9 bash

# 验证
gcc --version

# 写入全局环境变量
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
source /etc/profile


```