Write the Code. Change the World.

分类目录
5月 08

如果不需要泛域名证书,可以不用安装对应域名运营商的 cli 工具

nginx 镜像

仅安装 certbot 的 Dockerfile

ARG NGINX_IMAGE
FROM ${NGINX_IMAGE}

# 安装 certbot https://certbot.eff.org/instructions?ws=nginx&os=snap
# 也可以在 nginx 之外使用 certbot 镜像 https://hub.docker.com/r/certbot/certbot
RUN apt-get update && \
    apt-get install -y python3-venv && \
    python3 -m venv /opt/certbot && \
    /opt/certbot/bin/pip install certbot certbot-nginx && \
    ln -s /opt/certbot/bin/certbot /usr/local/bin/certbot && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

安装 certbot 和 aliyun cli 的Dockerfile

ARG NGINX_IMAGE
FROM ${NGINX_IMAGE}

# 安装 certbot https://certbot.eff.org/instructions?ws=nginx&os=snap
# 也可以在 nginx 之外使用 certbot 镜像 https://hub.docker.com/r/certbot/certbot
RUN apt-get update && \
    apt-get install -y wget python3-venv && \
    python3 -m venv /opt/certbot && \
    /opt/certbot/bin/pip install certbot certbot-nginx && \
    ln -s /opt/certbot/bin/certbot /usr/local/bin/certbot && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 安装阿里云 cli https://help.aliyun.com/zh/cli/install-cli-on-linux?spm=a2c4g.11174283.0.0.5df9478dHNZ4T9
# https://help.aliyun.com/zh/cli/run-alibaba-cloud-cli-in-a-docker-container
RUN mkdir -p /soft && \
    cd /soft && \
    wget -q https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz && \
    tar -xzvf aliyun-cli-linux-latest-amd64.tgz && \
    cp aliyun /usr/local/bin/ && \
    rm -rf /soft/aliyun-cli-linux-latest-amd64.tgz

# 验证阿里云 CLI 是否安装成功
RUN aliyun version

构建镜像,当前 nginx 最新版本是 1.28.0

docker build --build-arg NGINX_IMAGE=nginx:1.28.0 -t nginx-certbot .

手动生成证书

假设服务器上已经使用了该 nginx 镜像。并且配置文件目录是 /etc/nginx/。假如某个 .conf 文件使用了 vini123.com 的证书。就可以通过一下命令生成。

# 找到容器的名字或 id 前三位
docker ps

# 生成证书
docker exec -i nginx1.28.0 certbot --nginx --nginx-server-root=/etc/nginx -d vini123.com -d www.vini123.com

docker exec 常用 option 说明。

常用选项
-d:在后台运行命令。
-i:保持 STDIN 打开,即使没有附加。
-t:分配一个伪终端。
-u:指定在容器内执行命令的用户。
--workdir:指定容器内的工作目录。
4月 28

https://certbot.eff.org/instructions?ws=nginx&os=snap&tab=standard

安装

安装 snapd

https://snapcraft.io/docs/installing-snap-on-centos

https://snapcraft.io/docs/installing-snapd

yum install snapd

systemctl enable --now snapd.socket

ln -s /var/lib/snapd/snap /snap

看看 snapd 状态。 snap changes

安装 certbot

snap install --classic certbot

建立软链

ln -s /snap/bin/certbot /usr/bin/certbot

生成证书

必须服务器先安装好 nginx。

生成单个域名证书

  • 执行 nginx -t 先查找 nginx 的配置文件位置。比如:/tianwanggaidhu/service/nginx/conf/nginx.conf
  • 执行生成命令。比如生成证书的域名是 vini123.com。
    certbot --nginx --nginx-server-root=/tianwanggaidhu/service/nginx/conf -d vini123.com -d www.vini123.com

    需要注意的是,--nginx-server-root 对应的是 nginx.conf 的配置目录,而不是具体的文件。

生第一个域名证书的时候,会让你输入 email,然后同意协议(y 回车即可)。生成一次后,后边的域名就直接生成了。

可以在任意位置执行该命令。

生成成功的同时,nginx 也一起重启了。也就是生成后,证书就 ok了。

证书续期

生成的证书有效期是 3 个月的。3个月后,需要新的证书。这里用续期处理。

certbot renew --dry-run

可以通过定时任务来续订。

生泛域名证书

参考

https://www.cnblogs.com/michaelshen/p/18538178

4月 27

coturn

https://github.com/coturn/coturn/

安装

安装依赖

yum install -y make gcc cc gcc-c++ wget openssl-devel libevent libevent-devel

下载和编译

cd /usr/local/src

wget https://codeload.github.com/coturn/coturn/tar.gz/refs/tags/4.6.2

tar -xzvf coturn-4.6.2.tar.gz

cd coturn-4.6.2

./configure

make

make install

安装结束时的最后几行日志。

install -p examples/etc/turnserver.conf /usr/local/etc/turnserver.conf.default
cp -rpf examples/etc /usr/local/share/examples/turnserver
cp -rpf examples/scripts /usr/local/share/examples/turnserver
rm -rf /usr/local/share/examples/turnserver/scripts/rfc5769.sh
cp -rpf include/turn/client /usr/local/include/turn
install -p include/turn/ns_turn_defs.h /usr/local/include/turn
cat /usr/local/share/doc/turnserver/postinstall.txt

检查安装

which turnserver

输出:/usr/local/bin/turnserver

配置 turn

cd /usr/local/etc
cp turnserver.conf.default turnserver.conf

配置以下信息。

listening-port=3478  # 监听的端口
listening-ip=0.0.0.0 # 监听的内网IP
external-ip=x.x.x.x  # 监听的外网IP
user=user:123456     # 设置账号密码
realm=xxx.com        # realm 名称,通常是一个域名
no-tls
no-dtls
verbose
log-file=/var/log/turn.log # 配置日志位置

配置自启动

添加

vim /usr/lib/systemd/system/turnserver.service

# 配置以下内容
[Unit]
Description=turnserver for p2p
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/turnserver -o -c /usr/local/etc/turnserver.conf
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

# :wq 保存

启用

  • systemctl daemon-reload 重置服务列表
  • systemctl enable turnserver.service 开启开机自启
  • systemctl start turnserver.service 启动服务
  • systemctl restart turnserver.service 重启服务
  • systemctl status turnserver.service 查看状态
  • systemctl disable turnserver.service 关闭开机自启。()不关闭,就不执行这个)

查看进程

ps -ef|grep turnserver

# 只显示主进程
pgrep -a turnserver

查看监听端口。

netstat -tulnp | grep turnserver

查看 3478 端口。

lsof -i :3478

测试检查

turnutils_uclient -v -t -y -u user -w password ip

替换对应的 user, password, ip 为配置的值。

或网页测试
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

参考

https://sanyers.github.io/blog/web/webrtc/turn%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2.html#_6%E3%80%81%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1

https://coturn.net/turnserver/

https://github.com/coturn/coturn/wiki/Downloads

3月 26

docker 备份数据库

  1. 创建 /user/local/src/backup/mysql-backup.sh 文件。
#!/bin/bash

CONTAINER_NAME="mysql8.2"                 # MySQL容器名称
MYSQL_PWD="xxxxxx"                        # 数据库密码
MYSQL_DATABASE="xxxxxx"                   # 数据库名称
BACKUP_DIR="/user/local/src/backup/mysql" # 备份存储目录
LOG_DIR="/user/local/src/backup/logs"     # 备份存储目录
DATE=$(date +"%Y%m%d")

# 确保备份目录存在
mkdir -p "$BACKUP_DIR"
mkdir -p "$LOG_DIR"

# 每周日进行全量备份
if [[ $(date +%u) -eq 7 ]]; then
    echo "开始备份..."
    BACKUP_FILE="$BACKUP_DIR/mysql_full_$DATE.sql"
    docker exec $CONTAINER_NAME sh -c "mysqldump -uroot -p'$MYSQL_PWD' $MYSQL_DATABASE" >"$BACKUP_FILE"
    gzip "$BACKUP_FILE"
    echo "备份完成并压缩,存储路径:$BACKUP_FILE.gz"
else
    echo "今天不是周天,不备份"
fi

如果备份所有数据库。mysqldump --all-databases -uroot -p'$MYSQL_PWD'

  1. 设置权限
chmod +x /user/local/src/backup/mysql-backup.sh
  1. 添加定时任务\
crontab -e

#每天凌晨 2 点启动定时任务
0 2 * * * bash /user/local/src/backup/mysql-backup.sh >> /user/local/src/backup/logs/backup_$(date +\%Y\%m\%d).log 2>&1
2月 06

https://www.kylinos.cn/

离线安装

  1. 查看系统架构

    uname -p

    根据输出结果(如 x86_64 或 aarch64),方便选择对应的 Docker 离线安装包。

  2. 访问 docker 官网,下载对应的包。 https://download.docker.com/linux/static/stable/
    当前最新版本是 27.5.1。完整下载地址是。https://download.docker.com/linux/static/stable/aarch64/docker-27.5.1.tgz

  3. 将下载好的包先解压到某个目录。比如 /opt 目录下。

    tar -zxvf docker-27.5.1.tgz -C /opt
  4. 将解压好的 Docker 二进制文件移动到 /usr/local/bin 目录下。

    mv /opt/docker/* /usr/local/bin
  5. 配置 Docker 服务。创建并编辑/usr/lib/systemd/system/docker.service文件。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
  1. 设置 docker.service 权限,启动,并设置自启动。
chmod +x /usr/lib/systemd/system/docker.service

systemctl daemon-reload
systemctl start docker
systemctl enable docker
  1. 查看 docker 版本
    docker -v

只安装 docker 还不够,还得安装个 docker-compose

安装 docker-compose

  1. 打开下载地址: https://github.com/docker/compose/tags ,根据系统选择对应的版本,下载到 /opt 目录下。
wget wget https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64
  1. 移动到 /usr/local/bin 下,并设置权限。
v docker-compose-linux-aarch64 /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

配置镜像源

如果不配置镜像源,国内很难下载到想要的镜像。配置镜像源是很必须的。

mkdir /etc/docker

vim /etc/docker/daemon.json
#内容如下
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
    ]
}

systemctl daemon-reload
systemctl restart docker

参考:https://cloud.tencent.com/developer/article/2485043

1月 02

局域网内,即使不配置 stun/turn, webrtc 也是能音视频通话。如果在广域网环境,必须得有 turn 服务。那么自己构建一个 turn 服务就很有必要。不过广域网的 webrtc 对带宽的消耗也是很大。

STUN
STUN(Session Traversal Utilities for NAT,NAT 会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的 Internet 端端口。这些信息被用来在两个同时处于 NAT 路由器之后的主机之间创建 UDP 通信。该协议由 RFC 5389 定义。(提供客户端检测自己的公共 IP 地址和端口)

STUN 并不是每次都能成功的为需要 NAT 通话设备分配 IP 地址的,P2P 在传输媒体流时,使用的本地带宽,在多人视频通话的过程中,通话质量的好坏往往需要根据使用者本地的带宽确定。

TURN
TURN 的全称为 Traversal Using Relays around NAT,是 STUN/RFC5389 的一个拓展,主要添加了 Relay 功能。如果终端在 NAT 之后, 那么在特定的情景下,有可能使得终端无法和其对等端(peer)进行直接的通信,这时就需要公网的服务器作为一个中继, 对来往的数据进行转发。这个转发的协议就被定义为 TURN。

在 STUN 分配公网 IP 失败后,可以通过 TURN 服务器请求公网 IP 地址作为中继地址。这种方式的带宽由服务器端承担,在多人视频聊天的时候,本地带宽压力较小,并且,根据 Google 的说明,TURN 协议可以使用在所有的环境中。(中继流量,当点对点连接不可用时,Coturn 会接管通信。)

ICE 跟 STUN 和 TURN 不一样,ICE 不是一种协议,而是一个框架(Framework),它整合了 STUN 和 TURN。coturn 开源项目集成了 STUN 和 TURN 的功能。

继续阅读

8月 02

操作

有就编辑,没有就创建 .vimrc 文件

vim ~/.vimrc

增加以下配置。

set encoding=utf-8  
set fileencodings=utf-8,gbk,gb2312,gb18030,cp936,latin1  
set termencoding=utf-8

使得生效

source ~/.vimrc
4月 11

win10 系统,安装 docker,然后跑 php 项目,通常会很慢,一个最简单接口都可能要好几秒,真叫人肝疼。改变不了 win10,只能找解决方法。

处理方法

慢的原因网上有很多,怎么解决网上也很多,也实践过。不过,有一条是真的快。将代码放在 ubuntu 系统上跑,就是快。

步骤

  1. 先安装 Ubuntu。
  2. 再安装 docker。
  3. 设置 docker 。

设置 docker 如下图所示。

  1. win + s 搜索安装的 ubuntu,点击图标,进入终端中。在 /mnt/ 目录对应的本地磁盘中的文件复制到 ubuntu 系统中,比如 /docker-data/p1, p1 是项目名

  2. 配置自启动。在 /etc/systemmd/system/ 下创建 p1-docker.service。vim p1-docker.service 写入脚本。

[Unit]
Description=My Docker Compose Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'cd /docker-data/p1 && docker-compose up'
ExecStop=/bin/bash -c 'cd /docker-data/p1 && docker-compose down'
Restart=on-failure

[Install]
WantedBy=multi-user.target

Description:服务的描述。
After:指定该服务在 network.target 之后启动。
ExecStart:启动服务时执行的命令。
ExecStop:停止服务时执行的命令。
Restart:服务失败时自动重启。
WantedBy:指定该服务在多用户目标下启动。

设置权限。

sudo chmod +x p1-docker.service

设置自启动

systemctl enable mydocker.service
systemctl start mydocker.service

查看服务状态

systemctl status mydocker.service

这个时候再去请求 php 的接口就飞快。

测试

查看接口响应时间

docker ps
docker exec -it xxx bash
curl --request POST http://xxx.com/xxxx -w "请求时间:%{time_total} 秒\n" -o /dev/null -s

这里有个问题,将本地的文件复制的 ubuntu 上对开发不太友好。可以挂载或直接使用 /mnt/ 目录下的文件吗,暂时没试过

4月 09

买了个 99 元的阿里云,最近经常卡死。通过 htop,可以看到是 /usr/bin/dnf makecache 占用 cpu 太高。

尝试处理

关闭 CentOS 的后台更新服务

systemctl stop dnf-makecache.timer

systemctl disable dnf-makecache.timer

后续

运行了许多天后,又卡死了。使用 htop 查看,发现是阿里云的监控煮助手。好吧,把监控助手也搞掉。

先干掉监控助手的守护进程。

# 停止云助手守护进程
/usr/local/share/assist-daemon/assist_daemon --stop

# 卸载云助手守护进程
/usr/local/share/assist-daemon/assist_daemon --delete

# 删除云助手守护进程目录
rm -rf /usr/local/share/assist-daemon

再来干掉监控助手。

# 查询您的ECS实例是否使用systemd初始化进程服务,有返回信息则表示使用的是systemd
strings /sbin/init | grep "/lib/system"

# 停止云助手Agent
systemctl stop aliyun.service

# 卸载云助手Agent
sudo rpm -qa | grep aliyun_assist | xargs sudo rpm -e

参考

https://blog.csdn.net/kunyus/article/details/106861400

https://help.aliyun.com/zh/ecs/user-guide/start-stop-or-uninstall-the-cloud-assistant-agent

https://help.aliyun.com/zh/ecs/user-guide/start-stop-or-uninstall-the-cloud-assistant-agent#section-ge4-ads-7ud

https://ivpsr.com/3914.html