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:指定容器内的工作目录。
注意
因为 certbot 安装在了 nginx 容器内。如果执行 docker-compose down
再执行 docker-compose up -d
就会丢失证书。所以在构建 nginx 容器的时候,一定要配置好证书的 volume。就是 certbot 生成的证书位置和本地宿主机的一个映射。
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。
生成单个域名证书
生第一个域名证书的时候,会让你输入 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月
28
长期维护,国内镜像。请访问 https://cloud.tencent.com/developer/article/2485043
centos
# 打开或新建 daemon.json
vim /etc/docker/daemon.json
# 加入一下配置
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
# 重启
sudo systemctl daemon-reload
sudo systemctl restart docker
3月
26
docker 备份数据库
- 创建
/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'
- 设置权限
chmod +x /user/local/src/backup/mysql-backup.sh
- 添加定时任务\
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/
离线安装
-
查看系统架构
uname -p
根据输出结果(如 x86_64 或 aarch64),方便选择对应的 Docker 离线安装包。
-
访问 docker 官网,下载对应的包。 https://download.docker.com/linux/static/stable/
当前最新版本是 27.5.1。完整下载地址是。https://download.docker.com/linux/static/stable/aarch64/docker-27.5.1.tgz
-
将下载好的包先解压到某个目录。比如 /opt 目录下。
tar -zxvf docker-27.5.1.tgz -C /opt
-
将解压好的 Docker 二进制文件移动到 /usr/local/bin 目录下。
mv /opt/docker/* /usr/local/bin
-
配置 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
- 设置 docker.service 权限,启动,并设置自启动。
chmod +x /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker
systemctl enable docker
- 查看 docker 版本
docker -v
只安装 docker 还不够,还得安装个 docker-compose
安装 docker-compose
- 打开下载地址: https://github.com/docker/compose/tags ,根据系统选择对应的版本,下载到 /opt 目录下。
wget wget https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-aarch64
- 移动到 /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
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月
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
1月
09
https://github.com/coturn/coturn
这里使用 docker
来构建。
先准备一份 docker-compose.yaml
文件。
version: '3.9'
services:
coturn:
image: coturn/coturn
ports:
- 3478:3478
- 5349:5349
volumes:
- ./conf/coturn:/etc/coturn
networks: webrtcnet
networks:
webrtcnet:
name: 'webrtcnet'
driver: bridge
这里配置了端口映射和配置文件。当然配置文件可以不要,这样就空账号密码。ip 随主机 ip。这里加了 volumes
, 可以有,但不一定要用。
./conf/coturn/turnserver.conf 配置文件。这里我全注释掉了。
# listening-port=3478
# tls-listening-port=5349
# external-ip=47.**.**.81
# user=17vision:17vision2024
# realm=17vision.com
然后执行 docker-compose up -d
运行起来。
最后,可以通过 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 这个站点进行测试。
操作如下图所示:
相关文章
https://blog.csdn.net/codebooks/article/details/115757643
https://zhuanlan.zhihu.com/p/622818243
1月
06
有的时候只有一个域名。想让其他的服务也用这个域名和 80 端口。用 nginx 做代理就是一种方式。websocket 通常也会用到。
业务场景
在这里,有一个域名 xxx.com
,通常使用 https
来访问,比如 https://xxx.com
。加入 https://xxx.com
, 已经有正在使用的业务。下边的场景都不能去干涉已有的业务场景。
- 我有一个 node.js 的服务,其端口后是 3000,那么就可以通过代理来实现域名的访问。只是,这里要在 url 上做文章。 比如我请求
https://xxx.com/blog/xxx
这个服务,就让其转发到 node.js 的服务的 /xxx
上。那么,nginx 可以这样配置。
# Upgrade Connection websockets 和 升级的 http 协议才会用到
location ^~/blog/ {
proxy_pass http://blog:3000/;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection 'upgrade';
# proxy_cache_bypass $http_upgrade;
}
这里的代理 http://blog:3000/
是因为 docker 构建的同一个网络中的服务叫做 blog,所以可以这么写。如果仅仅是宿主机,可以通过具体的 ip 来弄。
其实,之前我是想通过 rewrite 来实现。代码就是下边这样。只是这样虽然 url 修改了,但是似乎又重新发起请求了,并不是直接到代理那边。以至于添加的 location 无效。具体是什么情况,也不是很了解。毕竟 nginx 不精通,遇到具体的需要就去查询。所以想实现修改 url 又能实现代理,可以用上边的 location 语法。
# Upgrade Connection websockets 和 升级的 http 协议才会用到
location /blog {
rewrite ^/dss(.*)$ $1 last;
proxy_pass http://blog:3000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Host $host;
# proxy_set_header Connection 'upgrade';
# proxy_cache_bypass $http_upgrade;
}
主要是因为 node 那边定义的路由就是 /xxx/xxx
, 没有 blog
这一节。