发布于 

Linux一些常用命令

nginx

配置文件路径

1
2
/etc/nginx/nginx.conf
/etc/nginx/sites-available/default

验证配置文件

1
nginx -t

刷新配置文件

1
nginx -s reload

配置文件参考

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# 全局 HTTPS 重定向配置
server {
server_name default_server;
location /.well-known/acme-challenge/ {
root /var/www/html;
}

location / {
return 301 https://$host$request_uri;
}

listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

# 80端口 -> 301 重定向到 HTTPS
server {
listen 80;
server_name default_server;

location /.well-known/acme-challenge/ {
root /var/www/html; # Certbot 用于 HTTP 续期
}

location / {
return 301 https://$host$request_uri;
}
}

# 配置官网
server {
listen 443 ssl default_server;
server_name home.xxx.xx;

# 禁止网站被嵌入
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none';" always;

ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot

root /data/apps/web/dist;
index index.html;

# 添加错误页面配置
error_page 404 /404.html;

location / {
try_files $uri $uri/ $uri.html =404;
}

}

# 配置xx客户端前端服务
server {
listen 443 ssl;
server_name www.xxx.xx xxx.xx;
ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot

root /data/apps/webmail/dist;
index index.html;

# 自定义错误页面配置
error_page 404 /index.html;

location / {
try_files $uri $uri/ =404;
}
# 处理自定义 404 页面
location = /404.html {
root /data/apps/webmail;
internal;
}


}

# 配置后台 管理端
server {
listen 443 ssl;
server_name teman.xxx.xx;

ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem;

root /data/apps/webadmin/dist;
index index.html;

# 自定义错误页面配置
error_page 404 /index.html;

location / {
try_files $uri $uri/ =404;
}
# 处理自定义 404 页面
location = /404.html {
root /data/apps/webadmin;
internal;
}
}

# 配置客户端后端服务
server {
listen 443 ssl;
server_name backend.xxx.xx;
client_max_body_size 30M;

add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none';" always;

ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot

# 禁止访问 /aiServer/ 路径(必须放在靠前位置)
location ^~ /aiServer/ {
return 403;
}

#专门处理 WebSocket 通知的 location 块
location /api/v1/ws/ {
# 代理到您的 Spring Boot 应用地址
proxy_pass http://127.0.0.1:6001;

# --- 以下是代理 WebSocket 的核心配置 ---

# 1. 允许协议升级
proxy_http_version 1.1;

# 2. 传递 "Upgrade" 请求头 (关键)
# $http_upgrade 是一个 Nginx 内置变量,它会获取客户端请求中的 Upgrade 头
proxy_set_header Upgrade $http_upgrade;

# 3. 传递 "Connection" 请求头 (关键)
# 明确告知后端服务器要升级连接类型
proxy_set_header Connection "upgrade";

# --- 其他标准的代理头信息,确保后端能获取真实信息 ---
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# --- 针对长连接的超时设置 ---
# 避免因默认的60秒超时导致 WebSocket 连接被意外断开
proxy_read_timeout 3600s; # 1小时
proxy_send_timeout 3600s; # 1小时
send_timeout 3600s;
}

# 默认的 location 配置,不影响其他请求
location / {
proxy_pass http://127.0.0.1:6001; # 代理到本地服务
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

# 针对 SSE 请求的特殊配置
location /service/logs/realtime {
proxy_pass http://127.0.0.1:6001; # 代理到本地服务
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# SSE 关键优化
proxy_buffering off; # 禁用缓冲,确保数据流不中断
proxy_cache off; # 确保 Nginx 不缓存 SSE 响应
proxy_set_header Connection ''; # 避免 Nginx 添加 `Connection: close`,保持连接
chunked_transfer_encoding off; # 禁用 chunked 传输,SSE 不需要它

# 只针对 SSE 请求设置的超时
proxy_read_timeout 3600s; # 设置为较长时间(例如 3600 秒 = 1 小时)
proxy_send_timeout 3600s; # 设置为较长时间
send_timeout 3600s; # 设置 Nginx 向客户端发送响应的超时时间
}

location /thirdParty/chat/conversationWithType {
proxy_pass http://127.0.0.1:6001; # 代理到本地服务
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# SSE 关键优化
proxy_buffering off; # 禁用缓冲,确保数据流不中断
proxy_cache off; # 确保 Nginx 不缓存 SSE 响应
proxy_set_header Connection ''; # 避免 Nginx 添加 `Connection: close`,保持连接
chunked_transfer_encoding off; # 禁用 chunked 传输,SSE 不需要它

# 只针对 SSE 请求设置的超时
proxy_read_timeout 3600s; # 设置为较长时间(例如 3600 秒 = 1 小时)
proxy_send_timeout 3600s; # 设置为较长时间
send_timeout 3600s; # 设置 Nginx 向客户端发送响应的超时时间
}
}

# 配置前端运营后台
server {
listen 443 ssl;
server_name ope.xxx.xx;
ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot

root /data/apps/opeAdmin/dist;
index index.html;

# 自定义错误页面配置
error_page 404 /index.html;

location / {
try_files $uri $uri/ =404;
}
# 处理自定义 404 页面
location = /404.html {
root /data/apps/opeAdmin;
internal;
}

}

# 运维后台
server {
listen 443 ssl;
server_name ops.xxx.xx;
client_max_body_size 30M;

ssl_certificate /etc/letsencrypt/live/teman.xxx.xx/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/teman.xxx.xx/privkey.pem; # managed by Certbot

# 默认的 location 配置,不影响其他请求
location / {
proxy_pass http://127.0.0.1:2122; # 代理到本地服务
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

}

其他

操作 命令
启动 Nginx sudo systemctl start nginx
停止 Nginx sudo systemctl stop nginx
重启 Nginx(强制) sudo systemctl restart nginx
平滑重载配置 sudo systemctl reload nginx
查看 Nginx 状态 sudo systemctl status nginx
检查配置语法 nginx -t
查看配置文件路径 nginx -V(查看 --conf-path

https证书

安装环境

1
2
sudo apt update
sudo apt install certbot python3-certbot-nginx

生成证书

在申请证书前,请确保要申请的域名(例如 example.com 或 www.example.com )已经解析到服务器的 IP 地址,否则验证会失败

1
sudo certbot --nginx -d xx.com -d mail.xx.com -d www.xx.com

有几个域名就-d几次,根据上面nginx配置的域名示例

1
sudo certbot --nginx -d home.kretest.com -d www.kretest.com -d backend.kretest.com -d kretest.com -d mail.xx.com -d teman.kretest.com

续订证书

证书到期后发现自动续订没有生效,然后去手动续订

全部续订

1
sudo certbot renew

续订后需要重启Nginx,或者把Nginx平滑重载配置

只续签某个证书

1
sudo certbot certonly --nginx -d xx.com -d mail.xx.com -d www.xx.com

续订后需要重启Nginx,或者把Nginx平滑重载配置

自动续签

1
systemctl list-timers | grep certbot

查看证书到期时间

1
sudo openssl x509 -in /etc/letsencrypt/live/xx.com/fullchain.pem -noout -dates

测试续签

不会真的修改证书

1
sudo certbot renew --dry-run

如果没有报错,就说明自动续订没问题

手动续订报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@kremail-dev:~# sudo certbot renew
Traceback (most recent call last):
File "/usr/bin/certbot", line 6, in <module>
from pkg_resources import load_entry_point
ModuleNotFoundError: No module named 'pkg_resources'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 72, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 32, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 12, in <module>
import os, glob, subprocess, os.path, time, pwd, sys, requests_unixsocket
File "/usr/lib/python3/dist-packages/requests_unixsocket/__init__.py", line 1, in <module>
import requests
ModuleNotFoundError: No module named 'requests'

Original exception was:
Traceback (most recent call last):
File "/usr/bin/certbot", line 6, in <module>
from pkg_resources import load_entry_point
ModuleNotFoundError: No module named 'pkg_resources'

看日志代表机器上的 Certbot 是 Python 版,但是依赖缺失(大概率是 python3-pkg-resources 或 python3-requests 包没装,或者被误删了)

起初尝试补缺少的依赖

1
2
sudo apt update
sudo apt install --reinstall python3-pkg-resources python3-requests

然后再执行手动续订,还是报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@kremail-dev:~# sudo certbot renew
Traceback (most recent call last):
File "/usr/bin/certbot", line 11, in <module>
load_entry_point('certbot==0.40.0', 'console_scripts', 'certbot')()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 490, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2854, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2445, in load
return self.resolve()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2451, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/usr/lib/python3/dist-packages/certbot/main.py", line 17, in <module>
from certbot import account
File "/usr/lib/python3/dist-packages/certbot/account.py", line 10, in <module>
import pyrfc3339
File "/usr/lib/python3/dist-packages/pyrfc3339/__init__.py", line 17, in <module>
from pyrfc3339.generator import generate
File "/usr/lib/python3/dist-packages/pyrfc3339/generator.py", line 1, in <module>
import pytz
ModuleNotFoundError: No module named 'pytz'

再补pytz,没有成功,而且如果继续提示缺别的模块(比如 acme, zope),就要一个个补,比较麻烦,然后想着直接重装

1
2
sudo apt update
sudo apt install --reinstall certbot python3-certbot-nginx -y

重装证书后还是报错,算了,直接弃用,直接上脚本。

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
#!/bin/bash
set -e

echo "🔍 检查 Certbot 版本..."
if command -v certbot >/dev/null 2>&1; then
VERSION=$(certbot --version 2>/dev/null | awk '{print $2}')
echo "当前 Certbot 版本: $VERSION"
else
VERSION="none"
echo "未安装 Certbot"
fi

# 如果版本太老(<1.0),或者直接用 apt 安装的,卸载旧版
if [[ "$VERSION" == "none" ]] || [[ "$VERSION" == 0.* ]] || dpkg -l | grep -q certbot; then
echo "🗑️ 移除旧版 Certbot (apt 包)..."
apt remove -y certbot python3-certbot-nginx || true
fi

echo "📦 确保 snapd 已安装..."
apt update -y
apt install -y snapd

echo "⬇️ 安装最新版 Certbot (snap 包)..."
snap install --classic certbot

echo "🔗 建立软链 /usr/bin/certbot"
ln -sf /snap/bin/certbot /usr/bin/certbot

echo "✅ Certbot 版本:"
certbot --version

echo "🧪 测试续签 (--dry-run)..."
sudo certbot renew --dry-run || {
echo "❌ 测试续签失败,请检查 Nginx 配置或 DNS 解析。"
exit 1
}

echo "🎉 Certbot 已更新并测试成功!证书续签已准备就绪。"
1
2
3
4
touch fix_certbot.sh
vim fix_certbot.sh
chmod +x fix_certbot.sh
sudo bash fix_certbot.sh

搞定,然后重启Nginx,续订后需要过几分钟才生效。

执行完成后用上面步骤的命令查看一下到期时间,如果到期时间没有成功延期,尝试手动延期一下

1
sudo certbot renew

snap 版自带 systemd 定时任务,会每天自动运行一次 certbot renew,如果证书快到期就续订,并自动 reload Nginx/Apache。

1
systemctl list-timers | grep certbot

如果有类似输出,说明每天会执行一次。

1
Sat 2025-09-13 00:00:00 UTC  ...  snap.certbot.renew.timer  certbot.renew.service

查看任务内容

1
2
systemctl cat snap.certbot.renew.service
systemctl cat snap.certbot.renew.timer

正常会看到它执行的是

1
/usr/bin/snap run certbot renew --quiet

要测试自动续订的话执行上面步骤的测试续订

查看内存使用

1
free -h

查看日志

1
2
tail -f xxx.log
tail -100f xxx.log

搜索日志

1
grep -C 3 "开始BC匹配" info.log

查看硬盘使用

1
df -h

查看硬盘使用排序

1
du -h --max-depth=1 / | sort -hr | head -n 10

查看硬盘使用排序,指定文件夹

/data 是文件夹 可替换为具体的

1
du -h --max-depth=1 /data | sort -hr | head -n 10

权限相关

赋予可执行权限

1
chmod +x xxx.sh

说明:
为文件 script.sh 添加执行权限,使其可以被运行。适用于脚本或二进制文件。

赋予读、写、执行权限给所有用户

1
chmod a+rwx file.txt

说明:
a 表示所有用户(owner、group、others),+rwx 添加读(r)、写(w)、执行(x)权限。

仅给文件所有者添加执行权限

1
chmod u+x file.sh

说明:
u 表示文件所有者(user),+x 添加执行权限。

设置精确权限(八进制表示法)

1
chmod 755 script.sh

说明:
使用八进制设置权限:
• 7 = 读(r) + 写(w) + 执行(x) = 4 + 2 + 1
• 5 = 读(r) + 执行(x) = 4 + 1
• 所以 755 表示:
• 所有者:rwx
• 所属组:r-x
• 其他人:r-x

vim

📝 所有命令默认为在「普通模式」下使用(按 Esc 退出插入模式后进入)


📌 导航相关

操作 命令 使用说明
跳转到第一行 gg Esc 回到普通模式,再按 gg
跳转到最后一行 G 普通模式下按 G
跳转到第 N 行 :NNgg : 输入后需按回车;或直接用 Ngg
跳转到当前行第一个非空字符 ^ 普通模式下按 ^
跳转到当前行最开始位置 0 普通模式下按 0
跳转到当前行行尾 $ 普通模式下按 $
跳转到当前行第 N 个字符 `N `
水平滚动到最左/右端 zs / ze 用于水平滚动的窗口或长行

🧹 删除 / 清空相关

操作 命令 使用说明
删除当前行 dd 普通模式下按 dd
删除 N 行 Ndd 例如 3dd 表示删除当前及其后两行
删除到行尾 D / d$ Dd$ 的简写,删除光标至行尾
删除到行首 d0 / d^ d0 含缩进,d^ 不含缩进
删除全文 ggdG 先跳到第一行 gg,然后 dG 删除至最后行
清空当前行 cc 删除当前行并自动进入插入模式
清空整个文件 :%d 命令模式输入,需回车

✍️ 编辑相关

操作 命令 使用说明
插入(当前光标) i 进入插入模式,开始输入
插入(行首) I 插入到行首的第一个非空字符前
新建行并插入(下) o 当前行下方新建一行并进入插入模式
新建行并插入(上) O 当前行上方新建一行并进入插入模式
替换当前字符 r<char> 例如 ra 把当前字符替换为 a
连续替换字符 R R 开始替换,Esc 退出
撤销 u 撤销上一步
重做 Ctrl + r 撤销的内容重新做
粘贴(后/前) p / P p 粘贴在光标后,P 粘贴在光标前
复制当前行 yy yank line
复制多行 Nyy 例如 3yy 复制三行

🔍 查找与替换

操作 命令 使用说明
向下查找关键字 /关键字 输入 /word 后按回车,n/N 浏览结果
向上查找关键字 ?关键字 输入 ?word 后按回车
查找下一个匹配项 n 与上次查找方向一致
查找上一个匹配项 N 与上次查找方向相反
替换当前行第一个匹配项 :s/旧/新/ 命令模式输入,替换当前行首次匹配
替换当前行所有匹配项 :s/旧/新/g 当前行全替换
替换全文所有匹配项 :%s/旧/新/g 所有行替换
替换全文并手动确认 :%s/旧/新/gc 每次替换前询问确认(y/n

🗂️ 文件和窗口操作

操作 命令 使用说明
保存文件 :w 命令模式输入并回车
退出 :q 如文件无更改可直接退出
强制退出 :q! 不保存直接退出
保存并退出 :wq / ZZ ZZ 为普通模式下的大写 Z 两次
打开文件 :e 文件名 替换当前文件内容为指定文件
垂直选项卡分屏 :vsp 文件 垂直拆分窗口并打开文件
水平分屏 :sp 文件 水平拆分窗口并打开文件
窗口之间切换 Ctrl + w + w 依次切换当前所有窗口

其他

1
top

按下 Ctrl + C 就可以退出

1
htop

按下 Ctrl + C 就可以退出

字段名 全称 / 中文名 含义 / 作用 取值范围与说明 是否越大越好 备注说明
PID Process ID 进程的唯一标识符 系统自动分配 用于终止进程或定位问题
USER 用户名 拥有该进程的用户 系统用户名或登录用户 用于区分用户进程
PRI Priority(优先级) 进程调度的优先级 数值越小表示优先级越高 是(越小越好) 与 NI 值相关,由内核计算
NI nice 值 用户可调整的进程优先级 -20(最高优先)到 19(最低优先) 影响 PRI 值,可用 nice/renice 修改
VIRT Virtual Memory 虚拟内存使用量 包括代码段、共享库、swap、映射文件等 不是实际占用内存,数值较大不一定表示问题
RES Resident Memory 实际使用的物理内存 真正驻留在 RAM 中的内存 越大表示物理内存占用越多
SHR Shared Memory 共享内存大小 与其他进程共享的内存(如共享库) 越大说明内存共享程度高,利用率好
S 状态(State) 当前进程状态 R(运行)、S(睡眠)、Z(僵尸)、T(停止)等 关注是否存在僵尸进程(Z)或长时间阻塞(D)
CPU% CPU 占用率 当前进程使用的 CPU 百分比 多核系统可能超过 100% 持续高占用可能表示死循环或负载重
MEM% 内存占用率 当前进程使用的物理内存百分比 相对于系统总内存 用于快速找出大内存进程
TIME+ 累计 CPU 时间 使用的 CPU 总时间 格式为 MM:SS.hh 数值大说明运行时间长,可用于判断服务长期性
Command 启动命令 启动进程时的完整命令 含路径与参数 有助于辨认运行程序来源
MEM 内存总览(顶部) 系统物理内存使用情况 总量、使用、缓冲、空闲 内存占用过高系统性能下降
SWP 交换空间(Swap) 系统 swap 使用情况 总量、使用、空闲 使用 swap 说明内存不足,可能导致系统变慢
1
2
sudo apt install cmatrix
cmatrix

按下 Ctrl + C 就可以退出

mac终端安装cmatrix

1
2
brew install cmatrix
cmatrix

如果你想让它看起来更炫,可以加一些参数,比如:

1
cmatrix -b -u 10

参数解释:
• -b:粗体字符
• -u 10:更新速度(数字越小越快)

按下 Ctrl + C 就可以退出

1
curl wttr.in