服务器维护记录

系统设置

nano vim

修改为四个空格

1
echo -e set "tabsize 4\nset tabstospaces" >> /etc/nanorc ; echo -e "set tabstop=4\nset shiftwidth=4\nset expandtab" >>  /etc/vimrc

python

记得链接一下

1
ln -s /usr/bin/python3 /usr/bin/python

时区

参考文章

ubuntu修改时区

使用 date 检查当前系统的时区,一般默认是 UTC

可以使用

1
tzselect

选择北京时间,然后选择时区

1
timedatectl set-timezone Asia/Shanghai

这样使用 date 时可以发现变成了 CST 东八区时间,但是依然是12小时制

详细检查时间

1
timedatectl

修改为24小时制

1
echo "LC_TIME=en_DK.UTF-8" >>/etc/default/locale

需要重启 | 重新登陆才能生效

需要注意,回滚快照后需要检查时间是否正确,重启系统可以重新矫正时间

用户

创建用户

1
useradd <useranme>

删除用户

1
userdel -r <username>

如果用户组无法自动删除,可以手动删除

1
groupdel <group_name>

创建无终端无法登录的账户

1
useradd -m -s /usr/sbin/nologin rsyncer

WiFi

需要安装的软件包

1
apt install wpasupplicant wireless-tools iw
  • wpasupplicant 连接WiFi使用的模块
  • wireless-tools 扫描WiFi使用的模块
  • iw 扫描硬件使用的模块

检查你的WiFi网卡名称

1
ip link show | grep wlp
  • WiFi网卡一般以 wlp 开头

(选做)扫描周围的可用网络SSID

1
iw dev wlp4s0 scan | grep SSID

确定SSID和密码后,先生成配置文件

1
echo -e 'network={\n\tssid="wifi-ssid"\n\tpsk="wifi-password"\n}' | tee /etc/wpa_supplicant/wpa_supplicant.conf

然后使用配置文件设置连接

1
wpa_supplicant -B -i wlp4s -c /etc/wpa_supplicant/wpa_supplicant.conf
  • wlp4s0 应该是你自己的WiFi硬件名称

连接WiFi,申请DHCP的IP地址

1
dhclient wlp4s0

检查IP是否获取

1
ip a s | grep wlp4s0

nmcli

ubuntu server使用 NetworkManager 接管 netplan

1
2
3
4
5
# 安装
apt install network-manager
# 修改配置文件管理
cd /etc/netplan
nano 00*.yaml

添加

1
renderer NetworkManager

然后接受更改

1
netplan try

此时使用

1
nmcli show device

可以看到大部分的接口都被接管, 但是应该没启用(深绿色)

修改超时等待时间

1
nano /etc/NetworkManager/NetworkManager.conf

[main] 内增加 configure-timeout=120

添加链接,给接口 ens19 增加为DHCP,设置超时为300秒

1
2
nmcli conn add type ethernet con-name ens19-dhcp ifname ens19 ipv4.method auto
nmcli conn modify en19-dhcp connection.wait-device-timeout 300

添加链接,给接口 ens18 设置静态连接,设置超时为200秒

1
2
nmcli conn add type ethernet con-name ens19-static ifname ens19 ipv4.address 192.168.3.2/24 ipv4.gateway 192.168.3.0 ipv4.method manual
nmcli conn modify ens18-static connection.wait-device-timeout 200

启用连接

1
2
nmcli conn up ens19-dhcp 
nmcli conn up ens18-static

检查连接

1
nmcli conn 

删除多余IP

有时候因为nmcli反复配置了静态地址又配置了动态地址会出现一点问题,按照这个指令删除多余的地址

1
ip addr del 192.168.1.1/24 dev ens19
  • ip **是多余的地址

拒绝权限

拒绝sudo下的权限

有时你sudo了也不能用一些指令(比如 reboot )

在root下

1
visudo

添加一个指令组,要求指令名称是全大写(不然好像会报错),然后添加一些指令

1
Cmnd_Alias LIMIT_COMMAND = /bin/ssh, /bin/su, /bin/cat, /usr/bin/less, /bin/echo, /usr/bin/netcat, /usr/bin/python, >

对某个自定义用户或自定义组使用这个权限组

1
2
3
4
%limit ALL=(ALL) ALL, !LIMIT_COMMAND
rsyncer ALL=(ALL) ALL, !LIMIT_COMMAND
## 不输入密码就无法使用LIMIT_COMMAND
ubuntu ALL=(ALL) ALL NOPASSWD: LIMIT_COMMAND

拒绝su指令

有的用户可以使用 su 来切换到别的用户,进行拒绝

1
nano /etc/pam.d/su

添加PAM(可插拔认证模块)

1
auth required pam_listfile.so item=user sense=deny file=/etc/su.deny onerr=fail

然后创建拒绝文件,写入用户名

1
echo "rsyncer" > /etc/su.deny

Mysql && MariaDB

查询所有用户

1
SELECT user, host, plugin FROM mysql.user

删除用户

1
drop user 'user'@'host';

查询当前活动连接数

1
SHOW STATUS LIKE 'Threads_connected';

查询链接的详细信息, 有那些用户在读写

1
SHOW PROCESSLIST;

IP

tailscale会为机器分配 CGNAT(运营商级NAT) 地址 , 为 100.64.0.0/10 ( 100.64.0.0 ~ 100.127.255.255 ) , 大约400万个地址

  • 一般情况下不会与常见的内网保留地址冲突 ( 10.0.0.0/8 也不会 ) , 不会干扰 LAN
  • 这些地址也不会在互联网上路由

注意

尽管有400万个地址 , 但是tailscale的私网v4依然在快速耗尽

现在不再分配唯一的私网v4, 而是可能重复的v4复用地址 , 并很可能只分配v6

由于重用机制存在, 当你尝试跨网(分享网络)时, 对方网络完全有可能存在IP地址与你网络某台机器相同, 从而导致灾难

为了解决这个问题, tailscale决定给每个分享网络的入网机器分配跟你网络不冲突的IP地址

这相当于, 这台分享机器在两张网都会有一个IP地址, 类似于网关

DNS & SearchDomain

记住服务器的IP会比较麻烦, tailscale允许使用DNS来为你的IP分配域名, 叫做 magic DNS 同时也能设置服务器的公共DNS

不过你无法添加自定义DNS , 他会自动分配

DNS

DNS设置有两块

  1. 受限DNS ( restricted nameserver)

只处理某些特定域名的DNS服务, 一般是你自己架设的内网DNS

例如, 你希望把一个特殊域名劫持掉, 作为内网的域名服务使用, 或者为了避免域名被国内DNS服务商污染, 要求一些特定域名使用外国的DNS查询 , 可以设置这个DNS

  1. 全局DNS ( global nameserver)

所有的DNS查询都走这个全局DNS, 也就是默认的DNS查询

全局DNS会被视作一个实体(IP集), 例如你设置全局服务器为 1.1.1.1 , 识别到为 Cloudflare , 则会自动添加所有CF的DNS地址作为DNS而不仅仅是一个DNS地址

一般情况下机器都会使用本地或者DHCP服务器通告的DNS地址, 你需要额外设置 强制本地DNS切换 , 参见 Override Local DNS部分

SearchDomain

搜索域(SearchDomain) , 即你可以不使用完全域名(FQDN, Fully Qualified Domain Name) , 他会自动补足后缀来节省时间

例如, 设置 example.com 为搜索域, 当你尝试访问 test 时会自动补足为 test.example.com 进行DNS查询 , 如果配置了多个搜索域, 会逐个查找, 直到有查询结果

  • MagicDNS启用后会指派一个优先级最高的搜索域 (DNS)
  • 你可以按照自己的想法添加搜索域并排列优先级
  • 你也可以直接在公共的DNS上直接解析你的域名为tailscale的内网地址, 只有内网的服务器才能访问到这些IP

注意, 由于现代程序使用了很多种方式来提高域名查询速度 ( 例如并行查询 , 并基于历史的返回速度对DNS服务器的优先级进行重新排序 ) , tailscale 不一定能确保DNS查询按照预期的顺序查询

如果你期望查询一定按照顺序进行查询, 回去使用DNS拆分 ( restricted domain) 或指定一个你的私人DNS 并在其中完成需要的动作

Force Override Local DNS

基于一些特殊原因你可能希望覆盖接入网络的机器的DNS服务

  1. 确保机器可以访问一些仅内网的域名
  2. 防止设备使用不受控制/被污染的DNS服务器
  3. 对设备的DNS解析域名访问进行审计控制过滤等

tailscale允许你强制网络中的设备都使用预定义的服务器 ,启用后加入网络的客户端将收到通知并忽略客户端自己的DNS

注意

必须确认所有的客户端都可以访问你即将指定的全局服务器, 否则会导致客户端DNS工作异常

Control D

参考文档 https://docs.controld.com/docs/personal-use-cases

注意

Control D似乎是一个云DNS ,你不能自己单独部署并修改配置

但是可以创建用户后使用他们的公共DNS, 并根据你的配置进行管控

高性能的可自定义的DNS服务器 , 包括域名审计 , 解析拦截 , 劫持以及家长控制等

  • 内置了一些自动更新的恶意和广告的域名和IP订阅, 可以自动阻止恶意及解析
  • 自动删除一些广告跟踪的参数

部署

首先需要选择解析器(resolver)类型

  • Legancy
  • DoH
  • DoT
  • DoQ ( DNS Over QUIC)

将配置文件导入终端Control D即可

Docker

容器内存操作

直接使用 htop 只能检查宿主的内存使用情况,要了解容器的内存使用情况需要使用别的指令

1
2
3
4
5
6
7
8
9
10
11
12
13
// 从宿主机检查容器占用
docker stats --no-stream

docker stats <dockerName>

docker inspect <dockerName> | grep -i memory
// 在容器内操作
// 检查当前已经使用的内存(B)
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
// 检查当前容器可用的内存(B)
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
// 检查内核中内存信息
cat /proc/meminfo

处理内存泄露

首先查看容器的内存详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat /sys/fs/cgroup/memory/memory.stat
>> [单位 字节]
cache 18994089984 缓存大小
rss 26247254016 常驻内存大小(不含swap)
rss_huge 18928893952 大页内存大小
mapped_file 246177792 映射文件使用的内存大小
dirty 20480 脏页大小(尚未写回)
writeback 0 正在写回的内存页大小
pgpgin 1164959981 从磁盘读入的页数
pgpgout 1171390420 写入磁盘的页数
pgfault 2633074935 缺页中断的次数(包含主缺页、次缺页)
pgmajfault 56752 主缺页中断次数
inactive_anon 937984 不活跃的匿名内存大小
active_anon 26264150016 活跃的匿名内存大小
inactive_file 9943097344 不活跃的文件缓存内存大小
active_file 9033093120 活跃的文件缓存内存大小
unevictable 0 不可回收的内存大小
hierarchical_memory_limit 51539607552 当前cgroup的内存限制
...
// total_* 是cgroup及其子cgroup的累计值,对应上述各项目的总和

尝试执行 echo 3 > /proc/sys/vm/drop_caches 来丢掉所有的缓存文件,释放缓存(危险操作)

docker-compose yaml

介绍

yaml文件支持一种叫做 锚点 的变量列表, 允许全文共享一些变量

1
2
3
4
5
x-shared-env: &shareEnvName
Var1: ${SysEnv: -defaultValue}
Var2: ${SysEnv2: -}
var3: ${SysEnv3: -}
const: 1

定义共享变量组后的调用方法 , 这里以 docker-compose为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
services:
serviceName:
image: langgenius/dify-api:0.8.3
restart: always
environment:
# 使用共享变量, 同时还要在后续中使用关键字才能获取这个变量
# 如果没有显示指定使用共享变量组, 后续的变量调用不会使用共享变量组的变量
<<: *shareEnvName
OtherEnvVar: ${sysEnv:-defaultVar}
envVar: 1
depends_on:
- otherService
- otherService2
# 启动时执行的指令, > 符号表示使用多行指令, 而不需要使用 \ 换行
command: >
bash -c 'do something && echo ${SysEnv:-default}'
-c 'do otherthing'
volumes:
- ./hardDiskFiles/volumes/exampleFiles:/app/serviceStorage/targetFiles
networkds:
- default
- otherNetwork
# 设置健康检查
healthcheck:
# 使用CMD执行命令
# 使用SHELL则使用 'CMD-SHELL', 或者直接使用字符串 'innserScriptOrCommand'
# 使用字符串 'None' 禁用
test: [ 'CMD', 'innserScriptOrCommand' ]
interval: 1s
timeout: 3s
retries: 30
# 配置文件生效字段, 使用 docker-compose --profiles <dev|prod> 控制这个服务配置是否启用
# 此处表示 dev 和 prod环境下都启动这个容器
profiles:
- dev
- prod
volumes:
# 没有详细定义的卷将在docker的默认路径以默认方式创建
exampleData:
exampleData2:
# 卷驱动类型
driver: local
driver_opts:
# 指定特定的卷文件系统类型, none 表示不指定
type: none
# 挂载方式
o: bind
# 源路径
device: /path

${sysEnv} 与 ${sysEnv: - }区别

前者如果没有找到系统变量则为空, 后者则使用空字符串作为默认值

profile 字段

使用profile字段可以配置这个服务在哪个配置项中被使用, 例如

1
docker-compose up --profile debug

按照匹配规则, docker-compose将会按照如下方式启动服务

  • 没有配置 profiles 字段的服务一定会被启动
  • profiles 配置为 "" 时无论指定的配置项为何都会被启动
  • profiles 配置为具体值时, 只有 —profile 指定才会被启动

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.9'
services:
app:
image: apps
web:
image: web
profiles:
- frontend
debug:
image: debug
profiles:
- debug
- frontend
something:
image: otehr
profiles:
- ""

如果执行默认的启动配置

1
docker-compose up

那么, 根据上方的配置文件, app 服务会持续保持启用, 且只有他会启动,其他的服务必须指定配置项才能启动

1
docker-compose up --profile fronted

此时配置为 fronted 的服务都会启动, 没有配置 profiles 字段的服务也会保持启动, 包括 app web debug

如果不指定任何具体值

1
docker-compose up --profile

那么只会启动 profiles 配置为 "" 的服务, 以及没有配置 profiles 字段的服务, 包括 app something ,其他服务不会启动

docker compose允许一个服务从属于多个profile


服务器维护记录
https://blog.sukiloli.com/2025/02/17/Linux维护/
作者
QLozin
发布于
2025年2月17日
许可协议