Update All From Blog until 20260611
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
# Anyting在Docker中的删除和重建
|
||||||
|
## 清空重来只需要这两步
|
||||||
|
删除容器(PowerShell):
|
||||||
|
```
|
||||||
|
powershell
|
||||||
|
docker rm -f anythingllm
|
||||||
|
```
|
||||||
|
删除数据目录(WSL):
|
||||||
|
```
|
||||||
|
bash
|
||||||
|
rm -rf /home/wing/anythingllm_storage
|
||||||
|
```
|
||||||
|
然后直接用 docker run 重建容器,它会自动使用已有的镜像(如果还在),没有的话会自动拉取,不需要手动删镜像。
|
||||||
|
|
||||||
|
所以跳过去,直接执行重建容器的命令就行。
|
||||||
|
|
||||||
|
## 完整重建命令
|
||||||
|
第一步:进入 WSL 创建数据目录
|
||||||
|
```
|
||||||
|
powershell
|
||||||
|
wsl -d Ubuntu -u wing
|
||||||
|
mkdir -p /home/wing/anythingllm_storage/storage
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
第二步:运行容器
|
||||||
|
```
|
||||||
|
powershell
|
||||||
|
docker run -d -p 3001:3001 `
|
||||||
|
--cap-add SYS_ADMIN `
|
||||||
|
--add-host=host.docker.internal:host-gateway `
|
||||||
|
--gpus all `
|
||||||
|
-v "\\wsl.localhost\Ubuntu\home\wing\anythingllm_storage\storage:/app/server/storage" `
|
||||||
|
-e STORAGE_DIR="/app/server/storage" `
|
||||||
|
--name anythingllm `
|
||||||
|
--restart always `
|
||||||
|
mintplexlabs/anythingllm
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证
|
||||||
|
```
|
||||||
|
powershell
|
||||||
|
docker ps
|
||||||
|
```
|
||||||
|
看到 anythingllm 状态是 Up 就成功了。
|
||||||
|
然后打开浏览器访问 http://localhost:3001,创建管理员账号,重新配置 Ollama 和 Embedder。
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
# Debian + Docker部署music-tag-web + 刮削全流程
|
||||||
|
## 一、环境准备(Debian)
|
||||||
|
### 1. 更新系统并安装依赖
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade -y
|
||||||
|
sudo apt install -y docker.io docker-compose
|
||||||
|
```
|
||||||
|
### 2. 启动 Docker 并设置开机自启
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
sudo systemctl enable docker
|
||||||
|
sudo systemctl start docker
|
||||||
|
```
|
||||||
|
## 二、Docker 部署 music-tag-web
|
||||||
|
### 1. 创建目录
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
#创建 V2 配置目录(如果不存在)
|
||||||
|
mkdir -p /mnt/nvme/music-tag-web-v2/config
|
||||||
|
#设置权限(按需)
|
||||||
|
chmod 755 /mnt/nvme/music-tag-web-v2/config
|
||||||
|
```
|
||||||
|
### 2. 拉取镜像和运行
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
docker run -d \
|
||||||
|
--name=music-tag-web \
|
||||||
|
-p 192.168.2.1:8001:8001 \ #这里的IP可以设置成你自己的服务器地址,建议设置内网IP
|
||||||
|
-v /mnt/nvme/music:/app/media:rw \
|
||||||
|
-v /mnt/nvme/music-tag-web/config:/app/data \
|
||||||
|
--restart unless-stopped \
|
||||||
|
xhongc/music_tag_web:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 访问
|
||||||
|
浏览器打开:
|
||||||
|
http://192.168.2.1:8001
|
||||||
|
默认账号密码:admin / admin(登录后务必修改)
|
||||||
|
|
||||||
|
## 三、下载的音频文件Tag清理
|
||||||
|
### 1. 安装 Mp3tag(免费)
|
||||||
|
下载地址:
|
||||||
|
```
|
||||||
|
https://www.mp3tag.de/en/download.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 处理音频文件的tag
|
||||||
|
(1) 关闭并删除 ID3v1(核心设置)
|
||||||
|
打开 Mp3tag → 菜单:工具 → 选项 → 标签 → Mpeg
|
||||||
|
按下面设置:
|
||||||
|
Read(读取)
|
||||||
|
✅ ID3v2
|
||||||
|
❌ ID3v1
|
||||||
|
❌ APE
|
||||||
|
Write(写入)
|
||||||
|
✅ ID3v2.4 UTF-8
|
||||||
|
❌ ID3v1
|
||||||
|
❌ APE
|
||||||
|
Remove(删除)
|
||||||
|
✅ ID3v1(必须勾!)
|
||||||
|
✅ ID3v2
|
||||||
|
❌ APE
|
||||||
|
确定。
|
||||||
|
|
||||||
|
(2) 批量清除所有旧标签
|
||||||
|
导入歌曲目录
|
||||||
|
Ctrl+A 全选
|
||||||
|
右键 → 移除标签 → 所有标签
|
||||||
|
→ 左边标签区全部清空
|
||||||
|
|
||||||
|
(3) 从文件名重建基础标签(避免无信息刮不到)
|
||||||
|
文件名格式建议:艺术家 - 标题.mp3
|
||||||
|
保持全选
|
||||||
|
菜单:转换 → 文件名 → 标签
|
||||||
|
格式:
|
||||||
|
```
|
||||||
|
%artist% - %title%
|
||||||
|
```
|
||||||
|
确定 → 自动回填艺术家、标题
|
||||||
|
(4) 最终保存
|
||||||
|
Ctrl+S
|
||||||
|
此时 “标签” 列只显示 ID3v2.4,无 v1。
|
||||||
|
|
||||||
|
### 3. 回传清洗后的文件到 Debian
|
||||||
|
把本地处理好的 MP3 上传回 Debian 的 ~/music-tag/media 目录,覆盖旧文件。
|
||||||
|
|
||||||
|
## 四、music-tag-web 刮削最佳实践
|
||||||
|
### 1. 首次设置
|
||||||
|
登录后进入 设置
|
||||||
|
媒体路径填写:/app/media
|
||||||
|
保存并扫描
|
||||||
|
(1) 刮削源选择(重点)
|
||||||
|
英文曲库:只留 MusicBrainz + Discogs(关闭酷狗 / QQ 音乐,避免乱码)
|
||||||
|
华语曲库:加 豆瓣
|
||||||
|
注:这里实际全选也没关系
|
||||||
|
(2) 批量刮削步骤
|
||||||
|
勾选要处理的文件夹 / 歌曲(建议每次 200 首以内,防限流)
|
||||||
|
左侧点 自动刮削
|
||||||
|
模式选:标准模式(平衡准确率与速度)
|
||||||
|
勾选:覆盖空标签、下载封面、下载歌词
|
||||||
|
保存 → 开始刮削
|
||||||
|
(3)刮削后检查
|
||||||
|
查看操作记录,失败项单独处理
|
||||||
|
成功歌曲:标签、专辑、封面、歌词齐全
|
||||||
|
## 五、常见问题与避坑
|
||||||
|
为什么关了 ID3v1 还显示 v1?
|
||||||
|
只关 “写入” 没用,必须勾选 Remove ID3v1 + 重新保存
|
||||||
|
旧文件残留 v1 区块,要 “移除所有标签” 再重建
|
||||||
|
刮削乱码 / 匹配错?
|
||||||
|
根源:双标签(v1+v2)、酷狗脏字符、编码混乱
|
||||||
|
解决:必须用 Mp3tag 清洗干净再刮
|
||||||
|
中文文件名乱码?
|
||||||
|
Debian 确保 UTF-8:
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
sudo apt install locales
|
||||||
|
sudo locale-gen zh_CN.UTF-8
|
||||||
|
```
|
||||||
|
## 结语
|
||||||
|
以上方法就是我使用Music-Tag-Web过程中的心得,不清理Tag的时候有些会出现刮削不出来的情况,清理后又快又干净.希望这篇文章对你有用!
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
# Debian12 下 Xray + v2rayA 手动安装全记录
|
||||||
|
## 一、准备工作(补齐基础工具)
|
||||||
|
apt update
|
||||||
|
apt install curl wget unzip net-tools vim nano -y
|
||||||
|
|
||||||
|
这里可以先自行下载好软件,因为有可能在线下载不成功。下载地址:
|
||||||
|
v2RayA下载地址:https://github.com/v2rayA/v2rayA/releases
|
||||||
|
xRay-Core下载地址:https://github.com/XTLS/Xray-core/releases
|
||||||
|
下载完成后把这两个文件放在/tmp目录下。
|
||||||
|
|
||||||
|
## 二、安装 Xray 核心
|
||||||
|
cd /tmp
|
||||||
|
wget https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip
|
||||||
|
已下载则跳过上面wget。
|
||||||
|
unzip Xray-linux-64.zip -d xray-core
|
||||||
|
mkdir -p /usr/local/share/xray
|
||||||
|
cp xray-core/*.dat /usr/local/share/xray/
|
||||||
|
install -Dm755 xray-core/xray /usr/local/bin/xray
|
||||||
|
xray -version
|
||||||
|
|
||||||
|
## 三、安装 v2rayA(二进制版)
|
||||||
|
cd /tmp
|
||||||
|
wget https://github.com/v2rayA/v2rayA/releases/download/v2.3.3/v2raya_linux_x64_2.3.3
|
||||||
|
已下载则跳过上面wget。
|
||||||
|
install -Dm755 v2raya_linux_x64_2.3.3 /usr/local/bin/v2raya
|
||||||
|
v2raya –version
|
||||||
|
|
||||||
|
## 四、创建系统服务(开机自启 + 透明代理)
|
||||||
|
tee /etc/systemd/system/v2raya.service > /dev/null << 'EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=v2rayA Service
|
||||||
|
After=network.target nss-lookup.target
|
||||||
|
Wants=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
LimitNPROC=500
|
||||||
|
LimitNOFILE=1000000
|
||||||
|
ExecStart=/usr/local/bin/v2raya
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable v2raya --now
|
||||||
|
systemctl status v2raya
|
||||||
|
关键点:如果是服务器版本的Debian,ExecStart 后面不要加 --lite,否则无法开启透明代理。如果是带 GNOME/KDE 的桌面版 Debian则需要加--lite。
|
||||||
|
|
||||||
|
## 五、放行防火墙(可选)
|
||||||
|
如果用 nftables/iptables
|
||||||
|
iptables -A INPUT -p tcp --dport 2017 -j ACCEPT
|
||||||
|
如果用 ufw
|
||||||
|
ufw allow 2017
|
||||||
|
|
||||||
|
## 六、Web 配置
|
||||||
|
(1)浏览器访问 http://你的DebianIP:2017
|
||||||
|
|
||||||
|
(2)创建管理员账号,直接输入就可以了。
|
||||||
|
|
||||||
|
(3)导入你的 vless://xxxxx 节点
|
||||||
|
|
||||||
|
(4)选择节点(在节点列表) → 点击 “启动”(界面的左上角)
|
||||||
|
|
||||||
|
(5)进入 “设置” → “透明代理/系统代理” → 选 “大陆白名单模式” → 保存
|
||||||
|
|
||||||
|
## 七、验证
|
||||||
|
curl ip.sb # 应返回节点 IP
|
||||||
|
curl -I https://www.google.com # 应返回 200
|
||||||
|
apt update # 应正常更新
|
||||||
|
|
||||||
|
## ⚠️ 注意事项(避坑指南)
|
||||||
|
坑点 说明
|
||||||
|
--lite 参数 千万不能加,否则透明代理不可用
|
||||||
|
端口 2017 Web 管理端口,防火墙需放行
|
||||||
|
Xray 版本 建议用最新版,老版本可能不支持 VLESS
|
||||||
|
服务状态 用 systemctl status v2raya 查看,确保 active
|
||||||
|
Debian 版本 本流程适用于 Debian 11/12(含最小化安装)
|
||||||
|
|
||||||
|
## 🔁 如果以后要升级
|
||||||
|
### 升级 Xray
|
||||||
|
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
|
||||||
|
|
||||||
|
### 升级 v2rayA(手动下载新二进制替换)
|
||||||
|
systemctl stop v2raya
|
||||||
|
install -Dm755 ./新下载的v2raya文件 /usr/local/bin/v2raya
|
||||||
|
systemctl start v2raya
|
||||||
|
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
# Debian 命令行 WireGuard VPN 服务器搭建教程(静态IP+域名+自启)
|
||||||
|
## 一、环境说明
|
||||||
|
• 系统:Debian(纯命令行模式,无桌面环境,节约资源)
|
||||||
|
• 网卡名称:ens192
|
||||||
|
• 静态IP:192.168.2.203/24(子网掩码:255.255.255.0)
|
||||||
|
• 网关:192.168.2.1
|
||||||
|
• WireGuard EndPoint:hayashiei.top:58888(域名需解析到服务器公网IP,仅局域网使用可忽略)
|
||||||
|
• 管理工具:wireguard-ui(可视化配置,简化操作)
|
||||||
|
• 自启方式:systemd 服务(解决重启丢规则、服务失效问题)
|
||||||
|
|
||||||
|
## 二、前置准备
|
||||||
|
1. 以 root 用户登录 Debian 纯命令行(远程登录可使用 Xshell、Putty 等工具);
|
||||||
|
2. 确保服务器临时能联网(用于下载依赖和软件,后续配置静态IP后永久联网);
|
||||||
|
3. 提前确认域名 hayashiei.top 已解析(若使用公网访问,无公网则跳过)。
|
||||||
|
|
||||||
|
## 三、分步搭建步骤
|
||||||
|
### 步骤 1:更新系统并安装基础依赖
|
||||||
|
执行以下命令,更新系统软件包,并安装后续操作所需的基础工具:
|
||||||
|
#更新系统包
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
|
||||||
|
#安装WireGuard、curl、sudo、iptables等依赖
|
||||||
|
apt install -y wireguard wireguard-tools curl iptables sudo unzip
|
||||||
|
|
||||||
|
### 步骤 2:配置静态 IP(适配 ens192 网卡)
|
||||||
|
先备份原有网络配置,再写入静态IP配置(避免配置错误无法恢复):
|
||||||
|
1. 备份网络配置文件:
|
||||||
|
cp /etc/network/interfaces /etc/network/interfaces.bak
|
||||||
|
|
||||||
|
2. 写入静态IP配置(直接覆盖原有内容,适配192.168.2.203):
|
||||||
|
cat > /etc/network/interfaces << EOF
|
||||||
|
auto lo
|
||||||
|
iface lo inet loopback
|
||||||
|
#配置 ens192 静态 IP
|
||||||
|
auto ens192
|
||||||
|
iface ens192 inet static
|
||||||
|
address 192.168.2.203/24 # 静态 IP(/24 等价于子网掩码 255.255.255.0)
|
||||||
|
gateway 192.168.2.1 # 网关(路由器IP)
|
||||||
|
dns-nameservers 223.5.5.5 223.6.6.6 # 阿里云 DNS,确保解析正常
|
||||||
|
EOF
|
||||||
|
|
||||||
|
3. 重启网络服务,使静态IP生效:
|
||||||
|
systemctl restart networking
|
||||||
|
4. 验证静态IP是否生效:
|
||||||
|
ip a show ens192
|
||||||
|
验证标准:命令输出中能看到 “inet 192.168.2.203/24”,表示静态IP配置成功。
|
||||||
|
|
||||||
|
### 步骤 3:开启IP转发
|
||||||
|
#临时开启(当前会话有效)
|
||||||
|
echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||||
|
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
|
||||||
|
#永久开启(重启后生效)
|
||||||
|
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
|
||||||
|
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
|
||||||
|
#生效配置
|
||||||
|
sysctl -p
|
||||||
|
|
||||||
|
### 步骤 4:配置系统防火墙
|
||||||
|
#放行58888 UDP端口(WireGuard)
|
||||||
|
iptables -A INPUT -p udp --dport 58888 -j ACCEPT
|
||||||
|
iptables -A FORWARD -i wg0 -j ACCEPT
|
||||||
|
iptables -A FORWARD -o wg0 -j ACCEPT
|
||||||
|
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
|
||||||
|
#保存iptables规则(防止重启失效)
|
||||||
|
apt install -y iptables-persistent
|
||||||
|
netfilter-persistent save
|
||||||
|
|
||||||
|
### 步骤 5:安装 wireguard-ui(可视化管理工具)
|
||||||
|
wireguard-ui 可简化服务器和客户端配置,无需手动编写复杂的 conf 文件:
|
||||||
|
1. 安装WireGuard-UI工具
|
||||||
|
#创建存放目录
|
||||||
|
mkdir -p /opt/wireguard-ui
|
||||||
|
cd /opt/wireguard-ui
|
||||||
|
#下载最新版wireguard-ui(适配amd64架构)
|
||||||
|
curl -L https://github.com/ngoduykhanh/wireguard-ui/releases/latest/download/wireguard-ui-linux-amd64.tar.gz -o wireguard-ui.tar.gz
|
||||||
|
tar xzf wireguard-ui.tar.gz
|
||||||
|
chmod +x wireguard-ui
|
||||||
|
|
||||||
|
2. 创建 wireguard-ui 系统服务(实现开机自启):
|
||||||
|
#创建systemd服务(开机自启)
|
||||||
|
cat > /etc/systemd/system/wireguard-ui.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=WireGuard UI
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/wireguard-ui
|
||||||
|
ExecStart=/opt/wireguard-ui/wireguard-ui --bind-address 0.0.0.0:5000
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
3. 设置WireGuard-UI开机自启动
|
||||||
|
#启动并设置开机自启
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl start wireguard-ui
|
||||||
|
systemctl enable wireguard-ui
|
||||||
|
|
||||||
|
验证 wireguard-ui 是否正常运行:
|
||||||
|
systemctl status wireguard-ui.service
|
||||||
|
验证标准:输出中显示 “active (running)”,表示 UI 服务启动成功。
|
||||||
|
|
||||||
|
### 步骤 6:通过 wireguard-ui 配置 WireGuard 服务器
|
||||||
|
UI 启动后,通过浏览器访问,可视化配置服务器参数:
|
||||||
|
1. 浏览器访问 UI 页面(仅局域网访问,公网访问需端口转发):
|
||||||
|
http://192.168.2.203:5000
|
||||||
|
|
||||||
|
2. 首次登录(默认账号密码,建议登录后立即修改):
|
||||||
|
账号:admin 密码:admin
|
||||||
|
如果出现登陆跳转登陆界面则:
|
||||||
|
#假设数据目录在 /opt/wireguard-ui 或 /var/lib/wireguard-ui
|
||||||
|
#先找到你的数据目录(看启动日志或配置)
|
||||||
|
#示例:
|
||||||
|
chown -R root:root /opt/wireguard-ui
|
||||||
|
chmod -R 700 /opt/wireguard-ui
|
||||||
|
然后重启服务。
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl restart wireguard-ui
|
||||||
|
|
||||||
|
3. 配置服务器核心参数(进入「Server」页面):
|
||||||
|
• Interface Name:wg0(默认即可,无需修改)
|
||||||
|
• Listen Port:51820(默认端口,若被占用可修改,需同步修改后续配置)
|
||||||
|
• Private Key/Public Key:系统自动生成,无需手动修改
|
||||||
|
• Address:填写 VPN 内网段(如 10.0.0.1/24,自定义即可,避免与局域网网段冲突)
|
||||||
|
• DNS Servers:223.5.5.5, 223.6.6.6(与静态IP配置的DNS一致,确保客户端解析正常)
|
||||||
|
• EndPoint:hayashiei.top:58888(填写自己的域名+端口,无公网可留空)
|
||||||
|
PostUP和PostDown如果是外网VPN则什么都不用填。如果是异地组网则按照如下填写:
|
||||||
|
• PostUP:iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE; iptables -A FORWARD -i %i -o %i -j ACCEPT
|
||||||
|
• PostDown:iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE; iptables -D FORWARD -i %i -o %i -j ACCEPT
|
||||||
|
|
||||||
|
4. 点击「Save Config」保存配置,系统会自动生成 /etc/wireguard/wg0.conf 文件(核心配置文件)。
|
||||||
|
下面是验证是否正常。
|
||||||
|
#查看WireGuard接口状态
|
||||||
|
wg show
|
||||||
|
#查看wireguard-ui服务状态
|
||||||
|
systemctl status wireguard-ui
|
||||||
|
#查看端口监听(确认58888 UDP端口已监听)
|
||||||
|
ss -ulnp | grep 58888
|
||||||
|
|
||||||
|
5. 配置 WireGuard 开机自启
|
||||||
|
通过 systemd 服务,让 wg0 接口开机自动加载:
|
||||||
|
1. 启用自启:
|
||||||
|
systemctl enable wg-quick@wg0.service
|
||||||
|
2. 启动 wg0 接口:
|
||||||
|
wg-quick up wg0
|
||||||
|
3. 验证 WireGuard 状态:
|
||||||
|
wg show wg0
|
||||||
|
验证标准:能看到 wg0 接口的 IP、监听端口,即表示启动成功。
|
||||||
|
|
||||||
|
### 步骤 7:添加客户端(通过 wireguard-ui)
|
||||||
|
客户端需导入配置文件才能连接 VPN,通过 UI 快速生成:
|
||||||
|
1. 回到 wireguard-ui 页面,点击左侧「Clients」→「Add Client」;
|
||||||
|
2. 填写客户端名称(如 “iPhone”、“Windows”,自定义,便于区分);
|
||||||
|
3. 其他参数默认(系统自动生成密钥和 IP),点击「Save」;
|
||||||
|
4. 生成后,点击客户端右侧「Download」,下载 .conf 配置文件;
|
||||||
|
5. 将配置文件导入客户端 WireGuard 软件(手机/电脑均可,下载对应系统的 WireGuard 客户端)。
|
||||||
|
|
||||||
|
### 步骤 8:功能验证(确保所有配置正常)
|
||||||
|
客户端导入配置并连接 VPN 后,进行以下测试:
|
||||||
|
1. 访问外网:打开浏览器访问百度、谷歌等,能正常加载即表示外网连通;
|
||||||
|
2. 访问局域网:访问 192.168.2.x 网段的设备(如路由器、其他电脑),能正常访问即表示局域网连通;
|
||||||
|
3. 重启验证:执行 reboot 重启服务器,重启后无需手动操作,再次测试客户端连接和访问功能,均正常即表示所有配置永久生效。
|
||||||
|
|
||||||
|
## 四、常用运维命令(收藏备用)
|
||||||
|
#查看 wireguard-ui 服务状态(是否运行)
|
||||||
|
systemctl status wireguard-ui.service
|
||||||
|
#重启 wireguard-ui(UI 无法访问时使用)
|
||||||
|
systemctl restart wireguard-ui.service
|
||||||
|
#查看 WireGuard 接口状态(客户端连接情况、流量等)
|
||||||
|
wg show wg0
|
||||||
|
#重启 WireGuard 接口(客户端无法连接时使用)
|
||||||
|
wg-quick down wg0 && wg-quick up wg0
|
||||||
|
#查看 NAT 转发服务状态
|
||||||
|
systemctl status wg-nat.service
|
||||||
|
#验证静态 IP 是否正常
|
||||||
|
ip a show ens192
|
||||||
|
#验证 IP 转发是否开启
|
||||||
|
cat /proc/sys/net/ipv4/ip_forward
|
||||||
|
#重启服务器
|
||||||
|
Reboot
|
||||||
|
#添加了客户端但是没有生效
|
||||||
|
#先停止旧接口,再启动新配置 wg-quick down wg0 && wg-quick up wg0 # 验证修改是否生效 wg show wg0
|
||||||
|
|
||||||
|
## 五、注意事项
|
||||||
|
1. 域名使用说明:若需通过公网域名 hayashiei.top 连接 VPN,需确保:
|
||||||
|
域名已正确解析到服务器公网 IP;
|
||||||
|
路由器需转发 58888端口(UDP 协议)到服务器 192.168.2.203;
|
||||||
|
2. 端口冲突:若 58888 端口被占用,需修改 wireguard-ui 中的「Listen Port」,并同步修改路由器端口转发和客户端配置;
|
||||||
|
3. 命令行模式:无需安装桌面环境,保持纯命令行即可,节约服务器资源;
|
||||||
|
4. 密码修改:首次登录 wireguard-ui 后,建议立即修改 admin 密码(进入「Settings」页面修改),提升安全性;
|
||||||
|
5. 配置备份:建议备份 /etc/wireguard/ 目录下的所有 .conf 文件,以及 /etc/network/interfaces 文件,便于后续恢复。
|
||||||
|
|
||||||
|
## 六、总结
|
||||||
|
本教程完全适配本人服务器环境,核心解决了 Debian 命令行模式下:静态 IP 配置、WireGuard 重启失效、NAT 转发规则丢失、wireguard-ui 无法访问等问题;
|
||||||
|
所有服务均配置为开机自启,重启服务器后无需任何手动操作,客户端可直接连接,正常访问外网和局域网;
|
||||||
|
后续重装或迁移服务器时,可直接参考本教程,一步到位完成搭建,无需重复试错。
|
||||||
|
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
# Debian+KVM命令行安装Win10虚拟机总结
|
||||||
|
|
||||||
|
# 1. 前置操作
|
||||||
|
先关闭虚拟机
|
||||||
|
```bash
|
||||||
|
运行
|
||||||
|
virsh destroy Win10
|
||||||
|
virsh edit Win10
|
||||||
|
```
|
||||||
|
注:编辑出现校验报错时,输入 i 忽略并保存。
|
||||||
|
|
||||||
|
# 2. 网卡修改(桥接模式,保留原有 MAC / 桥接 / 地址)
|
||||||
|
原内容:
|
||||||
|
```
|
||||||
|
<interface type='bridge'>
|
||||||
|
<mac address='52:54:00:c7:dc:6e'/>
|
||||||
|
<source bridge='bridge0'/>
|
||||||
|
<model type='e1000e'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||||
|
</interface>
|
||||||
|
```
|
||||||
|
修改:仅将 e1000e 改为 virtio,其余不动
|
||||||
|
```
|
||||||
|
<interface type='bridge'>
|
||||||
|
<mac address='52:54:00:c7:dc:6e'/>
|
||||||
|
<source bridge='bridge0'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||||
|
</interface>
|
||||||
|
```
|
||||||
|
|
||||||
|
# 3. 显卡修改(保留原有 VNC,删除显存参数避错)
|
||||||
|
## 3.1 图形部分(保留你在用的 VNC,无需改动)
|
||||||
|
```
|
||||||
|
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1'>
|
||||||
|
<listen type='address' address='127.0.0.1'/>
|
||||||
|
</graphics>
|
||||||
|
```
|
||||||
|
显卡节点(核心修改)
|
||||||
|
原 qxl 显卡整段替换为下方内容:
|
||||||
|
```
|
||||||
|
<video>
|
||||||
|
<model type='virtio' heads='1' primary='yes'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
||||||
|
</video>
|
||||||
|
```
|
||||||
|
要点:去掉 ram/vram/vgamem 所有显存参数,老版本 libvirt+virtio 显卡不支持。
|
||||||
|
|
||||||
|
# 4. 开机后系统内安装驱动
|
||||||
|
启动虚拟机
|
||||||
|
```bash
|
||||||
|
运行
|
||||||
|
virsh start Win10
|
||||||
|
```
|
||||||
|
使用 virtio-win-0.1.285 镜像手动安装驱动:
|
||||||
|
网卡驱动
|
||||||
|
设备管理器 → 带感叹号以太网控制器 → 手动安装
|
||||||
|
路径:镜像根目录\NetKVM\w10\amd64
|
||||||
|
显卡驱动
|
||||||
|
设备管理器 → 带感叹号视频控制器 → 手动安装
|
||||||
|
路径:镜像根目录\viogpu\w10\amd64
|
||||||
|
全部安装完成后,重启虚拟机即可。
|
||||||
|
|
||||||
|
# 5. 如何直接添加第二块硬盘
|
||||||
|
首先说一下,因为虚拟机系统分区在宿主机的系统盘,空间不够。所以在宿主机的数据盘单独创建了一个块硬盘当虚拟机的数据盘。直接添加会出现文件类型不一样,导致安装系统后出问题。所以最好是一开始就添加。
|
||||||
|
但是在网页界面添加会导致文件类型不一样,所以使用了以下方案:
|
||||||
|
```bash
|
||||||
|
virt-xml Win10 --add-device --disk path=/mnt/data/vm-data/Win10-Data.qcow2,format=qcow2,bus=virtio,target=vdb
|
||||||
|
📌 命令解释
|
||||||
|
参数 含义
|
||||||
|
--add-device 添加设备,不破坏已有配置
|
||||||
|
--disk path=... 指定磁盘文件路径(File 类型,不是 Pool)
|
||||||
|
format=qcow2 磁盘格式
|
||||||
|
bus=virtio 总线类型(和你系统盘一致)
|
||||||
|
target=vdb 第二块盘
|
||||||
|
```
|
||||||
|
✅ 使用步骤
|
||||||
|
先创建磁盘文件:
|
||||||
|
```bash
|
||||||
|
qemu-img create -f qcow2 /mnt/data/vm-data/Win10-Data.qcow2 512G
|
||||||
|
```
|
||||||
|
执行 virt-xml 命令添加
|
||||||
|
启动虚拟机,进磁盘管理初始化即可
|
||||||
|
不需要手动编辑 XML,不需要处理地址冲突,不需要管存储池。
|
||||||
|
这就是加数据盘的标准操作。
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# Debian+KVM命令行安装WinXP虚拟机总结
|
||||||
|
|
||||||
|
# 1. 准备ISO 文件
|
||||||
|
(1)Windows XP 安装盘 ISO(例如 Windows XP Professional sp3_Deepin.iso)
|
||||||
|
(2)virtio-win 旧版 ISO(例如 virtio-win-0.1.141.iso),内含 XP 可用的 viostor 驱动
|
||||||
|
(3)virtio-win 新版 ISO(例如 virtio-win-0.1.285.iso),里面需要用到以太网驱动
|
||||||
|
|
||||||
|
# 2. 安装WinXP虚拟机
|
||||||
|
这里和正常安装没有区别,唯一的就是需要挂载软盘,这个软盘就在virtio-win-0.1.141.iso中。
|
||||||
|
挂载软盘
|
||||||
|
```bash
|
||||||
|
virsh attach-disk WinXP-231 /vm/virtio-win-0.1.141_x86.vfd fda --type floppy --config
|
||||||
|
```
|
||||||
|
注意,硬盘模式选择virtio模式
|
||||||
|
然后开机,在Windowx XP安装界面按F6加载viostor驱动,后续就正常安装。
|
||||||
|
|
||||||
|
# 3. 驱动安装
|
||||||
|
装好系统后,查看设备管理器会有以下几个驱动没有安装(我自己的电脑是这样):
|
||||||
|
```
|
||||||
|
High Definition Audio总线上的音频设备
|
||||||
|
PCI Device
|
||||||
|
PCI 简易通讯控制器
|
||||||
|
以太网控制器
|
||||||
|
VGA视频控制器
|
||||||
|
```
|
||||||
|
|
||||||
|
# 3.1 PCI Device驱动安装
|
||||||
|
这个驱动使用virtio-win-0.1.141.iso中的Balloon文件夹下的驱动,简单
|
||||||
|
|
||||||
|
# 3.2 PCI简易通讯控制器
|
||||||
|
这个驱动使用virtio-win-0.1.141.iso中的vioseria文件夹下的驱动,简单
|
||||||
|
|
||||||
|
# 3.3 VGA视频控制器
|
||||||
|
这个驱动使用virtio-win-0.1.141.iso中的qxl文件夹下的驱动,简单
|
||||||
|
|
||||||
|
# 3.4 以太网控制器
|
||||||
|
这稍微麻烦点,需要以下操作:
|
||||||
|
编辑配置文件
|
||||||
|
```bash
|
||||||
|
virsh edit WinXP-231
|
||||||
|
```
|
||||||
|
修改前如下:
|
||||||
|
```bash
|
||||||
|
<controller type='fdc' index='0'/>
|
||||||
|
<interface type='bridge'>
|
||||||
|
<mac address='52:54:00:3e:68:bc'/>
|
||||||
|
<source bridge='bridge0'/>
|
||||||
|
<model type='e1000e'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||||
|
</interface>
|
||||||
|
```
|
||||||
|
修改后如下:
|
||||||
|
将e1000e或者e1000改成virtio
|
||||||
|
```bash
|
||||||
|
<controller type='fdc' index='0'/>
|
||||||
|
<interface type='bridge'>
|
||||||
|
<mac address='52:54:00:3e:68:bc'/>
|
||||||
|
<source bridge='bridge0'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||||
|
</interface>
|
||||||
|
```
|
||||||
|
然后重启Windows XP,使用virtio-win-0.1.285.iso中的NetKVM安装。
|
||||||
|
|
||||||
|
# 3.5 High Definition Audio总线上的音频设备
|
||||||
|
最后是Hig Definition Audio总线上的音频设备
|
||||||
|
直接结论:原来的 ich6(HD Audio),XP 下基本无解,必须改成 ac97。
|
||||||
|
修改配置文件
|
||||||
|
```bash
|
||||||
|
virsh edit WinXP-231
|
||||||
|
```
|
||||||
|
原来配置文件如下:
|
||||||
|
```bash
|
||||||
|
<sound model='ich6'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||||
|
</sound>
|
||||||
|
<audio id='1' type='spice'/>
|
||||||
|
```
|
||||||
|
其中,model='ich6'是显卡型号,就是Intel HD Audio,这个在XP下是没办法搞的。
|
||||||
|
改成下面这样(XP 能自动驱起来)
|
||||||
|
```bash
|
||||||
|
<sound model='ac97'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||||
|
</sound>
|
||||||
|
<audio id='1' type='spice'/>
|
||||||
|
```
|
||||||
|
只改一个单词:ich6 → ac97
|
||||||
|
保存重启。
|
||||||
|
进 XP 会自动发现新硬件并装好 AC97 驱动,托盘有小喇叭,不用找任何驱动文件。
|
||||||
|
|
||||||
|
# 4. virsh常用命令
|
||||||
|
### 关机
|
||||||
|
```bash
|
||||||
|
运行
|
||||||
|
virsh shutdown xp
|
||||||
|
```
|
||||||
|
### 编辑 XML
|
||||||
|
```bash
|
||||||
|
运行
|
||||||
|
virsh edit xp
|
||||||
|
```
|
||||||
|
|
||||||
|
### 开机
|
||||||
|
```bash
|
||||||
|
运行
|
||||||
|
virsh start xp
|
||||||
|
```
|
||||||
@@ -0,0 +1,590 @@
|
|||||||
|
# 🐧 Debian/Linux 常用命令速查手册
|
||||||
|
|
||||||
|
# 📁1. 文件和目录操作
|
||||||
|
|
||||||
|
## 1.1 基础操作
|
||||||
|
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| ls | 列出目录内容 | `ls -la`(显示所有,含隐藏文件) |
|
||||||
|
| cd | 切换目录 | `cd /home/user` |
|
||||||
|
| pwd | 显示当前路径 | `pwd` |
|
||||||
|
| mkdir | 创建目录 | `mkdir -p dir1/dir2`(递归创建) |
|
||||||
|
| rmdir | 删除空目录 | `rmdir empty_dir` |
|
||||||
|
| rm | 删除文件或目录 | `rm -rf dir/`(递归强制删除) |
|
||||||
|
| cp | 复制 | `cp -r source/ dest/`(递归复制) |
|
||||||
|
| mv | 移动/重命名 | `mv old.txt new.txt` |
|
||||||
|
| touch | 创建空文件或更新时间戳 | `touch file.txt` |
|
||||||
|
| file | 查看文件类型 | `file unknown.bin` |
|
||||||
|
|
||||||
|
## 1.2 ls 常用参数
|
||||||
|
```bash
|
||||||
|
ls -l # 详细列表(权限、大小、时间)
|
||||||
|
ls -a # 显示所有文件(包括 . 开头的隐藏文件)
|
||||||
|
ls -h # 人类可读的大小(1K, 234M, 2G)
|
||||||
|
ls -t # 按修改时间排序
|
||||||
|
ls -r # 反向排序
|
||||||
|
ls -R # 递归显示子目录
|
||||||
|
```
|
||||||
|
ls -lah # 最常用:详细+人类可读+隐藏文件
|
||||||
|
## 1.3 rm 参数详解
|
||||||
|
| 参数 | 含义 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| -f | force | 强制删除,不提示,忽略不存在的文件 |
|
||||||
|
| -r 或 -R | recursive | 递归删除(删文件夹必须用) |
|
||||||
|
| -i | interactive | 删除前逐个确认 |
|
||||||
|
| -v | verbose | 显示删除过程 |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm file.txt # 删除文件(会提示确认)
|
||||||
|
rm -f file.txt # 强制删除,不提示
|
||||||
|
rm -rf folder/ # 递归强制删除整个文件夹
|
||||||
|
rm -i *.log # 删除每个 .log 文件前确认
|
||||||
|
```
|
||||||
|
## 1.4 cp 和 mv 常用参数
|
||||||
|
```bash
|
||||||
|
cp source dest # 复制文件
|
||||||
|
cp -r src_dir/ dest_dir/ # 递归复制目录
|
||||||
|
cp -i file.txt backup/ # 覆盖前提示
|
||||||
|
cp -u file.txt backup/ # 只复制更新的文件(update)
|
||||||
|
cp -p file.txt backup/ # 保留原文件属性(权限、时间)
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
mv old.txt new.txt # 重命名
|
||||||
|
mv file.txt folder/ # 移动文件
|
||||||
|
mv -i file.txt folder/ # 覆盖前提示
|
||||||
|
mv -u file.txt folder/ # 只移动更新的文件
|
||||||
|
```
|
||||||
|
# 🔐2. 权限管理
|
||||||
|
## 2.1 Linux 权限基础
|
||||||
|
每个文件/目录有三组权限:所有者(u)、所属组(g)、其他人(o)
|
||||||
|
```
|
||||||
|
-rwxr-xr--
|
||||||
|
^ ^^^ ^^^ ^^^
|
||||||
|
| | | └─ 其他人权限
|
||||||
|
| | └───── 组权限
|
||||||
|
| └───────── 所有者权限
|
||||||
|
└──────────── 类型(-文件,d目录,l链接)
|
||||||
|
|
||||||
|
r = 读 (4)
|
||||||
|
w = 写 (2)
|
||||||
|
x = 执行 (1)
|
||||||
|
```
|
||||||
|
## 2.2 常用命令
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| chmod | 修改权限 | `chmod 755 script.sh` |
|
||||||
|
| chown | 修改所有者 | `chown user:group file.txt` |
|
||||||
|
| chgrp | 修改所属组 | `chgrp staff file.txt` |
|
||||||
|
| umask | 设置默认权限掩码 | `umask 022` |
|
||||||
|
|
||||||
|
### 2.2.1 chmod 两种写法
|
||||||
|
#### 2.2.1.1 数字法(推荐):
|
||||||
|
```bash
|
||||||
|
chmod 755 file.sh # rwxr-xr-x
|
||||||
|
chmod 644 file.txt # rw-r--r--
|
||||||
|
chmod 600 secret.txt # rw-------
|
||||||
|
chmod 777 temp/ # rwxrwxrwx(危险!)
|
||||||
|
```
|
||||||
|
#### 2.2.1.2 符号法:
|
||||||
|
```bash
|
||||||
|
chmod u+x file.sh # 所有者加执行权限
|
||||||
|
chmod g-w file.txt # 组去掉写权限
|
||||||
|
chmod o=r file.txt # 其他人设为只读
|
||||||
|
chmod a+x script.sh # 所有人加执行权限(a=all)
|
||||||
|
```
|
||||||
|
#### 2.2.1.3 权限数字对照表
|
||||||
|
| 数字 | 权限 | 含义 |
|
||||||
|
|------|------|------|
|
||||||
|
| 7 | rwx | 读+写+执行 |
|
||||||
|
| 6 | rw- | 读+写 |
|
||||||
|
| 5 | r-x | 读+执行 |
|
||||||
|
| 4 | r-- | 只读 |
|
||||||
|
| 3 | -wx | 写+执行 |
|
||||||
|
| 2 | -w- | 只写 |
|
||||||
|
| 1 | --x | 只执行 |
|
||||||
|
| 0 | --- | 无权限 |
|
||||||
|
#### 2.2.1.4 常用权限组合
|
||||||
|
```bash
|
||||||
|
755 # rwxr-xr-x - 目录/脚本(所有者全权,其他人只读执行)
|
||||||
|
644 # rw-r--r-- - 普通文件(所有者读写,其他人只读)
|
||||||
|
600 # rw------- - 私密文件(只有所有者可读写)
|
||||||
|
700 # rwx------ - 私密目录(只有所有者可访问)
|
||||||
|
777 # rwxrwxrwx - 完全开放(危险,慎用!)
|
||||||
|
```
|
||||||
|
#### 2.2.1.5 特殊权限(高级)
|
||||||
|
```bash
|
||||||
|
权限 数字 作用
|
||||||
|
SUID 4xxx 以文件所有者身份执行(如 passwd)
|
||||||
|
SGID 2xxx 以文件所属组身份执行
|
||||||
|
Sticky 1xxx 只有所有者能删除(如 /tmp)
|
||||||
|
```
|
||||||
|
```bash
|
||||||
|
chmod 4755 file # 添加 SUID
|
||||||
|
chmod 1777 /tmp # 添加 Sticky 位
|
||||||
|
```
|
||||||
|
# 👤3. 用户和组管理
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| whoami | 显示当前用户 | `whoami` |
|
||||||
|
| id | 显示用户ID和组信息 | `id username` |
|
||||||
|
| users | 显示登录用户 | `users` |
|
||||||
|
| who | 显示谁在登录 | `who -a` |
|
||||||
|
| su | 切换用户 | `su - root` |
|
||||||
|
| sudo | 以root身份执行 | `sudo command` |
|
||||||
|
| useradd | 添加用户 | `useradd -m newuser` |
|
||||||
|
| usermod | 修改用户 | `usermod -aG sudo user` |
|
||||||
|
| userdel | 删除用户 | `userdel -r user` |
|
||||||
|
| passwd | 修改密码 | `passwd username` |
|
||||||
|
| groupadd | 添加组 | `groupadd groupname` |
|
||||||
|
| groups | 显示用户所属组 | `groups username` |
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#添加新用户并创建家目录
|
||||||
|
sudo useradd -m -s /bin/bash newuser
|
||||||
|
|
||||||
|
#将用户加入 sudo 组(Debian/Ubuntu)
|
||||||
|
sudo usermod -aG sudo newuser
|
||||||
|
|
||||||
|
#删除用户及家目录
|
||||||
|
sudo userdel -r olduser
|
||||||
|
|
||||||
|
#切换到 root(需要root密码)
|
||||||
|
su -
|
||||||
|
|
||||||
|
#以 root 执行单条命令
|
||||||
|
sudo apt update
|
||||||
|
```
|
||||||
|
# 🔍4. 文件查找和搜索
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| find | 按条件查找文件 | `find / -name "*.txt"` |
|
||||||
|
| locate | 快速查找(需数据库) | `locate filename` |
|
||||||
|
| which | 查找命令路径 | `which python` |
|
||||||
|
| whereis | 查找命令/源码/手册 | `whereis ls` |
|
||||||
|
| grep | 搜索文件内容 | `grep "text" file.txt` |
|
||||||
|
| awk | 文本处理 | `awk '{print $1}' file` |
|
||||||
|
| sed | 流编辑器 | `sed 's/old/new/g' file` |
|
||||||
|
## 4.1 find常用用法
|
||||||
|
```bash
|
||||||
|
#按名称查找
|
||||||
|
find /home -name "*.jpg" # 区分大小写
|
||||||
|
find /home -iname "*.jpg" # 不区分大小写
|
||||||
|
|
||||||
|
#按类型查找
|
||||||
|
find . -type f # 只找文件
|
||||||
|
find . -type d # 只找目录
|
||||||
|
find . -type l # 只找链接
|
||||||
|
|
||||||
|
#按大小查找
|
||||||
|
find / -size +100M # 大于100MB
|
||||||
|
find / -size -1k # 小于1KB
|
||||||
|
|
||||||
|
#按时间查找
|
||||||
|
find . -mtime -7 # 7天内修改过
|
||||||
|
find . -mtime +30 # 30天前修改
|
||||||
|
find . -amin -60 # 60分钟内访问过
|
||||||
|
|
||||||
|
#组合条件
|
||||||
|
find . -name "*.log" -mtime -7 # 最近7天的log文件
|
||||||
|
find . -type f -size +1G -delete # 删除大于1GB的文件
|
||||||
|
|
||||||
|
#执行操作
|
||||||
|
find . -name "*.tmp" -exec rm {} \; # 删除找到的文件
|
||||||
|
find . -name "*.txt" -exec cp {} /backup/ \; # 复制到备份目录
|
||||||
|
```
|
||||||
|
## 4.2 grep常用用法
|
||||||
|
### 4.2.1 基础搜索
|
||||||
|
```bash
|
||||||
|
grep "error" log.txt # 搜索字符串
|
||||||
|
grep -i "error" log.txt # 忽略大小写
|
||||||
|
grep -r "TODO" ./src/ # 递归搜索目录
|
||||||
|
grep -n "error" log.txt # 显示行号
|
||||||
|
grep -v "debug" log.txt # 反向匹配(不含debug的行)
|
||||||
|
```
|
||||||
|
### 4.2.2 正则表达式
|
||||||
|
```bash
|
||||||
|
grep "^start" file.txt # 以start开头的行
|
||||||
|
grep "end$" file.txt # 以end结尾的行
|
||||||
|
grep -E "error|warning" log.txt # 扩展正则(或)
|
||||||
|
```
|
||||||
|
### 4.2.3 实用组合
|
||||||
|
```bash
|
||||||
|
ps aux | grep nginx # 查找nginx进程
|
||||||
|
grep -l "ERROR" *.log # 只显示包含ERROR的文件名
|
||||||
|
grep -c "error" log.txt # 统计匹配行数
|
||||||
|
```
|
||||||
|
# 📦5. Debian 包管理(APT)
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| apt update | 更新软件包列表 | `sudo apt update` |
|
||||||
|
| apt upgrade | 升级所有可升级包 | `sudo apt upgrade` |
|
||||||
|
| apt install | 安装软件包 | `sudo apt install nginx` |
|
||||||
|
| apt remove | 删除软件包(保留配置) | `sudo apt remove nginx` |
|
||||||
|
| apt purge | 完全删除(含配置) | `sudo apt purge nginx` |
|
||||||
|
| apt autoremove | 删除无用依赖 | `sudo apt autoremove` |
|
||||||
|
| apt search | 搜索软件包 | `apt search python` |
|
||||||
|
| apt show | 显示包详细信息 | `apt show nginx` |
|
||||||
|
| apt list | 列出包(--installed) | `apt list --installed` |
|
||||||
|
| dpkg | 直接操作.deb文件 | `dpkg -i package.deb` |
|
||||||
|
|
||||||
|
## 5.1 常用组合
|
||||||
|
```bash
|
||||||
|
#系统更新完整流程
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
#查找并安装软件
|
||||||
|
apt search "image editor"
|
||||||
|
sudo apt install gimp
|
||||||
|
|
||||||
|
#清理无用包
|
||||||
|
sudo apt autoremove --purge
|
||||||
|
|
||||||
|
#查看已安装包的版本
|
||||||
|
apt list --installed | grep nginx
|
||||||
|
|
||||||
|
#修复依赖问题
|
||||||
|
sudo apt --fix-broken install
|
||||||
|
```
|
||||||
|
# 🖥️6. 进程和系统监控
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| ps | 查看进程 | `ps aux` |
|
||||||
|
| top | 动态进程监控 | `top` |
|
||||||
|
| htop | 更友好的top(需安装) | `htop` |
|
||||||
|
| kill | 终止进程 | `kill -9 PID` |
|
||||||
|
| pkill | 按名称终止 | `pkill nginx` |
|
||||||
|
| jobs | 查看后台任务 | `jobs` |
|
||||||
|
|
|
||||||
|
bg | 将任务放到后台 | `bg %1` |
|
||||||
|
| fg | 将任务调到前台 | `fg %1` |
|
||||||
|
| & | 后台运行程序 | `./script.sh &` |
|
||||||
|
| nohup | 忽略挂断信号运行 | `nohup ./script.sh &` |
|
||||||
|
|
||||||
|
## 6.1 进程管理详解
|
||||||
|
```bash
|
||||||
|
#查看进程
|
||||||
|
ps aux # 所有进程(详细)
|
||||||
|
ps -ef # 所有进程(标准格式)
|
||||||
|
ps aux | grep python # 查找特定进程
|
||||||
|
|
||||||
|
#进程树
|
||||||
|
pstree -p # 显示PID
|
||||||
|
|
||||||
|
#终止进程
|
||||||
|
kill PID # 正常终止(SIGTERM)
|
||||||
|
kill -9 PID # 强制终止(SIGKILL)
|
||||||
|
kill -15 PID # 同 kill PID
|
||||||
|
pkill -f "python script" # 按命令行匹配终止
|
||||||
|
|
||||||
|
#优先级
|
||||||
|
nice -n 10 ./script.sh # 降低优先级(-20最高,19最低)
|
||||||
|
renice 5 -p PID # 修改运行中进程的优先级
|
||||||
|
系统资源查看
|
||||||
|
bash
|
||||||
|
#内存
|
||||||
|
free -h # 人类可读的内存使用
|
||||||
|
cat /proc/meminfo # 详细信息
|
||||||
|
|
||||||
|
#磁盘
|
||||||
|
df -h # 磁盘分区使用情况
|
||||||
|
du -sh /home/ # 目录总大小
|
||||||
|
du -h --max-depth=1 /home/ # 各子目录大小
|
||||||
|
|
||||||
|
#CPU
|
||||||
|
lscpu # CPU信息
|
||||||
|
cat /proc/cpuinfo # 详细信息
|
||||||
|
nproc # CPU核心数
|
||||||
|
|
||||||
|
#系统负载
|
||||||
|
uptime # 系统运行时间和负载
|
||||||
|
cat /proc/loadavg # 平均负载
|
||||||
|
|
||||||
|
#网络
|
||||||
|
ss -tlnp # 查看监听端口
|
||||||
|
netstat -tlnp # 同上(需安装net-tools)
|
||||||
|
```
|
||||||
|
# 📀7. 磁盘和挂载
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| lsblk | 列出块设备 | `lsblk -f`(含文件系统) |
|
||||||
|
| fdisk | 分区工具 | `sudo fdisk -l` |
|
||||||
|
| mount | 挂载设备 | `mount /dev/sda1 /mnt` |
|
||||||
|
| umount | 卸载设备 | `umount /mnt` |
|
||||||
|
| df | 磁盘使用情况 | `df -h` |
|
||||||
|
| du | 目录占用空间 | `du -sh /home` |
|
||||||
|
| blkid | 查看UUID | `sudo blkid` |
|
||||||
|
| parted | GPT分区工具 | `sudo parted -l` |
|
||||||
|
|
||||||
|
## 7.1 常用操作
|
||||||
|
```bash
|
||||||
|
#查看所有磁盘和分区
|
||||||
|
lsblk -f
|
||||||
|
|
||||||
|
#挂载NTFS硬盘
|
||||||
|
sudo mount -t ntfs-3g /dev/sdb1 /mnt/data
|
||||||
|
|
||||||
|
#卸载
|
||||||
|
sudo umount /mnt/data
|
||||||
|
|
||||||
|
#查看UUID(用于fstab自动挂载)
|
||||||
|
sudo blkid
|
||||||
|
|
||||||
|
#查看磁盘使用情况
|
||||||
|
df -Th # 显示类型和人类可读大小
|
||||||
|
|
||||||
|
#查看目录大小
|
||||||
|
du -sh /* # 根目录下各文件夹大小
|
||||||
|
fstab 自动挂载示例
|
||||||
|
|
||||||
|
#编辑 /etc/fstab 添加
|
||||||
|
UUID=1234-5678 /mnt/data ntfs-3g defaults,uid=1000,gid=1000,umask=022 0 0
|
||||||
|
```
|
||||||
|
# 🌐8. 网络相关
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| ip | 网络配置(推荐) | `ip addr show` |
|
||||||
|
| ifconfig | 网络配置(旧) | `ifconfig` |
|
||||||
|
| ping | 测试连通性 | `ping google.com` |
|
||||||
|
| curl | HTTP请求 | `curl -O http://file.zip` |
|
||||||
|
| wget | 下载文件 | `wget https://example.com/file` |
|
||||||
|
| ssh | 远程连接 | `ssh user@host` |
|
||||||
|
| scp | 安全复制 | `scp file user@host:/path/` |
|
||||||
|
| rsync | 增量同步 | `rsync -avz src/ dest/` |
|
||||||
|
| netstat | 网络统计 | `netstat -tlnp` |
|
||||||
|
| ss | socket统计(推荐) | `ss -tlnp` |
|
||||||
|
|
||||||
|
## 8.1 常用操作
|
||||||
|
```bash
|
||||||
|
#查看IP地址
|
||||||
|
ip addr show
|
||||||
|
ip -4 addr show # 只显示IPv4
|
||||||
|
|
||||||
|
#测试网络
|
||||||
|
ping -c 4 8.8.8.8
|
||||||
|
|
||||||
|
#下载文件
|
||||||
|
wget -c http://bigfile.zip # 断点续传
|
||||||
|
curl -O http://file.zip # 保存为原文件名
|
||||||
|
|
||||||
|
#查看端口监听
|
||||||
|
ss -tlnp # TCP监听端口
|
||||||
|
ss -ulnp # UDP监听端口
|
||||||
|
|
||||||
|
#测试端口连通性
|
||||||
|
nc -zv google.com 80 # 需要安装 netcat
|
||||||
|
|
||||||
|
#SSH 密钥登录
|
||||||
|
ssh-keygen -t rsa -b 4096
|
||||||
|
ssh-copy-id user@host
|
||||||
|
```
|
||||||
|
# 📜9. 文本编辑和查看
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| cat | 显示文件内容 | `cat file.txt` |
|
||||||
|
| less | 分页查看(推荐) | `less large.log` |
|
||||||
|
| head | 查看文件开头 | `head -20 file.txt` |
|
||||||
|
| tail | 查看文件结尾 | `tail -f log.txt`(实时跟踪) |
|
||||||
|
| nano | 简单编辑器 | `nano config.conf` |
|
||||||
|
| vim | 高级编辑器 | `vim script.py` |
|
||||||
|
| echo | 输出文本 | `echo "Hello" > file.txt` |
|
||||||
|
| \|(管道) | 传递输出 | `cat file \| grep word` |
|
||||||
|
| > | 重定向(覆盖) | `echo text > file` |
|
||||||
|
| >> | 重定向(追加) | `echo text >> file` |
|
||||||
|
|
||||||
|
## 9.1 常用操作
|
||||||
|
```bash
|
||||||
|
#查看文件
|
||||||
|
cat file.txt # 全部显示(适合小文件)
|
||||||
|
less file.txt # 分页(空格翻页,q退出)
|
||||||
|
head -20 file.txt # 前20行
|
||||||
|
tail -f app.log # 实时跟踪日志(Ctrl+C退出)
|
||||||
|
|
||||||
|
#重定向示例
|
||||||
|
ls -la > list.txt # 覆盖写入
|
||||||
|
echo "new line" >> list.txt # 追加
|
||||||
|
command 2> error.log # 只重定向错误输出
|
||||||
|
command &> output.log # 重定向所有输出
|
||||||
|
|
||||||
|
#管道组合
|
||||||
|
dmesg | grep error # 查找内核错误
|
||||||
|
ps aux | sort -rnk3 | head -10 # CPU占用前10进程
|
||||||
|
```
|
||||||
|
# 🗜️10. 压缩和解压
|
||||||
|
## 10.1 tar(最常用)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#创建压缩包
|
||||||
|
tar -czf archive.tar.gz folder/ # gzip压缩
|
||||||
|
tar -cjf archive.tar.bz2 folder/ # bzip2压缩
|
||||||
|
tar -cvf archive.tar folder/ # 不压缩,只打包
|
||||||
|
|
||||||
|
#解压
|
||||||
|
tar -xzf archive.tar.gz # 解压到当前目录
|
||||||
|
tar -xjf archive.tar.bz2 -C /target/ # 解压到指定目录
|
||||||
|
tar -xf archive.tar # 自动识别格式
|
||||||
|
|
||||||
|
#查看压缩包内容
|
||||||
|
tar -tzf archive.tar.gz
|
||||||
|
|
||||||
|
# 数说明
|
||||||
|
#-c 创建 -x 解压 -z gzip -j bzip2 -v 显示过程 -f 文件 -C 指定目录
|
||||||
|
```
|
||||||
|
## 10.2 其他格式
|
||||||
|
```bash
|
||||||
|
#zip
|
||||||
|
zip -r archive.zip folder/
|
||||||
|
unzip archive.zip -d /target/
|
||||||
|
|
||||||
|
#7z(需安装 p7zip)
|
||||||
|
7z a archive.7z folder/
|
||||||
|
7z x archive.7z -o/target/
|
||||||
|
|
||||||
|
#gz
|
||||||
|
gunzip file.gz
|
||||||
|
gzip file.txt
|
||||||
|
```
|
||||||
|
## 10.3 查看压缩文件内容(不解压)
|
||||||
|
```
|
||||||
|
zcat file.gz | head
|
||||||
|
zless file.gz
|
||||||
|
```
|
||||||
|
# 🔧11. 系统管理和维护
|
||||||
|
| 命令 | 作用 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| systemctl | 服务管理 | `systemctl status nginx` |
|
||||||
|
| journalctl | 查看日志 | `journalctl -u nginx -f` |
|
||||||
|
| reboot | 重启 | `sudo reboot` |
|
||||||
|
| shutdown | 关机 | `sudo shutdown -h now` |
|
||||||
|
| uname | 系统信息 | `uname -a` |
|
||||||
|
| lsb_release | 发行版信息 | `lsb_release -a` |
|
||||||
|
| uptime | 运行时间 | `uptime` |
|
||||||
|
| dmesg | 内核日志 | `dmesg \| tail` |
|
||||||
|
| crontab | 定时任务 | `crontab -e` |
|
||||||
|
|
||||||
|
## 11.1 systemctl常用命令
|
||||||
|
```bash
|
||||||
|
#服务管理
|
||||||
|
systemctl start nginx # 启动
|
||||||
|
systemctl stop nginx # 停止
|
||||||
|
systemctl restart nginx # 重启
|
||||||
|
systemctl reload nginx # 重载配置(不中断)
|
||||||
|
systemctl enable nginx # 开机自启
|
||||||
|
systemctl disable nginx # 取消自启
|
||||||
|
systemctl status nginx # 查看状态
|
||||||
|
|
||||||
|
#查看所有服务
|
||||||
|
systemctl list-units --type=service --state=running
|
||||||
|
|
||||||
|
# 系统操作
|
||||||
|
systemctl reboot # 重启
|
||||||
|
systemctl poweroff # 关机
|
||||||
|
systemctl suspend # 挂起
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11.2 journalctl日志查看
|
||||||
|
```bash
|
||||||
|
journalctl -xe # 查看最新日志(含说明)
|
||||||
|
journalctl -u nginx # 查看nginx服务日志
|
||||||
|
journalctl -u nginx -f # 实时跟踪
|
||||||
|
journalctl --since "2024-01-01" # 指定开始时间
|
||||||
|
journalctl --since today # 今天的日志
|
||||||
|
journalctl -k # 内核日志
|
||||||
|
journalctl | grep error # 搜索错误
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11.3 定时任务 Crontab
|
||||||
|
```bash
|
||||||
|
crontab -e # 编辑定时任务
|
||||||
|
crontab -l # 列出当前任务
|
||||||
|
crontab -r # 删除所有任务
|
||||||
|
|
||||||
|
# 格式:分 时 日 月 周 命令
|
||||||
|
# 示例
|
||||||
|
0 2 * * * /backup.sh # 每天2点执行
|
||||||
|
*/5 * * * * /check.sh # 每5分钟执行
|
||||||
|
0 9 * * 1-5 /report.sh # 周一至周五9点
|
||||||
|
@reboot /start-service.sh # 开机执行
|
||||||
|
```
|
||||||
|
|
||||||
|
# 🎯12. 实用技巧和快捷键
|
||||||
|
## 12.1 命令行快捷键
|
||||||
|
| 快捷键 | 作用 |
|
||||||
|
|--------|------|
|
||||||
|
| Ctrl+C | 终止当前命令 |
|
||||||
|
| Ctrl+Z | 挂起当前命令(fg恢复) |
|
||||||
|
| Ctrl+D | 退出终端(相当于exit) |
|
||||||
|
| Ctrl+L | 清屏(相当于clear) |
|
||||||
|
| Ctrl+A | 跳到行首 |
|
||||||
|
| Ctrl+E | 跳到行尾 |
|
||||||
|
| Ctrl+U | 删除光标前所有内容 |
|
||||||
|
| Ctrl+K | 删除光标后所有内容 |
|
||||||
|
| Ctrl+W | 删除前一个单词 |
|
||||||
|
| Ctrl+R | 历史命令搜索 |
|
||||||
|
| !! | 执行上一条命令 |
|
||||||
|
| !$ | 上一条命令的最后一个参数 |
|
||||||
|
| Tab | 自动补全 |
|
||||||
|
|
||||||
|
## 12.2 环境变量
|
||||||
|
```bash
|
||||||
|
# 查看变量
|
||||||
|
echo $PATH
|
||||||
|
env # 显示所有环境变量
|
||||||
|
|
||||||
|
# 设置临时变量
|
||||||
|
export MY_VAR="value"
|
||||||
|
|
||||||
|
# 永久设置(添加到 ~/.bashrc 或 ~/.profile)
|
||||||
|
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
|
||||||
|
source ~/.bashrc # 立即生效
|
||||||
|
```
|
||||||
|
|
||||||
|
## 12.3 重定向总结
|
||||||
|
| 符号 | 含义 |
|
||||||
|
|------|------|
|
||||||
|
| > | 标准输出重定向(覆盖) |
|
||||||
|
| >> | 标准输出重定向(追加) |
|
||||||
|
| 2> | 错误输出重定向 |
|
||||||
|
| 2>&1 | 错误输出合并到标准输出 |
|
||||||
|
| &> | 所有输出重定向 |
|
||||||
|
| < | 输入重定向 |
|
||||||
|
| \| | 管道(前一个输出作为后一个输入) |
|
||||||
|
```bash
|
||||||
|
#实用重定向示例
|
||||||
|
command > output.txt 2>&1 # 标准输出和错误都写入文件
|
||||||
|
command &> output.txt # 同上(bash简写)
|
||||||
|
command > /dev/null 2>&1 # 忽略所有输出(静默运行)
|
||||||
|
cat < file.txt # 从文件读取输入
|
||||||
|
```
|
||||||
|
## 12,4 📚快速参考卡
|
||||||
|
常用命令速查
|
||||||
|
| 要做的事 | 命令 |
|
||||||
|
|----------|------|
|
||||||
|
| 更新系统 | `sudo apt update && sudo apt upgrade` |
|
||||||
|
| 安装软件 | `sudo apt install 包名` |
|
||||||
|
| 查看IP | `ip a` |
|
||||||
|
| 查看端口 | `ss -tlnp` |
|
||||||
|
| 查看磁盘 | `df -h` |
|
||||||
|
| 查看目录大小 | `du -sh 目录` |
|
||||||
|
| 查找文件 | `find / -name 文件名` |
|
||||||
|
| 搜索内容 | `grep -r "内容" ./` |
|
||||||
|
| 实时查看日志 | `tail -f log.txt` |
|
||||||
|
| 后台运行 | `nohup 命令 &` |
|
||||||
|
| 查看进程 | `ps aux \| grep 进程名` |
|
||||||
|
| 杀掉进程 | `kill -9 PID` |
|
||||||
|
| 重启服务 | `systemctl restart 服务名` |
|
||||||
|
| 查看服务日志 | `journalctl -u 服务名 -f` |
|
||||||
|
| 压缩文件夹 | `tar -czf archive.tar.gz 文件夹/` |
|
||||||
|
| 解压 | `tar -xzf archive.tar.gz` |
|
||||||
|
| 远程拷贝 | `scp file user@host:/path/` |
|
||||||
|
| 同步文件夹 | `rsync -avz src/ dest/` |
|
||||||
|
|
||||||
|
# 13.⚠️危险命令(永远不要运行!)
|
||||||
|
| 命令 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `rm -rf /` | 删除整个系统 |
|
||||||
|
| `rm -rf /*` | 同上 |
|
||||||
|
| `rm -rf .*` | 会匹配到 ..(上级目录)! |
|
||||||
|
| `dd if=/dev/zero of=/dev/sda` | 清空硬盘 |
|
||||||
|
| `mkfs.ext4 /dev/sda` | 格式化硬盘 |
|
||||||
|
| `:(){ :\|:& };:` | Fork炸弹(死机) |
|
||||||
@@ -0,0 +1,339 @@
|
|||||||
|
# Debian12+Flarum1.8.1搭建小型论坛
|
||||||
|
## 一、环境说明
|
||||||
|
• 系统版本:Debian(纯命令行模式,无桌面环境,节约资源)
|
||||||
|
• 网站版本:Flarum 1.8.1
|
||||||
|
• Nginx版本:1.22.1
|
||||||
|
• 数据库版本:MySQL 5.7+ 或 MariaDB 10.2+
|
||||||
|
• PHP版本:8.0+
|
||||||
|
## 二、前置准备
|
||||||
|
1. 以 root 用户登录 Debian 纯命令行(远程登录可使用 Xshell、Putty 等工具);
|
||||||
|
2. 确保服务器临时能联网(用于下载依赖和软件,后续配置静态IP后永久联网);
|
||||||
|
3. 提前确认您域名已解析。本文后续域名使用yousuke.icu,您可以替换成您自己的域名。
|
||||||
|
|
||||||
|
## 三、分步搭建步骤
|
||||||
|
### 步骤1:安装Composer
|
||||||
|
#下载Composer安装脚本
|
||||||
|
php - r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||||
|
|
||||||
|
#验证脚本完整性(可选但推荐)
|
||||||
|
php - r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
|
||||||
|
|
||||||
|
#安装Composer到全局
|
||||||
|
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
|
||||||
|
|
||||||
|
#验证安装
|
||||||
|
composer -V
|
||||||
|
|
||||||
|
### 步骤2:创建数据库
|
||||||
|
mysql -u root -p
|
||||||
|
执行以下 SQL 创建 Flarum 专用数据库和用户(替换<你的数据库用户名>为实际用户名,比如 flarum_user):
|
||||||
|
-- 创建数据库(字符集必须utf8mb4,支持emoji)
|
||||||
|
CREATE DATABASE flarum_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
-- 创建数据库用户并授权
|
||||||
|
CREATE USER 'flarum_user'@'localhost' IDENTIFIED BY '你的密码';
|
||||||
|
GRANT ALL PRIVILEGES ON flarum_db.* TO 'flarum_user'@'localhost';
|
||||||
|
-- 刷新权限
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
-- 退出MySQL
|
||||||
|
EXIT;
|
||||||
|
|
||||||
|
### 步骤3:安装Flarum 1.8.1
|
||||||
|
#进入网站上层目录
|
||||||
|
cd /var/www/
|
||||||
|
#创建目录
|
||||||
|
#创建站点根目录(根据你的服务器实际web根目录调整,比如Nginx常用/var/www,Apache常用/var/www/html)
|
||||||
|
mkdir -p /var/www/xxx
|
||||||
|
#赋予目录权限(www-data是web服务默认用户,不同系统可能是apache/nginx)
|
||||||
|
chown -R www-data:www-data /var/www/xxx
|
||||||
|
chmod -R 755 /var/www/xxx
|
||||||
|
xxx表示网站目录名称
|
||||||
|
|
||||||
|
#安装Flarum 1.8.1
|
||||||
|
composer create-project flarum/flarum mir3 1.8.* --stability=stable --no-dev --ignore-platform-reqs
|
||||||
|
注意这里可能出现以下提示:
|
||||||
|
Package doctrine/cache is abandoned, you should avoid using it. No replacement was suggested.
|
||||||
|
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
|
||||||
|
Generating autoload files
|
||||||
|
74 packages you are using are looking for funding.
|
||||||
|
Use the `composer fund` command to find out more!
|
||||||
|
Found 2 security vulnerability advisories affecting 2 packages.
|
||||||
|
Run "composer audit" for a full list of advisories.
|
||||||
|
这个提示信息实际就是告诉你有一个cache的文件夹没有,不用管,这个文件夹在网站在网页完成最后安装的时候会自己出来,这会没有是对的。
|
||||||
|
|
||||||
|
### 步骤4:配置Nginx
|
||||||
|
#编辑或新建vim /etc/nginx/conf.d/xxx.conf
|
||||||
|
vim /etc/nginx/conf.d/xxx.conf
|
||||||
|
#粘贴以下配置(xxx为网站目录)
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name 你的域名;
|
||||||
|
root /var/www/xxx/public; #Flarum的入口在public目录
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
#静态文件缓存(优化性能)
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, max-age=31536000";
|
||||||
|
add_header X-Content-Type-Options nosniff;
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
#URL重写(Flarum必需)
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
#PHP解析配置
|
||||||
|
location ~ \.php$ {
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #确认PHP-FPM sock路径(不同系统可能是/var/run/php/php8.2-fpm.sock)
|
||||||
|
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
|
||||||
|
fastcgi_param DOCUMENT_ROOT $realpath_root;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
}
|
||||||
|
|
||||||
|
#禁止访问敏感文件
|
||||||
|
location ~ /\.env {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#保存后检查 Nginx 配置并重启:
|
||||||
|
nginx -t #检查配置语法
|
||||||
|
systemctl restart nginx #重启Nginx
|
||||||
|
|
||||||
|
### 步骤5:Web界面安装Flarum
|
||||||
|
1. 浏览器访问http://你的域名,进入 Flarum 安装界面;
|
||||||
|
2. 填写安装信息:
|
||||||
|
数据库:
|
||||||
|
数据库类型:MySQL/MariaDB
|
||||||
|
主机:localhost
|
||||||
|
数据库名:flarum_db(步骤 2 创建的)
|
||||||
|
用户名:flarum_user(步骤 2 创建的)
|
||||||
|
密码:xxxxxxxxxxx(步骤2你设置的)
|
||||||
|
管理员账户:填写你的管理员邮箱、用户名、密码;
|
||||||
|
论坛信息:填写论坛名称,URL 填写http://你的域名(后续配置 HTTPS 时也不用管,申请证书的时候会自动搞定https);
|
||||||
|
3. 点击 “Install Flarum” 完成安装。
|
||||||
|
注意:这一步安装完之后,之前安装Flarum 1.8.1缺少的cache就会有了。
|
||||||
|
|
||||||
|
## 四、中文语言包安装
|
||||||
|
### 步骤1:SSH安装语言包
|
||||||
|
中文语言包一定要在这个时候再安装,否则会因为缺少那个cache失败。
|
||||||
|
#1. 进入mir3目录
|
||||||
|
cd /var/www/mir3
|
||||||
|
#2. 允许root运行Composer(消除权限警告)
|
||||||
|
export COMPOSER_ALLOW_SUPERUSER=1
|
||||||
|
#3. 安装中文语言包(忽略安全审计,适配1.8.*)
|
||||||
|
composer require flarum-lang/chinese-simplified:* --prefer-dist --no-audit
|
||||||
|
#4. 此时flarum命令已可用,清除缓存
|
||||||
|
php flarum cache:clear
|
||||||
|
|
||||||
|
### 步骤2:后台启用中文语言包
|
||||||
|
浏览器访问http://你的域名 /admin,用你刚创建的管理员账号登录;
|
||||||
|
1. 左侧菜单栏点击Features(特征其实就是扩展);
|
||||||
|
在最下面找到Language下面有English和简体中文,点击简体中文进去,点击Enable按钮启用;
|
||||||
|
2. 回到左侧菜单栏最上面,点击Basics;
|
||||||
|
找到 “Default Language”选项,下拉选择 “中文简体”;
|
||||||
|
滚动到页面底部,点击Save Changes(保存更改);
|
||||||
|
刷新论坛首页,界面已全部变为中文。
|
||||||
|
|
||||||
|
## 五、其他优化
|
||||||
|
优化设置部分先后,根据自己的需求来.
|
||||||
|
### 优化1:邮箱设置
|
||||||
|
这个地方很坑,邮箱设置分两个步骤。
|
||||||
|
#### 步骤1:后台编辑
|
||||||
|
进入后台,左侧菜单选择“邮箱”。
|
||||||
|
这一堆照着填就行了,和平时配置pop、imap邮箱时没什么区别,填写好后保存。
|
||||||
|
此时点发送,肯定会失败。
|
||||||
|
|
||||||
|
#### 步骤2:代码编辑
|
||||||
|
#编辑网站根目录下的 config.php 文件,找到 ‘mail’ 配置段,修改为如下格式(如何没有就直接粘贴进去,同时根据在后台填写的内容设置):
|
||||||
|
nano /var/www/xxx/config.php
|
||||||
|
xxx是网站目录
|
||||||
|
// 文件位置:config.php
|
||||||
|
```
|
||||||
|
'mail' => [
|
||||||
|
'driver' => 'smtp',
|
||||||
|
'host' => 'smtpdm.aliyun.com',
|
||||||
|
'port' => 465, // 或 587
|
||||||
|
'encryption' => 'ssl', // 或 tls,必须小写
|
||||||
|
'username' => '你的完整发信地址@example.com',
|
||||||
|
'password' => '你的阿里云SMTP密码',
|
||||||
|
'from' => [
|
||||||
|
'address' => '你的完整发信地址@example.com', // 必须与上面一致
|
||||||
|
'name' => '你的论坛名称',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 步骤3:测试
|
||||||
|
此时回到后台点击测试,如果信息没有错,就会提示发送成功。
|
||||||
|
这里注意,如果你的邮件很多,最好用正规的,别用个人的,容易出问题。
|
||||||
|
|
||||||
|
### 优化2:注册免邮箱验证
|
||||||
|
Flarum默认注册时需要填写邮箱,然后论坛会发一封确认邮件,这个功能个人觉得小型论坛完全没必要。因此,建议关闭。
|
||||||
|
关闭方法如下:
|
||||||
|
#连接服务器:使用 SSH 工具(如 Putty 或终端)登录到你的服务器。
|
||||||
|
|
||||||
|
#进入论坛根目录:导航到 Flarum 安装的根目录:
|
||||||
|
cd /var/www/xxx(请将路径替换为你自己的实际路径)
|
||||||
|
|
||||||
|
#执行安装命令:在根目录下,运行以下 Composer 命令来安装Email Verification Switch 插件:
|
||||||
|
composer require isaced/flarum-ext-email-verification-switch:"*"
|
||||||
|
|
||||||
|
#启用扩展:命令执行完成后,回到 Flarum 后台的 Extensions(插件) 页面,找到新安装的 Email Verification Switch,点击“启用”即可。
|
||||||
|
|
||||||
|
### 优化3:白天黑夜模式设置
|
||||||
|
这个是现在比较流行的根据白天黑夜进行页面颜色的设置,所以为了搞这个就装了一个FoF Night Mode插件。
|
||||||
|
由 Flarum 官方团队(Friends of Flarum)开发,是原版的「增强版」,支持自定义深色主题色、定时切换、强制全局模式,适合想精细控制风格的论坛。
|
||||||
|
#安装命令(SSH 执行)
|
||||||
|
#进入 Flarum 目录
|
||||||
|
cd /var/www/mir3
|
||||||
|
#执行安装
|
||||||
|
composer require fof/nightmode:*
|
||||||
|
#刷新缓存
|
||||||
|
php flarum cache:clear
|
||||||
|
|
||||||
|
### 优化4:首页欢迎横幅
|
||||||
|
这个欢迎横幅旁边有一个叉,可以关闭,关闭之后以后再打开就没有了。对于我来说我是希望有点仪式感,就想保留这个,然后就得吧叉去掉的,同时还要让他一直存在。
|
||||||
|
由于我这边做了优化3,安装了FoF Night Mode插件,所以修改如下。如果没有装这个插件会有点区别,注意哟。
|
||||||
|
#登录 Flarum 后台 →「外观」→「编辑自定义 CSS」;
|
||||||
|
替换所有 CSS 为下面这段(专门适配 FoF Night Mode):
|
||||||
|
```
|
||||||
|
/* ========== 删掉关闭叉 ========== */
|
||||||
|
.Hero-close {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
/* ========== 基础:横幅不遮挡+强制显示 ========== */
|
||||||
|
.Hero {
|
||||||
|
display: block !important;
|
||||||
|
visibility: visible !important;
|
||||||
|
opacity: 1 !important;
|
||||||
|
z-index: 10 !important; /* 低于顶部导航,不遮挡功能 */
|
||||||
|
padding: 20px 0 !important;
|
||||||
|
margin-bottom: 15px !important;
|
||||||
|
text-align: center !important;
|
||||||
|
border-bottom: 1px solid #eee !important;
|
||||||
|
position: relative !important;
|
||||||
|
width: 100% !important;
|
||||||
|
height: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========== 适配FoF Night Mode 核心逻辑 ========== */
|
||||||
|
/* 1. 日间模式(插件默认light主题) */
|
||||||
|
body[data-theme="light"] .Hero {
|
||||||
|
background-color: #f8f9fa !important; /* 浅灰白(匹配插件日间) */
|
||||||
|
color: #212529 !important; /* 深灰文字(清晰) */
|
||||||
|
border-bottom-color: #e9ecef !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 2. 夜间模式(插件dark主题) */
|
||||||
|
body[data-theme="dark"] .Hero {
|
||||||
|
background-color: #1e293b !important; /* 深蓝灰(匹配插件夜间) */
|
||||||
|
color: #f8fafc !important; /* 浅白文字(不刺眼) */
|
||||||
|
border-bottom-color: #334155 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========== 兜底:兼容插件旧版本 ========== */
|
||||||
|
body.night-mode .Hero, html.dark .Hero {
|
||||||
|
background-color: #1e293b !important;
|
||||||
|
color: #f8fafc !important;
|
||||||
|
border-bottom-color: #334155 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========== 功能保障 ========== */
|
||||||
|
.Hero .container {
|
||||||
|
font-size: 16px !important;
|
||||||
|
line-height: 1.8 !important;
|
||||||
|
padding: 0 20px !important;
|
||||||
|
}
|
||||||
|
.Hero-close { display: none !important; }
|
||||||
|
.Header, .Header-controls { z-index: 9999 !important; }
|
||||||
|
```
|
||||||
|
保存后,先切换夜间模式,再按 Ctrl+F5 硬刷新
|
||||||
|
|
||||||
|
### 优化5:全论坛置顶功能
|
||||||
|
这个功能我觉得很好,所以我是安装了的。
|
||||||
|
要实现 “帖子在板块内置顶,同时在首页(全部主题)也置顶”,需要安装 the-turk/flarum-stickiest 扩展,它在原生 flarum/sticky 的基础上增加了「全局置顶(Super Sticky)」功能。
|
||||||
|
1. 安装扩展(SSH 执行)
|
||||||
|
#进入你的 Flarum 目录
|
||||||
|
cd /var/www/mir3
|
||||||
|
#安装 Stickiest 扩展
|
||||||
|
composer require the-turk/flarum-stickiest:^3.0.0
|
||||||
|
#执行数据库迁移(首次安装必须)
|
||||||
|
php flarum migrate
|
||||||
|
#清空缓存
|
||||||
|
php flarum cache:clear
|
||||||
|
|
||||||
|
### 优化6:论坛日间夜间主题切换
|
||||||
|
由 Flarum 官方团队(Friends of Flarum)开发,是原版的「增强版」,支持 自定义深色主题色、定时切换、强制全局模式,适合想精细控制风格的论坛。
|
||||||
|
1. 安装命令(SSH 执行)
|
||||||
|
#进入 Flarum 目录
|
||||||
|
cd /var/www/mir3
|
||||||
|
#执行安装
|
||||||
|
composer require fof/nightmode:*
|
||||||
|
#刷新缓存
|
||||||
|
php flarum cache:clear
|
||||||
|
2. 核心优势(比原版强在哪)
|
||||||
|
自定义深色主题:可单独设置夜间模式下的主色调、链接色,不再是单纯的黑白反转;
|
||||||
|
定时自动切换:比如「晚 8 点自动切夜间,早 8 点切日间」;
|
||||||
|
管理员强制模式:可选择「全站仅日间」「全站仅夜间」(适合游戏论坛的深色风格);
|
||||||
|
更细腻的切换动画:无卡顿,体验更流畅。
|
||||||
|
|
||||||
|
### 优化7:添加昵称
|
||||||
|
官方扩展:flarum/nicknames
|
||||||
|
这是由 Flarum 官方团队开发和维护的扩展,专门用于添加、管理和显示用户昵称 。它的兼容性最好,功能也纯粹。
|
||||||
|
主要功能:
|
||||||
|
允许用户在个人资料中设置一个昵称(区别于登录用的用户名)。
|
||||||
|
管理员可以在后台设置权限,控制哪些用户组可以编辑昵称 。
|
||||||
|
可以选择在注册时就让用户填写昵称 。
|
||||||
|
最重要的是,你可以在后台的“外观”设置中,选择将页面上显示的用户名替换为昵称 。
|
||||||
|
安装步骤
|
||||||
|
整个过程只需要几条命令,比之前装附件扩展要顺利得多。请在你的 Flarum 根目录下执行:
|
||||||
|
#进入 Flarum 目录
|
||||||
|
cd /var/www/mir3
|
||||||
|
#使用 Composer 安装扩展:
|
||||||
|
composer require flarum/nicknames
|
||||||
|
#运行迁移,更新数据库:
|
||||||
|
php flarum migrate
|
||||||
|
#清理缓存,确保生效:
|
||||||
|
php flarum cache:clear
|
||||||
|
|
||||||
|
### 优化8:附件插件
|
||||||
|
这个插件我放到最后是因为我唯一最不满意的地方,但是也是无可奈何。因为对于Flarum来说,只有FoF Upload这个选择。
|
||||||
|
#### 1. 安装
|
||||||
|
fof/upload 依赖 PHP 的文件上传扩展,且要求 Flarum ≥ 1.0.0,我们先补全依赖,避免安装失败:
|
||||||
|
#安装PHP上传所需扩展(你的服务器大概率已装,但补一下更稳妥)
|
||||||
|
apt install -y php-fileinfo php-imagick
|
||||||
|
#重启PHP-FPM生效
|
||||||
|
systemctl restart php-fpm
|
||||||
|
Composer 安装(推荐,稳定无错),这是官方推荐的安装方式,自动处理依赖,步骤最简单:
|
||||||
|
(1) 进入 Flarum 根目录
|
||||||
|
SSH 登录服务器,切换到 Flarum 安装目录:
|
||||||
|
cd /var/www/flarum
|
||||||
|
(2) 执行安装命令
|
||||||
|
直接运行 Composer 命令下载插件:
|
||||||
|
composer require fof/upload:*
|
||||||
|
*表示安装适配你当前 Flarum 版本的最新版;
|
||||||
|
如果提示需要 GitHub Token,直接按回车跳过(仅影响下载速度,不影响安装);
|
||||||
|
若出现「内存不足」报错(2G 内存偶尔会遇到),临时扩容交换内存:
|
||||||
|
运行
|
||||||
|
fallocate -l 1G /swapfile
|
||||||
|
chmod 600 /swapfile
|
||||||
|
mkswap /swapfile
|
||||||
|
swapon /swapfile
|
||||||
|
#安装完成后可删除交换文件:rm -rf /swapfile
|
||||||
|
#### 2. 配置问题
|
||||||
|
这个配置折腾了我很久,主要是太麻烦我个人觉得。最开始是按照文件类型逐一配置的,我的天啊,太多了,实在有点受不了。后来找到了一个简单的办法。
|
||||||
|
先记下这个东西:
|
||||||
|
(video\/(3gpp|mp4|mpeg|quicktime|webm))|(audio\/(aiff|midi|mpeg|mp4))|(application\/(x-(7z|rar|zip)-compressed|zip|arj|x-(bzip2|gzip|lha|stuffit|tar)|pdf))| (image\/(gif|jpeg|png))
|
||||||
|
这个是常用附件类型最全的配置方法。因为图片是需要预览的,所以图片部分单独拿出来新建一个完整图片预览。
|
||||||
|
说说这个插件最坑的地方:
|
||||||
|
不支持中文和一些字符。当你上传带有中文的附件时,最后传完在帖子中看到的就只有非中文部分了。所以,在上传附件时对于国内来说就比较麻烦了,毕竟你把附件名字搞成纯英文的很麻烦,也还要估计人家是否看的懂。但是这个插件确实也是最好的了。网上一些方案我试了一下都不太靠谱,尝试了几个都不行。最后的解决方案就是发帖子带附件的时候按照
|
||||||
|
附件名+附件的方案。也就是先写附件的中文名,再插入附件,看起来还不错。多个附件就换行。我试了几个还可以,当然也是无奈之举。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
# Discuz! 论坛附件上传参数设置与服务器内存配置建议
|
||||||
|
|
||||||
|
适用场景:Discuz! 论坛(X3.4 / X3.5)
|
||||||
|
适用系统:Linux / Windows Server
|
||||||
|
适用环境:Nginx / Apache / IIS + PHP + MySQL
|
||||||
|
|
||||||
|
## 一、附件上传涉及的参数层级
|
||||||
|
附件上传的限制并非由单一参数决定,而是由 客户端 → Web服务器 → PHP → Discuz后台 → 用户组权限 五级联动控制。任何一个环节设置过小,都会导致上传失败。
|
||||||
|
参数层级示意图
|
||||||
|
客户端浏览器
|
||||||
|
↓
|
||||||
|
Web服务器(Nginx/Apache/IIS) ← client_max_body_size / LimitRequestBody / maxAllowedContentLength
|
||||||
|
↓
|
||||||
|
PHP 配置文件(php.ini) ← upload_max_filesize / post_max_size / memory_limit / max_execution_time / max_input_time
|
||||||
|
↓
|
||||||
|
Discuz 后台全局设置 ← 【全局】→【上传设置】→“最大附件尺寸”
|
||||||
|
↓
|
||||||
|
Discuz 用户组权限 ← 【用户】→【用户组】→【附件相关】→“最大附件尺寸”
|
||||||
|
|
||||||
|
## 二、各层级参数详解与推荐值
|
||||||
|
### 2.1 PHP 配置文件(php.ini)
|
||||||
|
这是最核心的底层限制,所有上传文件必须先过这一关。
|
||||||
|
|
||||||
|
参数 作用 推荐值 说明
|
||||||
|
upload_max_filesize 单个文件大小上限 根据需求,如 500M / 1G 字面意思,一个附件最大不能超过此值
|
||||||
|
post_max_size 整个 POST 请求大小上限 ≥ upload_max_filesize + 10M 必须大于等于前者,因 POST 请求包含表单字段
|
||||||
|
memory_limit 单个 PHP 脚本最大可用内存 建议 128M ~ 512M,视服务器物理内存而定 影响图片缩略图生成、插件运行等,不宜过小
|
||||||
|
max_execution_time PHP 脚本最大执行时间(秒) 根据文件大小调整,如 300 ~ 7200 大文件上传需足够时间,设为 0 表示无限制
|
||||||
|
max_input_time PHP 接收输入数据最大时间(秒) 与 max_execution_time 保持一致 接收文件超时也会导致失败
|
||||||
|
配置示例(支持 1G 附件):
|
||||||
|
upload_max_filesize = 1024M
|
||||||
|
post_max_size = 1024M
|
||||||
|
memory_limit = 256M
|
||||||
|
max_execution_time = 3600
|
||||||
|
max_input_time = 3600
|
||||||
|
|
||||||
|
### 2.2 Web 服务器层限制
|
||||||
|
PHP 之前的第一道关卡,容易被忽略。
|
||||||
|
|
||||||
|
Web 服务器 参数 推荐设置 配置文件位置
|
||||||
|
Nginx client_max_body_size 与 post_max_size 一致,如 1024M http / server / location 块
|
||||||
|
Apache LimitRequestBody 与 post_max_size 一致,如 1073741824(1G 字节) httpd.conf 或 .htaccess
|
||||||
|
IIS maxAllowedContentLength 与 post_max_size 一致,如 1073741824 请求筛选模块
|
||||||
|
Nginx 配置示例:
|
||||||
|
nginx
|
||||||
|
client_max_body_size 1024M;
|
||||||
|
|
||||||
|
### 2.3 Discuz 后台全局设置
|
||||||
|
位置:【全局】 → 【上传设置】 → 【附件设置】
|
||||||
|
|
||||||
|
参数 说明 推荐设置
|
||||||
|
最大附件尺寸 全站统一的附件大小上限 建议 ≤ upload_max_filesize,留 10~20M 余量
|
||||||
|
允许附件类型 如 zip, rar, jpg, png 按需设置,避免上传可执行文件等风险类型
|
||||||
|
缩略图设置 是否生成缩略图 如开启,需确保 memory_limit 足够。
|
||||||
|
|
||||||
|
### 2.4 Discuz 用户组权限
|
||||||
|
位置:【用户】 → 【用户组】 → 【编辑】 → 【附件相关】
|
||||||
|
|
||||||
|
参数 说明 推荐设置
|
||||||
|
最大附件尺寸 该用户组允许上传的附件大小 可分级设置:管理员/版主 > 普通会员
|
||||||
|
允许附件类型 可单独覆写全局设置 如需限制特定用户组,可在此调整。
|
||||||
|
|
||||||
|
### 2.5 用户附件下载限制
|
||||||
|
以下参数均在/etc/nginx/8.2/conf.d/xxx.conf中,具体路径根据你的配置决定
|
||||||
|
send_timeout 3600s; #发送响应超时
|
||||||
|
keepalive_timeout 3600s; #长连接超时
|
||||||
|
fastcgi_read_timeout 3600s; #PHP-FPM 响应超时
|
||||||
|
client_max_body_size 2048M;
|
||||||
|
client_body_timeout 3600s;
|
||||||
|
client_header_timeout 60s;
|
||||||
|
client_body_buffer_size 20M;
|
||||||
|
|
||||||
|
## 三、服务器内存大小与参数设置推荐
|
||||||
|
### 3.1 核心原则
|
||||||
|
memory_limit ≠ 附件上限:它限制的是 PHP 脚本总内存占用,包括程序本身、图片处理、插件等。
|
||||||
|
|
||||||
|
留足余量:建议 memory_limit 比实际附件限制大 20%~30%,以应对图片缩略图等突发内存需求。
|
||||||
|
|
||||||
|
总内存分配参考:总内存 = 系统预留 + MySQL + PHP-FPM(所有进程) + 其他服务
|
||||||
|
|
||||||
|
### 3.2 不同内存配置推荐表
|
||||||
|
物理内存 MySQL 占用 系统预留 可用 PHP 总内存 推荐 memory_limit 推荐附件上限
|
||||||
|
1G ~200M ~200M ~600M 128M 80M ~ 100M
|
||||||
|
2G ~300M ~300M ~1.4G 256M 200M ~ 300M
|
||||||
|
4G ~500M ~400M ~3.1G 512M 500M ~ 800M
|
||||||
|
8G ~1G ~500M ~6.5G 1G 1G ~ 2G
|
||||||
|
说明:以上为通用建议值,若论坛图片处理频繁或插件较多,应适当提高 memory_limit,相应降低附件上限。
|
||||||
|
|
||||||
|
### 3.3 并发场景考虑
|
||||||
|
公式:max_children(PHP-FPM 进程数) × memory_limit ≤ 可用 PHP 总内存
|
||||||
|
|
||||||
|
示例:2G 内存,可用 PHP 总内存约 1.4G,设 memory_limit = 256M,则 max_children ≤ 5(1.4G / 256M ≈ 5.5,向下取整)
|
||||||
|
|
||||||
|
## 四、常见问题排查(FAQ)
|
||||||
|
### Q1:上传大文件时进度条卡住或直接失败?
|
||||||
|
可能原因:
|
||||||
|
(1)Web 服务器层限制未调大(client_max_body_size 等)
|
||||||
|
(2)PHP max_input_time / max_execution_time 过小
|
||||||
|
(3)临时目录空间不足(upload_tmp_dir)
|
||||||
|
|
||||||
|
### Q2:小文件能传,大文件就失败?
|
||||||
|
排查方向:
|
||||||
|
(1)检查是否触发了 Web 服务器的 client_max_body_size
|
||||||
|
(2)检查 PHP memory_limit 是否过小(尤其处理图片时)
|
||||||
|
|
||||||
|
### Q3:为什么 Discuz 后台显示的最大附件和 php.ini 不一样?
|
||||||
|
原因:Discuz 会取 upload_max_filesize、post_max_size、memory_limit 中的最小值作为建议上限。若 memory_limit 较小,会直接显示为附件限制。
|
||||||
|
|
||||||
|
## 五、安全建议
|
||||||
|
(1)限制附件类型:避免上传 php、sh、exe 等可执行文件
|
||||||
|
(2)开启病毒扫描(如有条件)
|
||||||
|
(3)定期清理临时目录:/tmp 或 upload_tmp_dir
|
||||||
|
(4)监控磁盘空间:附件目录和临时目录需预留足够空间
|
||||||
|
|
||||||
|
## 六、附录:常用命令速查
|
||||||
|
Linux 下查看 PHP 配置
|
||||||
|
php -i | grep upload_max
|
||||||
|
php -i | grep post_max
|
||||||
|
php -i | grep memory_limit
|
||||||
|
修改 php.ini 后重载服务
|
||||||
|
#Nginx + PHP-FPM
|
||||||
|
sudo systemctl restart php-fpm
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
|
||||||
|
#Apache
|
||||||
|
sudo systemctl restart httpd
|
||||||
|
查找实际使用的 php.ini 位置
|
||||||
|
php -i | grep "Loaded Configuration File"
|
||||||
|
文档结束 — 建议在修改任何配置前,先创建服务器快照或备份配置文件,以便快速回滚。
|
||||||
|
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
# Discuz!头像无法显示(403 Forbidden)排查文档
|
||||||
|
问题现象:Discuz!论坛会员排行或用户头像位置显示裂图,直接访问头像地址(如 uc_server/avatar.php 或 data/avatar/noavatar.svg)返回 403 Forbidden。
|
||||||
|
核心原因总结:这是一个由 Nginx 配置规则冲突、PHP-FPM 通信权限、文件系统权限三重问题叠加导致的综合性故障。
|
||||||
|
|
||||||
|
## 第一步:诊断访问链路
|
||||||
|
在浏览器中分别访问以下两个关键地址,观察返回结果:
|
||||||
|
A. 动态头像脚本:http://你的域名/uc_server/avatar.php?uid=1&size=small
|
||||||
|
B. 静态默认头像:http://你的域名/uc_server/data/avatar/noavatar.svg
|
||||||
|
根据返回结果,判断问题阶段:
|
||||||
|
访问A的结果 访问B的结果 问题阶段
|
||||||
|
显示PHP源代码 任意 Nginx未解析PHP,PHP-FPM通信故障
|
||||||
|
301重定向到B地址 403 Forbidden PHP已正常工作,但静态文件被Nginx拦截
|
||||||
|
301重定向到B地址 200 OK 恭喜,问题已解决!
|
||||||
|
|
||||||
|
## 第二步:解决 PHP 文件被下载或显示源代码的问题
|
||||||
|
如果在第一步中访问 avatar.php 显示源代码,说明 Nginx 没有将 PHP 请求交给 PHP-FPM 处理。
|
||||||
|
### 1. 检查 PHP-FPM 服务状态
|
||||||
|
systemctl status php8.2-fpm #请将版本号替换为你自己的,如 php7.4-fpm
|
||||||
|
确保状态为 active (running)。
|
||||||
|
### 2. 检查并修复 PHP-FPM Socket 权限
|
||||||
|
查看 PHP-FPM 配置文件 pool.d/www.conf,确保以下设置未被注释且数值正确:
|
||||||
|
listen.owner = www-data
|
||||||
|
listen.group = www-data
|
||||||
|
listen.mode = 0666 #必须为 0666,确保Nginx用户有权限写入
|
||||||
|
修改配置后,必须重启 PHP-FPM:
|
||||||
|
sudo systemctl restart php8.2-fpm
|
||||||
|
验证 Socket 文件权限是否为 srw-rw-rw-:
|
||||||
|
ls -la /run/php/php8.2-fpm.sock
|
||||||
|
### 3. 检查 Nginx 配置文件中的 PHP 处理块
|
||||||
|
确保 location ~ \.php$ 块配置正确且未被其他规则覆盖。一个最小化的正确配置如下:
|
||||||
|
```nginx
|
||||||
|
location ~ \.php$ {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #或 127.0.0.1:9000
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 第三步:解决静态文件(头像图片/SVG)被 Nginx 拦截的问题
|
||||||
|
如果在第一步中访问 avatar.php 已能正常返回 301,但重定向后的静态文件地址返回 403,说明问题出在 Nginx 的静态文件访问规则上。
|
||||||
|
### 1. 检查文件及父目录权限
|
||||||
|
bash
|
||||||
|
#检查目标文件权限 (应为 644)
|
||||||
|
ls -l /var/www/你的目录/uc_server/data/avatar/noavatar.svg
|
||||||
|
#检查各级父目录权限 (应为 755)
|
||||||
|
ls -ld /var/www/你的目录/uc_server/
|
||||||
|
ls -ld /var/www/你的目录/uc_server/data/
|
||||||
|
ls -ld /var/www/你的目录/uc_server/data/avatar/
|
||||||
|
如果权限不对,使用 chmod 和 chown 进行修正。
|
||||||
|
### 2. 核心:调整 Nginx 配置规则的顺序与精确度
|
||||||
|
Nginx 配置中规则的顺序和优先级至关重要。以下是经过验证的正确配置顺序(这是解决问题的关键):
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name 你的域名;
|
||||||
|
root /var/www/你的目录;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
#1. 最高优先级:精确匹配 avatar.php (确保它不被任何其他PHP规则误伤)
|
||||||
|
location = /uc_server/avatar.php {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
#2. 次高优先级:开放头像静态文件目录 (使用 ^~ 提高优先级)
|
||||||
|
location ^~ /uc_server/data/avatar/ {
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public";
|
||||||
|
try_files $uri =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
#3. 通用PHP处理规则 (处理其他所有.php文件)
|
||||||
|
location ~ \.php$ {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
#4. 安全规则:保护敏感目录 (必须放在开放规则之后)
|
||||||
|
location ~ /(config|data)/ {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
|
#5. 保护 uc_server 下其他PHP文件 (排除已精确匹配的 avatar.php)
|
||||||
|
location ~ ^/uc_server/(?!avatar\.php).*\.php$ {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
|
#6. 保护 uc_server/data/ 下除 avatar/ 外的其他目录
|
||||||
|
location ~ ^/uc_server/data/(?!avatar/) {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
|
#... 其他配置 (静态文件缓存等) ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### 3. 应用配置并验证
|
||||||
|
每次修改 Nginx 配置后,务必进行测试和重载:
|
||||||
|
bash
|
||||||
|
sudo nginx -t #测试配置语法
|
||||||
|
sudo systemctl reload nginx #或 restart,使配置生效
|
||||||
|
|
||||||
|
## 第四步:最终验证
|
||||||
|
再次执行第一步的访问测试,如果两者都返回正常(301 + 200),则问题彻底解决。刷新论坛页面,久违的头像应该出现了。
|
||||||
|
故障排除口诀:先通PHP,再看静态,权限是基础,规则顺序定乾坤。 希望这份文档能帮你彻底告别这个天坑!
|
||||||
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# Debian+Glances网页快捷键说明
|
||||||
|
# 1. 基础说明
|
||||||
|
Glances Web 界面(glances -w)绝大多数切换显隐的快捷键和终端 TUI 完全通用,在浏览器页面点击一下页面激活焦点后直接按键即可生效;q/ESC仅终端有效,Web 不会关闭服务。
|
||||||
|
按 h 可在 Web 里调出完整快捷键帮助面板。
|
||||||
|
|
||||||
|
# 2. 面板 / 模块显示 / 隐藏快捷键(Web 可用)
|
||||||
|
|
||||||
|
## 2.1 顶部总览视图切换
|
||||||
|
| 按键 | 作用 |
|
||||||
|
|------|------|
|
||||||
|
| 1 | 切换全局 CPU / 每个 CPU 核心独立柱状图 |
|
||||||
|
| 2 | 显示 / 隐藏左侧侧边栏模块区 |
|
||||||
|
| 3 | 显示 / 隐藏 QuickLook 极简总览头栏 |
|
||||||
|
| 4 | 切换紧凑 / 宽松总览布局 |
|
||||||
|
| 6 | GPU:单均值模式 / 多卡分开显示切换 |
|
||||||
|
| 9 | 黑白 / 彩色主题切换 |
|
||||||
|
|
||||||
|
## 2.2 硬件资源模块开关
|
||||||
|
| 按键 | 模块 |
|
||||||
|
|------|------|
|
||||||
|
| d | 磁盘 I/O 读写统计 显示 / 隐藏 |
|
||||||
|
| f | 文件系统挂载磁盘空间面板 |
|
||||||
|
| n | 网卡网络流量面板 |
|
||||||
|
| s | 硬件传感器(温度、电压) |
|
||||||
|
| y | 磁盘温度(SMART) |
|
||||||
|
| Q | IRQ 中断统计 |
|
||||||
|
| R | RAID 阵列状态 |
|
||||||
|
| W | WiFi 无线网卡 |
|
||||||
|
| P | 端口监听列表 |
|
||||||
|
| V | 虚拟机(Libvirt/VMS) |
|
||||||
|
| D | Docker 容器监控面板 |
|
||||||
|
| C | 云平台实例信息开关 |
|
||||||
|
|
||||||
|
## 2.3 进程、日志、图表控制
|
||||||
|
| 按键 | 功能 |
|
||||||
|
|------|------|
|
||||||
|
| z | 整体显示 / 隐藏全部进程列表 |
|
||||||
|
| S | 微小 Sparkline 实时曲线图开关 |
|
||||||
|
| l | 显示 / 隐藏警告告警日志 |
|
||||||
|
| w | 清空已结束警告消息 |
|
||||||
|
| x | 清空警告 + 严重告警消息 |
|
||||||
|
| / | 进程列表:短命令名 / 完整命令行切换 |
|
||||||
|
| ENTER | 弹出进程过滤正则输入框 |
|
||||||
|
| a | 一键全开所有插件模块 |
|
||||||
|
|
||||||
|
## 2.4 单位与排序
|
||||||
|
b:网络 I/O bits/sec ↔ bytes/sec 切换
|
||||||
|
c/m/p/i/t/u:切换进程排序依据(CPU / 内存 / 名称 / IO / 时间 / 累计网络)
|
||||||
|
|
||||||
|
# 3. Web 界面独有 & 差异点
|
||||||
|
q、Ctrl+C、ESC:Web 里只会取消焦点,不会停止 glances -w 服务进程;关闭监控服务需要在服务器终端执行 kill 或 Ctrl+C。
|
||||||
|
鼠标辅助:进程表头点击也能排序,右上角可手动折叠卡片面板。
|
||||||
|
持久化:按键切换只临时生效;开机固定隐藏模块需要改 /etc/glances/glances.conf 配置禁用对应插件。
|
||||||
|
快速上手步骤
|
||||||
|
启动 web:glances -w
|
||||||
|
浏览器打开 http://服务器IP:61208
|
||||||
|
点击页面空白处激活焦点
|
||||||
|
按 h 查看全部热键,按需按 1/d/n/s/D 等开关区块。
|
||||||
@@ -0,0 +1,321 @@
|
|||||||
|
# Nginx + Xray(Reliability)多域名共用443端口完美解决方案
|
||||||
|
|
||||||
|
为了更好的伪装,且本身有两个网站要使用,所以就弄了这么一个东西,最终就是两个网站和Xray都使用443端口,流量监测的时候代理的流量被伪装成了正常的TSL,没有问题,这个是基础功能。如果主动探测,代理域名,不是客户端访问引导到正常更新使用的博客上。
|
||||||
|
在这篇文章前,使用的Xray在前,使用Xray的回落机制+分流实现。不过会该方案有严重的串站问题。最后定了下面的方案,Nginx在前通过串流,原封不动的将代理域名的信息转给Xray。
|
||||||
|
|
||||||
|
## 一、需求背景与最终架构
|
||||||
|
### 1.1 原始需求
|
||||||
|
一台服务器(Debian 12 + Nginx 1.22.1 + PHP 8.2)
|
||||||
|
三个域名都使用443端口:
|
||||||
|
网站A域名:Discuz论坛(HTTPS)
|
||||||
|
网站B域名:WordPress博客(HTTPS)
|
||||||
|
代理域名:XRay代理(REALITY协议)
|
||||||
|
探测代理域名时能看到真实的博客内容(回落机制)
|
||||||
|
绝对不串站
|
||||||
|
|
||||||
|
### 1.2 最终架构(Nginx在前 + stream分流)
|
||||||
|
用户访问
|
||||||
|
↓
|
||||||
|
443端口 → Nginx(stream模块,读SNI不解密)
|
||||||
|
├─ SNI = 网站A域名 → 127.0.0.1:4431
|
||||||
|
├─ SNI = 网站B域名 → 127.0.0.1:4432
|
||||||
|
└─ SNI = 代理域名 → 127.0.0.1:8443
|
||||||
|
↓ ↓ ↓
|
||||||
|
Nginx http(4431) Nginx http(4432) Xray(8443)
|
||||||
|
处理论坛(HTTPS) 处理博客(HTTPS) 处理代理
|
||||||
|
回落指向博客端口(4432)
|
||||||
|
|
||||||
|
## 二、配置步骤详解
|
||||||
|
### 2.1 准备工作:SSL证书(Let's Encrypt)
|
||||||
|
#安装Certbot
|
||||||
|
apt update
|
||||||
|
apt install certbot python3-certbot-nginx -y
|
||||||
|
|
||||||
|
#申请证书(包含三个域名)
|
||||||
|
certbot --nginx -d 网站A域名 -d 网站B域名 -d 代理域名
|
||||||
|
|
||||||
|
#注意:如果已有其中一个域名的证书,选择 Expand 扩展域名
|
||||||
|
#证书路径:/etc/letsencrypt/live/代理域名/
|
||||||
|
|
||||||
|
### 2.2 备份原有配置(可选)
|
||||||
|
cp /etc/nginx/conf.d/网站A.conf /etc/nginx/conf.d/网站A.conf.bak
|
||||||
|
cp /etc/nginx/conf.d/网站B.conf /etc/nginx/conf.d/网站B.conf.bak
|
||||||
|
cp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.bak
|
||||||
|
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
|
||||||
|
|
||||||
|
### 2.3 修改Nginx主配置(添加stream模块)
|
||||||
|
编辑 /etc/nginx/nginx.conf,在文件最顶部(events块之前)添加:
|
||||||
|
```nginx
|
||||||
|
stream {
|
||||||
|
#根据SNI域名转发到不同后端
|
||||||
|
map $ssl_preread_server_name $backend {
|
||||||
|
网站A域名 127.0.0.1:4431;
|
||||||
|
网站B域名 127.0.0.1:4432;
|
||||||
|
代理域名 127.0.0.1:8443;
|
||||||
|
default 127.0.0.1:4432; #默认看博客
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 reuseport;
|
||||||
|
listen [::]:443 reuseport;
|
||||||
|
|
||||||
|
ssl_preread on;
|
||||||
|
proxy_pass $backend;
|
||||||
|
|
||||||
|
#超时设置
|
||||||
|
proxy_connect_timeout 30s;
|
||||||
|
proxy_timeout 30s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#下面是原有的 events { ... } 和 http { ... }
|
||||||
|
events {
|
||||||
|
worker_connections 768;
|
||||||
|
#...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4 配置论坛(网站A)
|
||||||
|
编辑 /etc/nginx/conf.d/网站A.conf:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:4431 ssl;
|
||||||
|
server_name 网站A域名;
|
||||||
|
|
||||||
|
#SSL证书
|
||||||
|
ssl_certificate /etc/letsencrypt/live/代理域名/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/代理域名/privkey.pem;
|
||||||
|
|
||||||
|
#SSL配置
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
|
||||||
|
root /var/www/网站A;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
|
||||||
|
fastcgi_param HTTPS on;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public, no-transform";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.5 配置博客(网站B)
|
||||||
|
编辑 /etc/nginx/conf.d/网站B.conf:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:4432 ssl;
|
||||||
|
server_name 网站B域名;
|
||||||
|
|
||||||
|
#SSL证书(和论坛用同一个)
|
||||||
|
ssl_certificate /etc/letsencrypt/live/代理域名/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/代理域名/privkey.pem;
|
||||||
|
|
||||||
|
#SSL配置
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
|
||||||
|
ssl_prefer_server_ciphers off;
|
||||||
|
|
||||||
|
root /var/www/wordpress;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
|
||||||
|
fastcgi_param HTTPS on;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
|
client_max_body_size 128M;
|
||||||
|
|
||||||
|
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public, no-transform";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.6 配置XRay
|
||||||
|
编辑 /usr/local/etc/xray/config.json:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"loglevel": "warning"
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"port": 8443,
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [
|
||||||
|
{
|
||||||
|
"id": "你的uuid-1",
|
||||||
|
"flow": "xtls-rprx-vision"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "你的uuid-2",
|
||||||
|
"flow": "xtls-rprx-vision"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"decryption": "none",
|
||||||
|
"fallbacks": []
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "raw",
|
||||||
|
"security": "reality",
|
||||||
|
"realitySettings": {
|
||||||
|
"dest": "127.0.0.1:4432", // 回落指向博客端口
|
||||||
|
"serverNames": [
|
||||||
|
"代理域名"
|
||||||
|
],
|
||||||
|
"privateKey": "你的私钥",
|
||||||
|
"shortIds": [
|
||||||
|
"你的shortId-1",
|
||||||
|
"你的shortId-2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sniffing": {
|
||||||
|
"enabled": true,
|
||||||
|
"destOverride": ["http", "tls"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "freedom",
|
||||||
|
"tag": "direct"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": "blackhole",
|
||||||
|
"tag": "block"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.7 重载服务
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
xray -test -config /usr/local/etc/xray/config.json
|
||||||
|
systemctl restart xray
|
||||||
|
|
||||||
|
## 三、踩坑记录与解决方案
|
||||||
|
### 坑1:证书申请时提示找不到代理域名的server_name
|
||||||
|
现象:
|
||||||
|
text
|
||||||
|
Could not automatically find a matching server block for 代理域名
|
||||||
|
原因:代理域名由XRay处理,Nginx中没有对应的server块
|
||||||
|
解决方案:
|
||||||
|
bash
|
||||||
|
#临时创建一个代理域名的Nginx配置
|
||||||
|
```
|
||||||
|
cat > /etc/nginx/conf.d/代理域名.temp.conf << EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name 代理域名;
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
certbot install --cert-name 代理域名
|
||||||
|
rm /etc/nginx/conf.d/代理域名.temp.conf
|
||||||
|
|
||||||
|
### 坑2:XRay回落配置错误导致循环
|
||||||
|
现象:curl测试代理域名时报错 SSL_ERROR_SYSCALL
|
||||||
|
原因:XRay配置中dest写成了域名网站B域名:443,导致流量循环
|
||||||
|
解决方案:改为直接指向博客的本地端口
|
||||||
|
json
|
||||||
|
"dest": "127.0.0.1:4432"
|
||||||
|
|
||||||
|
### 坑3:浏览器测试时串站(先打开论坛,后面全变论坛)
|
||||||
|
现象:同一个浏览器中,先访问网站A,再开新标签页访问网站B,显示论坛内容
|
||||||
|
原因:HTTP/2的连接合并(coalescing)特性,三个域名共用同一IP和证书,浏览器复用连接
|
||||||
|
解决方案:在网站配置中禁用HTTP/2
|
||||||
|
nginx
|
||||||
|
#将 listen 127.0.0.1:4431 ssl http2; 改为
|
||||||
|
listen 127.0.0.1:4431 ssl;
|
||||||
|
验证:禁用后感觉不到速度差异,问题彻底解决
|
||||||
|
|
||||||
|
### 坑4:论坛友情链接跳转也串站
|
||||||
|
现象:从论坛点击友情链接到博客,显示论坛内容
|
||||||
|
原因:同坑3,同一标签页内跳转复用了连接
|
||||||
|
解决方案:同坑3,禁用HTTP/2后解决
|
||||||
|
|
||||||
|
### 坑5:reuseport参数导致分流异常(偶发)
|
||||||
|
现象:偶尔出现分流错误,重启Nginx后恢复
|
||||||
|
原因:某些内核版本中reuseport与ssl_preread共用可能异常
|
||||||
|
解决方案:去掉reuseport参数(本案例最终保留,但遇到问题时可去掉)
|
||||||
|
|
||||||
|
## 四、验证命令汇总
|
||||||
|
### 4.1 验证Nginx配置
|
||||||
|
nginx -t
|
||||||
|
nginx -T | grep -A 20 -B 5 "stream {"
|
||||||
|
|
||||||
|
### 4.2 验证stream分流
|
||||||
|
#测试论坛(每次新建连接)
|
||||||
|
curl -k --no-keepalive https://网站A域名 --resolve 网站A域名:443:127.0.0.1 | grep -o "<title>.*</title>"
|
||||||
|
|
||||||
|
#测试博客
|
||||||
|
curl -k --no-keepalive https://网站B域名 --resolve 网站B域名:443:127.0.0.1 | grep -o "<title>.*</title>"
|
||||||
|
|
||||||
|
#测试代理域名(应返回博客内容)
|
||||||
|
curl -k --no-keepalive https://代理域名 --resolve 代理域名:443:127.0.0.1 | grep -o "<title>.*</title>"
|
||||||
|
|
||||||
|
### 4.3 验证XRay
|
||||||
|
systemctl status xray
|
||||||
|
ss -tlnp | grep 8443
|
||||||
|
xray -test -config /usr/local/etc/xray/config.json
|
||||||
|
|
||||||
|
### 4.4 验证证书自动续期
|
||||||
|
bash
|
||||||
|
systemctl list-timers | grep certbot
|
||||||
|
certbot renew --dry-run
|
||||||
|
|
||||||
|
## 五、客户端配置(XRay)
|
||||||
|
##5.1 连接信息
|
||||||
|
参数 值
|
||||||
|
地址 代理域名
|
||||||
|
端口 443
|
||||||
|
协议 VLESS
|
||||||
|
UUID 你的uuid
|
||||||
|
Flow xtls-rprx-vision
|
||||||
|
加密 none
|
||||||
|
安全 reality
|
||||||
|
serverName 代理域名
|
||||||
|
|
||||||
|
publicKey 你的公钥
|
||||||
|
shortId 你的shortId
|
||||||
|
dest 网站B域名:443(客户端不需要配置,这是服务端回落目标)
|
||||||
|
|
||||||
|
## 六、最终状态确认
|
||||||
|
组件 状态 验证方式
|
||||||
|
论坛 HTTPS ✅ 正常 浏览器访问 https://网站A域名
|
||||||
|
博客 HTTPS ✅ 正常 浏览器访问 https://网站B域名
|
||||||
|
代理域名回落 ✅ 正常 浏览器访问 https://代理域名 看到博客
|
||||||
|
XRay代理 ✅ 正常 客户端连接测试
|
||||||
|
证书续期 ✅ 自动 systemctl list-timers | grep certbot
|
||||||
|
串站问题 ✅ 解决 不同浏览器同时访问三个域名均正确
|
||||||
|
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
# Openwrt系统盘扩容方法
|
||||||
|
## 1 条件和定义
|
||||||
|
Openwrt版本:24.10.5(据说是目前最新的稳定版)
|
||||||
|
金士顿NVME M2 512G硬盘:在系统中的名字为nvme0n1(文中都以这个出现,请自行换成你的硬盘名字)
|
||||||
|
U盘:大于1G
|
||||||
|
|
||||||
|
## 2 背景说明
|
||||||
|
最近有一个需求需要用到软路由,之前用iStoreOS,其实也是基于Openwrt做的,你可以认为就像小米的MIUI一样,基于安卓做的。我写文章前又装了一边,发现开机跑的代码都差不多。小白或不想折腾的建议去看看iStoreOS,真心话好用的多。Openwrt像以前的安卓,想折腾的来。iStoreOS像苹果,没太多折腾的。去iStoreOS的网站你会发现他的版本和Openwrt是一致的。所以Openwrt有的,iStoreOS也有。好了不扯闲篇直入主题。
|
||||||
|
|
||||||
|
## 3 吐槽
|
||||||
|
其实这个过程是自己看了网上的一些教程,我说真的,既然要写就好好写,写个半吊子,让人看的云里雾里的。最后没办法求助Deepseek和豆包,结果这两货每次胸脯拍的叭叭响,结果全是问题。最后好在我自己还是搞定了,下面就说一下关于Openwrt扩容的问题。
|
||||||
|
|
||||||
|
## 4 大前提
|
||||||
|
大前提就是不要试图在系统运行中的硬盘上扩容,什么意思呢?比如你有一块512G的硬盘,但是安装完后实际只有126MB被使用,剩下的都浪费了。那么这会你要扩容就两个方向,第一扩展系统盘,第二扩展为数据盘。扩展数据盘相对简单一点,虽然我没做,但是你可以想象,你在扩容的过程没有操作系统正在使用的部分,这样就像我刚开始说的,并没有在系统运行的硬盘上扩容。这话有点怪,看了下面就知道了。另一种就是扩展系统盘,这下好了,就是要在正在运行的分区上进行操作,一个字难。就这个破事儿我折腾了整整一天。其实道理也很简单,你要在windows的C进行操作也很难,你可以试试,只要你想操作就会提示你进PE去干,为什么呢——因为系统盘空闲了。
|
||||||
|
|
||||||
|
## 5 操作步骤
|
||||||
|
首先将要安装系统的硬盘的分区全部删除后再进来安装,这个步骤怎么弄都可以,PE、外置U盘,反正方法多的很,这里就不赘述了。
|
||||||
|
|
||||||
|
### 5.1 准备工作
|
||||||
|
大于1T的U盘,去Openwrt的官网或者阿里镜像站下载你需要的系统文件,具体下载哪个看你自己。
|
||||||
|
下载完后,使用Rufus将镜像装在U盘。这里注意一下,我被坑了一下,就是刚开始都是对的,直接烧下载的文件,就是后缀名为.gz的原始下载文件。我搞的时候后面估计是整晕了跑去解压缩成img烧写,然后就无法启动了。
|
||||||
|
|
||||||
|
### 5.2 安装系统
|
||||||
|
#使用制作好的U盘,在bios中设置U盘启动,进入命令行后,这会可以先装系统,也可以先改IP从而使用ssh操作。建议先改IP,用ssh操作,毕竟可以粘贴复制,比自己手敲命令行快多了。
|
||||||
|
|
||||||
|
#配置网络
|
||||||
|
#查看所有网络接口
|
||||||
|
ip addr show
|
||||||
|
|
||||||
|
#或者用OpenWrt专用的查看命令
|
||||||
|
uci show network
|
||||||
|
|
||||||
|
#查看当前LAN口的配置
|
||||||
|
uci show network.lan
|
||||||
|
|
||||||
|
#修改IP地址为局域网的网段(假设是192.168.8.0/24)
|
||||||
|
uci set network.lan.ipaddr='192.168.8.250' #改成你想要的固定IP
|
||||||
|
|
||||||
|
#修改子网掩码(一般就是255.255.255.0)
|
||||||
|
uci set network.lan.netmask='255.255.255.0'
|
||||||
|
|
||||||
|
#设置网关(你公司主路由的IP,一般是192.168.8.1)
|
||||||
|
uci set network.lan.gateway='192.168.8.1'
|
||||||
|
|
||||||
|
#添加DNS服务器(可选,但推荐)
|
||||||
|
uci set network.lan.dns='114.114.114.114 223.5.5.5'
|
||||||
|
|
||||||
|
#提交修改
|
||||||
|
uci commit network
|
||||||
|
#重启网络
|
||||||
|
/etc/init.d/network restart
|
||||||
|
|
||||||
|
#现在你就可以使用ssh,连接到系统了。
|
||||||
|
|
||||||
|
#通过下面命令看看硬盘分区情况,其实就是看看你的硬盘叫啥
|
||||||
|
cat /proc/partitions
|
||||||
|
|
||||||
|
#安装系统到硬盘
|
||||||
|
dd if=/dev/sdb of=/dev/nvme0n1 bs=4M
|
||||||
|
#sdb是现在U盘系统名字,nvme0n1是要安装的硬盘名字,通过前面命令可以看到。这个命令下去是没有进度条的,时间根据你的U盘决定,最多一分钟,你看要是还没回到命令行就ctrl+c就可以返回了。
|
||||||
|
|
||||||
|
#同步一下
|
||||||
|
sync
|
||||||
|
|
||||||
|
#这里千万不要重启了,重启了更难搞,其实根据后面的操作,感觉重启了还是在U盘系统还是可以的,但是一旦是进了硬盘的系统太难太难
|
||||||
|
#看看分区硬盘是否正常(结果肯定不正常)
|
||||||
|
df -h
|
||||||
|
#可以看到你的硬盘只有126MB了,接下来就要扩容了。
|
||||||
|
|
||||||
|
### 5.3 硬盘扩容
|
||||||
|
#这里的扩容就是把剩余的硬盘空间扩展到系统盘上
|
||||||
|
#安装工具
|
||||||
|
opkg update && opkg install parted resize2fs
|
||||||
|
|
||||||
|
#开始扩容,输入以下命令:
|
||||||
|
parted /dev/nvme0n1 resizepart 2 100%
|
||||||
|
#这里会出现一个Error: The backup GPT table is corrupt, but the primary appears OK, so that will de used
|
||||||
|
OK/Cancel?
|
||||||
|
#输入ok回车
|
||||||
|
#接着又会出现:Not all of the space available to /dev/nvme0n1 appears to be used, you can fix the GPT to use all of the space (an extra 7897897897)
|
||||||
|
Fix/Ignore?
|
||||||
|
#输入fix回车
|
||||||
|
#接下来又来一个Partition number?
|
||||||
|
#这里输入2回车(其实就是第二个硬盘分区,也就是系统盘)
|
||||||
|
#马上又是End?[126MB]
|
||||||
|
#这里输入100%回车(第一次我啥也没输入就回车,然后就悲剧了)
|
||||||
|
#最后输入quit可以退出,不过我这边是直接退出的。
|
||||||
|
|
||||||
|
#在线扩容文件系统(关键一步)
|
||||||
|
#输入以下命令
|
||||||
|
resize2fs /dev/nvme0n1p2
|
||||||
|
#这里会有一个提示“Please run 'e2fsck -f /dev/nvme0n1p2' first.”就是让你先检查以下,没什么好说的,照做:
|
||||||
|
e2fsck -f /dev/nvme0n1p2
|
||||||
|
#中间会有三个是否修复的提示,都输入Y回车。
|
||||||
|
Free blocks count wrong (18634, counted=18641).
|
||||||
|
Fix<y>? yes
|
||||||
|
Free inodes count wrong (5075, counted=5080).
|
||||||
|
Fix<y>? yes
|
||||||
|
Padding at end of inode bitmap is not set. Fix<y>? yes
|
||||||
|
|
||||||
|
#接着再重新扩展(所以可以进行e2fsck)
|
||||||
|
resize2fs /dev/nvme0n1p2
|
||||||
|
#第二次复盘的时候是下面的提示(第一次是什么忘记了)
|
||||||
|
root@OpenWrt:~#resize2fs /dev/nvme0n1p2
|
||||||
|
resize2fs 1.47.0 (5-Feb-2023)
|
||||||
|
Resizing the filesystem on /dev/nvme0n1p2 to 122092481 (4k) blocks.
|
||||||
|
The filesystem on /dev/nvme0n1p2 is now 122092481 (4k) blocks long.
|
||||||
|
#这个提示实际就是已经扩展到465G的样子,其实就已经成功了。不过由于第一次上面输入100%那个地方我输入回车了,也就是以126MB处结束,说白了就是一点都没动,所以失败了。
|
||||||
|
#接着用df -h查看,还是104M(不用管?不是,因为你看到的还是U盘的)
|
||||||
|
|
||||||
|
#查看是否扩容成功
|
||||||
|
#输入
|
||||||
|
parted /dev/nvme0n1
|
||||||
|
#输入print,看看情况(下面是第一次的结果)
|
||||||
|
Number Start End Size File system Name Flags
|
||||||
|
3 17.4kB 262kB 245kB bios_grub
|
||||||
|
1 262kB 17.0MB 16.8MB fat16 legacy_boot
|
||||||
|
2 17.0MB 126MB 109MB ext4
|
||||||
|
#这里17.0MB是个关键数字,意思是从17.0MB之后就是你要扩展的分区的开始位置。
|
||||||
|
#下面是第二次复盘的结果
|
||||||
|
Number Start End Size File system Name Flags
|
||||||
|
3 17.4kB 262kB 245kB bios_grub
|
||||||
|
1 262kB 17.0MB 16.8MB fat16 legacy_boot
|
||||||
|
2 17.0MB 500GB 500GB ext4
|
||||||
|
#这个结果是对的,所以下面的删除旧分区,新建新分区可以不用了,直接到通知内核更新分区表(第二次测试直接到了#验证分区大小已更新lsblk /dev/nvme0n1p2)
|
||||||
|
而第一次搞得就是还得再来一次,结果又引出得别得问题,下面细说。
|
||||||
|
|
||||||
|
#下面是针对第一次扩容失败后的操作
|
||||||
|
#删除旧分区 2(放心,数据不会丢,只是重划边界)
|
||||||
|
(parted) rm 2
|
||||||
|
|
||||||
|
#新建根分区 2(占满剩余所有空间)
|
||||||
|
mkpart primary ext4 17.0MB 100%
|
||||||
|
#17.0MB 是你当前 EFI 分区的结束位置(从上面 print 里抄)
|
||||||
|
#100% 表示用满剩下所有磁盘空间
|
||||||
|
#接下来会有一个警告,如下:
|
||||||
|
Warning: The resulting partition is not properly aligned for best performance: 33280s % 2048s != 0s
|
||||||
|
Ignore/Cancel? Ignore
|
||||||
|
#选择Ignore
|
||||||
|
|
||||||
|
#退出
|
||||||
|
(parted) quit
|
||||||
|
#然后出现了下面的提示,意思就是让你刷新以下
|
||||||
|
Information: You may need to update /etc/fstab.
|
||||||
|
|
||||||
|
#通知内核更新分区表
|
||||||
|
partprobe /dev/nvme0n1
|
||||||
|
|
||||||
|
#验证分区大小已更新
|
||||||
|
lsblk /dev/nvme0n1p2
|
||||||
|
#这里会提示没有lsblk这个命令,用opkg install lsblk安装一下,安装完后再用上面的命令看看
|
||||||
|
#这里应该显示 465G 了。
|
||||||
|
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||||
|
nvme0n1p2 259:2 0 465.7G 0 part
|
||||||
|
|
||||||
|
#上面看着对了之后就可以继续扩容文件系统
|
||||||
|
resize2fs /dev/nvme0n1p2
|
||||||
|
|
||||||
|
#最终验证
|
||||||
|
df -h
|
||||||
|
#结果如下:(这个是废话,因为还在U盘系统里面)
|
||||||
|
Filesystem Size Used Available Use% Mounted on
|
||||||
|
/dev/root 98.3M 27.5M 68.7M 29% /
|
||||||
|
tmpfs 3.8G 1.2M 3.8G 0% /tmp
|
||||||
|
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
|
||||||
|
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
|
||||||
|
tmpfs 512.0K 0 512.0K 0% /dev
|
||||||
|
|
||||||
|
#下面部分才能真正验证,看到下面结果就是好了
|
||||||
|
root@OpenWrt:~#mkdir /mnt/nvme
|
||||||
|
root@OpenWrt:~#mount /dev/nvme0n1p2 /mnt/nvme
|
||||||
|
root@OpenWrt:~#df -h /mnt/nvme
|
||||||
|
Filesystem Size Used Available Use% Mounted on
|
||||||
|
/dev/nvme0n1p2 459.8G 25.5M 459.8G 0% /mnt/nvme
|
||||||
|
|
||||||
|
#重启,记得拔掉U盘,我第一次就是忘记拔掉,回来看还是不对
|
||||||
|
Reboot
|
||||||
|
|
||||||
|
#再次进入系统之后使用df -h查看就对了。
|
||||||
|
|
||||||
|
#以下内容是因为第一次使用“删除旧分区 2 (parted) rm 2”这一块的操作导致了grub.cfg不对引起的。第二次复盘的时候没有出现,直接进系统了。
|
||||||
|
|
||||||
|
#第一次看到扩容的地方正确了,开心啊,就reboot重启了,结果不出意外的又出意外了,重启进不了系统。但是可以看到grub菜单,并且还跑了一会代码,那么就意味着引导程序没有问题,有问题的是引导的内容不对。
|
||||||
|
这里要感谢自己前端时间搞得Windows时光机,有兴趣可以在我的博客上看到,一台电脑从Win98到Win11,一共装了十几个系统,最后的引导管理就是用Grub4Dos来做,虽然不是Openwrt用的Grub2,但是很接近的。所以就是要改这个Grub2的配置文件。的这里推荐最简单的方案,进PE,在PE里面改。
|
||||||
|
|
||||||
|
#用记事本打开 grub.cfg(这个东西路径就在16MB那个盘上,忘记是在boot文件夹还是efi文件夹了,找一下吧,这文件是唯一的,好找)。
|
||||||
|
看到root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx或者root=/dev/sda2这种的时候直接改成以下内容:
|
||||||
|
root=/dev/nvme0n1p2(这个根据你的硬盘描述来)
|
||||||
|
#改完之后保存,重启
|
||||||
|
#我用的微PE,然后用DG将文件拷贝出来修改,结果拷贝回去说我这个版本好像基础版不得行。当时郁闷的很。不过仔细找了一下 有一个叫显示分区的工具,打开,然后Linux的硬盘分区也出来了。嗯,后面大大方方的复制替换就可以了。
|
||||||
|
|
||||||
|
@重启之后
|
||||||
|
df -h
|
||||||
|
成功了!
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
# REALITY 从零到一极简配置手册
|
||||||
|
适用场景:VLESS + REALITY + 无回落
|
||||||
|
服务器:Debian12
|
||||||
|
|
||||||
|
## 第一步:安装 Xray
|
||||||
|
方法1:
|
||||||
|
curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh | bash -s install
|
||||||
|
|
||||||
|
方法2:
|
||||||
|
#下载脚本
|
||||||
|
curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh -o install.sh
|
||||||
|
#添加执行权限
|
||||||
|
chmod +x install.sh
|
||||||
|
#执行安装
|
||||||
|
./install.sh install
|
||||||
|
|
||||||
|
## 第二步:生成参数
|
||||||
|
#生成密钥对(只需一次)
|
||||||
|
xray x25519
|
||||||
|
#记录 Private key 和 Public key
|
||||||
|
|
||||||
|
#生成 UUID(每人一个)
|
||||||
|
xray uuid
|
||||||
|
|
||||||
|
#生成 shortId(每人一个)
|
||||||
|
openssl rand -hex 8
|
||||||
|
|
||||||
|
## 第三步:配置 Xray
|
||||||
|
编辑 /usr/local/etc/xray/config.json:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"loglevel": "warning"
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"port": 443,
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [
|
||||||
|
{ "id": "你的UUID-1", "flow": "xtls-rprx-vision" },
|
||||||
|
{ "id": "你的UUID-2", "flow": "xtls-rprx-vision" }
|
||||||
|
],
|
||||||
|
"decryption": "none"
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "tcp",
|
||||||
|
"security": "reality",
|
||||||
|
"realitySettings": {
|
||||||
|
"dest": "www.bilibili.com:443",
|
||||||
|
"serverNames": [
|
||||||
|
"www.bilibili.com",
|
||||||
|
"tyo.hayashiei.top"
|
||||||
|
],
|
||||||
|
"privateKey": "你的Private Key",
|
||||||
|
"shortIds": [
|
||||||
|
"你的shortId-1",
|
||||||
|
"你的shortId-2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "freedom",
|
||||||
|
"tag": "direct"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
关键点:
|
||||||
|
• dest:伪装目标
|
||||||
|
• serverNames:必须同时包含伪装目标和你自己的域名
|
||||||
|
• shortIds 和 clients 数量对应,但无需一一配对
|
||||||
|
|
||||||
|
## 第四步:启动 Xray
|
||||||
|
systemctl enable xray
|
||||||
|
systemctl restart xray
|
||||||
|
systemctl status xray
|
||||||
|
|
||||||
|
## 第五步:客户端链接
|
||||||
|
将下面链接中的占位符替换成你的信息:
|
||||||
|
vless://你的UUID@你的服务器IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=tyo.hayashiei.top&fp=chrome&pbk=你的PublicKey&sid=你的shortId&type=tcp&headerType=none#REALITY_节点名
|
||||||
|
导入方式:
|
||||||
|
小火箭/v2rayN/Hiddify:复制链接 → 打开 App → 自动弹窗导入
|
||||||
|
手动配置:按表格填好类型、地址、端口、UUID、流控、传输、安全、SNI、公钥、shortId
|
||||||
|
|
||||||
|
## 第六步:享受成果
|
||||||
|
手机电脑同时在线 ✅
|
||||||
|
朋友一键导入 ✅
|
||||||
|
GFW 看到你在刷 B站 ✅
|
||||||
|
不用证书、不用续期、不用回落 ✅
|
||||||
|
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
# Trojan完整安装教程
|
||||||
|
## 基本信息
|
||||||
|
你的信息
|
||||||
|
域名:osaka.hayashiei.top
|
||||||
|
IP:64.176.55.223
|
||||||
|
密码:Hayashi2026
|
||||||
|
端口:443
|
||||||
|
|
||||||
|
## 一、重装系统后第一步:放行端口(必须最先做)
|
||||||
|
运行
|
||||||
|
ufw allow 80/tcp
|
||||||
|
ufw allow 443/tcp
|
||||||
|
ufw reload
|
||||||
|
|
||||||
|
## 二、申请 SSL 证书(必须放行端口后再做)
|
||||||
|
运行
|
||||||
|
apt update && apt install certbot -y
|
||||||
|
|
||||||
|
运行
|
||||||
|
certbot certonly --standalone -d osaka.hayashiei.top --email test@example.com --agree-tos --no-eff-email
|
||||||
|
出现成功提示即可继续。
|
||||||
|
|
||||||
|
## 三、安装 Nginx(伪装网站用)
|
||||||
|
运行
|
||||||
|
apt install nginx -y
|
||||||
|
systemctl stop nginx
|
||||||
|
|
||||||
|
## 四、安装 Trojan
|
||||||
|
运行
|
||||||
|
bash <(curl -sL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)
|
||||||
|
|
||||||
|
##五、写入最终配置
|
||||||
|
运行
|
||||||
|
```
|
||||||
|
cat > /usr/local/etc/trojan/config.json << 'EOF'
|
||||||
|
{
|
||||||
|
"run_type": "server",
|
||||||
|
"local_addr": "0.0.0.0",
|
||||||
|
"local_port": 443,
|
||||||
|
"remote_addr": "127.0.0.1",
|
||||||
|
"remote_port": 80,
|
||||||
|
"password": [
|
||||||
|
"Hayashi2026"
|
||||||
|
],
|
||||||
|
"ssl": {
|
||||||
|
"cert": "/etc/letsencrypt/live/osaka.hayashiei.top/fullchain.pem",
|
||||||
|
"key": "/etc/letsencrypt/live/osaka.hayashiei.top/privkey.pem",
|
||||||
|
"alpn": [
|
||||||
|
"h2",
|
||||||
|
"http/1.1"
|
||||||
|
],
|
||||||
|
"reuse_session": true,
|
||||||
|
"session_ticket": false
|
||||||
|
},
|
||||||
|
"tcp": {
|
||||||
|
"no_delay": true,
|
||||||
|
"keep_alive": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## 六、启动 Trojan
|
||||||
|
运行
|
||||||
|
systemctl enable trojan
|
||||||
|
systemctl restart trojan
|
||||||
|
|
||||||
|
## 七、客户端连接配置
|
||||||
|
连接信息
|
||||||
|
类型:Trojan
|
||||||
|
服务器:osaka.hayashiei.top
|
||||||
|
端口:443
|
||||||
|
密码:Hayashi2026
|
||||||
|
TLS:开启
|
||||||
|
跳过证书校验:关闭
|
||||||
|
支持的客户端
|
||||||
|
Windows:Trojan-Qt5
|
||||||
|
Android:Igniter
|
||||||
|
iOS:Shadowrocket、Trojan
|
||||||
|
|
||||||
|
## 八、验证是否运行成功
|
||||||
|
运行
|
||||||
|
systemctl status trojan
|
||||||
|
出现 active (running) 就是成功。
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
# WordPress网站迁移+Xray代理部署
|
||||||
|
整个流程分为两大阶段:
|
||||||
|
第一阶段:网站迁移 (从阿里云到腾讯云)
|
||||||
|
第二阶段:高级部署 (在同一台服务器上,为博客网站和Xray代理配置双域名分流)
|
||||||
|
|
||||||
|
## 第一阶段:网站迁移 (阿里云 → 腾讯云)
|
||||||
|
目标: 将阿里云上的 WordPress 博客(域名 blog.hayashiei.top)完整迁移至腾讯云新服务器(新域名 jp.hayashiei.top)。
|
||||||
|
|
||||||
|
### 步骤 1:在阿里云源服务器上进行完整备份
|
||||||
|
#### (1)创建备份目录并定位网站文件
|
||||||
|
mkdir -p ~/blog-backup
|
||||||
|
cd /var/www
|
||||||
|
(根据你的实际情况,你的博客文件在 /var/www/wordpress)
|
||||||
|
#### (2)打包网站文件
|
||||||
|
bash
|
||||||
|
tar -czvf ~/blog-backup/wordpress_files.tar.gz wordpress/
|
||||||
|
#### (3)备份数据库
|
||||||
|
先找出 WordPress 使用的数据库名:
|
||||||
|
grep DB_NAME /var/www/wordpress/wp-config.php
|
||||||
|
导出数据库(假设数据库名为 wp_tyo):
|
||||||
|
mysqldump -u root -p wp_tyo > ~/blog-backup/wp_tyo.sql
|
||||||
|
#### (4)备份 Nginx 配置文件
|
||||||
|
cp /etc/nginx/conf.d/blog.conf ~/blog-backup/
|
||||||
|
#### (5)打包所有备份文件
|
||||||
|
cd ~
|
||||||
|
tar -czvf blog_hayashiei_backup.tar.gz blog-backup/
|
||||||
|
|
||||||
|
### 步骤 2:将备份包传输到腾讯云目标服务器
|
||||||
|
在阿里云服务器上执行(替换 你的腾讯云IP):
|
||||||
|
scp ~/blog_hayashiei_backup.tar.gz root@你的腾讯云IP:~/
|
||||||
|
|
||||||
|
### 步骤 3:在腾讯云目标服务器上恢复网站
|
||||||
|
#### (1)登录腾讯云服务器并解压备份包
|
||||||
|
ssh root@你的腾讯云IP
|
||||||
|
tar -xzvf blog_hayashiei_backup.tar.gz
|
||||||
|
cd blog-backup
|
||||||
|
#### (2)安装与源服务器一致的环境 (Nginx 1.22, PHP 8.2, MariaDB)
|
||||||
|
apt update
|
||||||
|
apt install -y nginx php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip mariadb-server
|
||||||
|
#### (3)恢复网站文件
|
||||||
|
mkdir -p /var/www
|
||||||
|
tar -xzvf wordpress_files.tar.gz -C /var/www/
|
||||||
|
#### (4)设置正确的文件权限
|
||||||
|
chown -R www-data:www-data /var/www/wordpress/
|
||||||
|
find /var/www/wordpress/ -type d -exec chmod 755 {} \;
|
||||||
|
find /var/www/wordpress/ -type f -exec chmod 644 {} \;
|
||||||
|
#### (5)恢复数据库
|
||||||
|
从 wp-config.php 中提取数据库信息:
|
||||||
|
grep -E "DB_NAME|DB_USER|DB_PASSWORD" /var/www/wordpress/wp-config.php
|
||||||
|
根据提取的信息,在 MariaDB 中创建相同的数据库和用户(以下为示例):
|
||||||
|
```
|
||||||
|
sql
|
||||||
|
mysql -u root -p
|
||||||
|
CREATE DATABASE wp_tyo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER 'wp_tyo'@'localhost' IDENTIFIED BY '你的密码';
|
||||||
|
GRANT ALL PRIVILEGES ON wp_tyo.* TO 'wp_tyo'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EXIT;
|
||||||
|
```
|
||||||
|
导入数据:
|
||||||
|
mysql -u root -p wp_tyo < wp_tyo.sql
|
||||||
|
#### (6)配置 Nginx 以使用新域名 jp.hayashiei.top
|
||||||
|
创建新的 Nginx 配置文件 /etc/nginx/conf.d/blog.conf,内容如下:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name jp.hayashiei.top;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name jp.hayashiei.top;
|
||||||
|
|
||||||
|
root /var/www/wordpress;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/jp.hayashiei.top/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/jp.hayashiei.top/privkey.pem;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### (7)申请 SSL 证书
|
||||||
|
apt install -y certbot python3-certbot-nginx
|
||||||
|
certbot --nginx -d jp.hayashiei.top
|
||||||
|
#### (8)修改 WordPress 配置中的域名
|
||||||
|
编辑 /var/www/wordpress/wp-config.php,将 WP_HOME 和 WP_SITEURL 改为新域名(如果存在):
|
||||||
|
php
|
||||||
|
define('WP_HOME', 'https://jp.hayashiei.top');
|
||||||
|
define('WP_SITEURL', 'https://jp.hayashiei.top');
|
||||||
|
#### (9)重启服务并测试
|
||||||
|
systemctl restart nginx php8.2-fpm
|
||||||
|
curl -k https://jp.hayashiei.top
|
||||||
|
此时,你应该能看到博客网站的内容。至此,网站迁移完成。
|
||||||
|
|
||||||
|
## 第二阶段:高级部署 (配置双域名分流:博客 + Xray)
|
||||||
|
目标: 在同一台腾讯云服务器上,让 jp.hayashiei.top 继续作为博客网站,同时新增一个域名 jpx.hayashiei.top 作为Xray代理入口,Nginx 在前端根据域名进行分流。
|
||||||
|
### 步骤 1:修改博客 Nginx 配置 (监听本地端口)
|
||||||
|
为了让 Nginx 的 stream 模块接管公网的 443 端口,我们需要将博客的配置改为只监听本地。
|
||||||
|
#### (1)编辑博客配置文件 /etc/nginx/conf.d/blog.conf,将 listen 指令修改为:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:8443 ssl http2;
|
||||||
|
listen [::1]:8443 ssl http2;
|
||||||
|
server_name jp.hayashiei.top;
|
||||||
|
#... 其他配置(包括 SSL 证书路径)保持不变 ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
(关键:删除了 listen 443 ssl;,改为只监听本地的 8443 端口)
|
||||||
|
|
||||||
|
### 步骤 2:配置 Nginx Stream 模块进行四层分流
|
||||||
|
#### (1)编辑主配置文件 /etc/nginx/nginx.conf
|
||||||
|
在 http 块之前添加 stream 配置。
|
||||||
|
(如果你的 nginx.conf 中没有 stream 模块的加载指令,请确保它已启用,例如通过 include /etc/nginx/modules-enabled/*.conf;)
|
||||||
|
在 events 块之后、http 块之前,加入以下 stream 配置:
|
||||||
|
```nginx
|
||||||
|
stream {
|
||||||
|
#根据 TLS 握手时的 SNI 域名决定后端服务器
|
||||||
|
map $ssl_preread_server_name $backend {
|
||||||
|
jp.hayashiei.top 127.0.0.1:8443; #博客网站
|
||||||
|
jpx.hayashiei.top 127.0.0.1:1443; #Xray 代理
|
||||||
|
default 127.0.0.1:8443; #默认走博客
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 reuseport;
|
||||||
|
listen [::]:443 reuseport;
|
||||||
|
ssl_preread on; #必须开启,才能读取 SNI 信息
|
||||||
|
proxy_pass $backend; #根据 map 的结果进行转发
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
#### (2)测试配置并重启 Nginx
|
||||||
|
nginx -t
|
||||||
|
systemctl restart nginx
|
||||||
|
### 步骤 3:配置 Xray (监听本地端口,使用 Reality 协议)
|
||||||
|
#### (1)安装 Xray (如果尚未安装)
|
||||||
|
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
|
||||||
|
#### (2)生成必要参数
|
||||||
|
#生成 UUID (用于客户端连接)
|
||||||
|
xray uuid
|
||||||
|
#生成 Reality 密钥对
|
||||||
|
xray x25519
|
||||||
|
#生成 Short ID (可选,建议使用)
|
||||||
|
openssl rand -hex 8
|
||||||
|
|
||||||
|
#### (3)配置 Xray 编辑 /usr/local/etc/xray/config.json,填入以下内容(替换所有占位符):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log": { "loglevel": "warning" },
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"port": 1443,
|
||||||
|
"listen": "127.0.0.1",
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"clients": [
|
||||||
|
{
|
||||||
|
"id": "你的-UUID-1",
|
||||||
|
"flow": "xtls-rprx-vision"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "你的-UUID-2",
|
||||||
|
"flow": "xtls-rprx-vision"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"decryption": "none"
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "tcp",
|
||||||
|
"security": "reality",
|
||||||
|
"realitySettings": {
|
||||||
|
"dest": "microsoft.com:443",
|
||||||
|
"serverNames": [
|
||||||
|
"microsoft.com",
|
||||||
|
"www.microsoft.com"
|
||||||
|
],
|
||||||
|
"privateKey": "你的-Private-Key",
|
||||||
|
"shortIds": [
|
||||||
|
"你的-Short-ID-1",
|
||||||
|
"你的-Short-ID-2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outbounds": [ { "protocol": "freedom" } ]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
(关键:监听 127.0.0.1:1443,dest 指向一个真实的外部网站如 microsoft.com)
|
||||||
|
#### (4)启动 Xray
|
||||||
|
systemctl start xray
|
||||||
|
systemctl enable xray
|
||||||
|
### 步骤 4:域名解析与最终验证
|
||||||
|
#### (1)DNS 解析:在域名管理后台,确保两个域名都解析到你的腾讯云服务器 IP 43.163.236.29。
|
||||||
|
jp.hayashiei.top → 43.163.236.29
|
||||||
|
jpx.hayashiei.top → 43.163.236.29
|
||||||
|
#### (2)验证博客网站
|
||||||
|
curl -k https://jp.hayashiei.top | head -20
|
||||||
|
应返回博客的 HTML 内容。
|
||||||
|
#### (3)验证代理端口转发
|
||||||
|
curl -k https://jpx.hayashiei.top
|
||||||
|
应返回 400 Bad Request (这是 Xray 对非代理请求的标准回应),说明请求已成功从 jpx.hayashiei.top:443 经由 Nginx 转发给了 Xray。
|
||||||
|
#### (4)客户端配置 (以你最终成功的配置为准)
|
||||||
|
地址:jpx.hayashiei.top
|
||||||
|
端口:443
|
||||||
|
协议:vless
|
||||||
|
UUID:你的-UUID
|
||||||
|
Flow:xtls-rprx-vision
|
||||||
|
Encryption:none
|
||||||
|
Security:reality
|
||||||
|
PublicKey:你的-Public-Key
|
||||||
|
Short ID:你的-Short-ID
|
||||||
|
SNI:jp.hayashiei.top #关键:伪装成你的博客域名
|
||||||
|
Fingerprint:chrome
|
||||||
|
|
||||||
|
## 后记与排错要点
|
||||||
|
(1)Nginx -t 的局限性:nginx -t 只能检查语法错误,无法检查 map 指令中的域名是否写对、后端服务是否存活。
|
||||||
|
(2)模块加载:如果 stream 配置报错,请确认 Nginx 已安装并加载了 stream 模块 (nginx -V 2>&1 | grep stream)。
|
||||||
|
(3)端口监听:务必用 ss -tlnp | grep -E ":443|:8443|:1443" 确认端口监听状态正确:443 由 Nginx 监听,8443 由 Nginx 监听,1443 由 Xray 监听。
|
||||||
|
(4)客户端配置:客户端对分享链接的解析严格程度不同。如果导入链接失败,请手动检查并补全所有参数,特别是 type=tcp 和 headerType=none 这类有默认值的参数。
|
||||||
|
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
# WordPress网站迁移记录
|
||||||
|
目标: 将阿里云上的 WordPress 博客(域名 blog.hayashiei.top)完整迁移至腾讯云新服务器(新域名 jp.hayashiei.top)。
|
||||||
|
|
||||||
|
## 步骤 1:在阿里云源服务器上进行完整备份
|
||||||
|
1. 创建备份目录并定位网站文件
|
||||||
|
mkdir -p ~/blog-backup
|
||||||
|
cd /var/www
|
||||||
|
(根据你的实际情况,你的博客文件在 /var/www/wordpress)
|
||||||
|
2. 打包网站文件
|
||||||
|
tar -czvf ~/blog-backup/wordpress_files.tar.gz wordpress/
|
||||||
|
• 备份数据库
|
||||||
|
先找出 WordPress 使用的数据库名:
|
||||||
|
grep DB_NAME /var/www/wordpress/wp-config.php
|
||||||
|
导出数据库(假设数据库名为 wp_tyo):
|
||||||
|
mysqldump -u root -p wp_tyo > ~/blog-backup/wp_tyo.sql
|
||||||
|
4. 备份 Nginx 配置文件
|
||||||
|
cp /etc/nginx/conf.d/blog.conf ~/blog-backup/
|
||||||
|
5. 打包所有备份文件
|
||||||
|
cd ~
|
||||||
|
tar -czvf blog_hayashiei_backup.tar.gz blog-backup/
|
||||||
|
|
||||||
|
## 步骤 2:将备份包传输到腾讯云目标服务器
|
||||||
|
在阿里云服务器上执行(替换 你的腾讯云IP):
|
||||||
|
scp ~/blog_hayashiei_backup.tar.gz root@你的腾讯云IP:~/
|
||||||
|
|
||||||
|
## 步骤 3:在腾讯云目标服务器上恢复网站
|
||||||
|
### 1. 登录腾讯云服务器并解压备份包
|
||||||
|
ssh root@你的腾讯云IP
|
||||||
|
tar -xzvf blog_hayashiei_backup.tar.gz
|
||||||
|
cd blog-backup
|
||||||
|
### 2. 安装与源服务器一致的环境 (Nginx 1.22, PHP 8.2, MariaDB)
|
||||||
|
bash
|
||||||
|
apt update
|
||||||
|
apt install -y nginx php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl php8.2-zip mariadb-server
|
||||||
|
### 3. 恢复网站文件
|
||||||
|
mkdir -p /var/www
|
||||||
|
tar -xzvf wordpress_files.tar.gz -C /var/www/
|
||||||
|
### 4. 设置正确的文件权限
|
||||||
|
chown -R www-data:www-data /var/www/wordpress/
|
||||||
|
find /var/www/wordpress/ -type d -exec chmod 755 {} \;
|
||||||
|
find /var/www/wordpress/ -type f -exec chmod 644 {} \;
|
||||||
|
### 5. 恢复数据库
|
||||||
|
从 wp-config.php 中提取数据库信息:
|
||||||
|
grep -E “DB_NAME|DB_USER|DB_PASSWORD” /var/www/wordpress/wp-config.php
|
||||||
|
根据提取的信息,在 MariaDB 中创建相同的数据库和用户(以下为示例):
|
||||||
|
```
|
||||||
|
sql
|
||||||
|
mysql -u root -p
|
||||||
|
CREATE DATABASE wp_tyo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER ‘wp_tyo’@’localhost’ IDENTIFIED BY ‘你的密码’;
|
||||||
|
GRANT ALL PRIVILEGES ON wp_tyo.* TO ‘wp_tyo’@’localhost’;
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EXIT;
|
||||||
|
```
|
||||||
|
导入数据:
|
||||||
|
mysql -u root -p wp_tyo < wp_tyo.sql
|
||||||
|
|
||||||
|
### 6. 配置 Nginx 以使用新域名 jp.hayashiei.top
|
||||||
|
创建新的 Nginx 配置文件 /etc/nginx/conf.d/blog.conf,内容如下:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name jp.hayashiei.top;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name jp.hayashiei.top;
|
||||||
|
root /var/www/wordpress;
|
||||||
|
index index.php index.html;
|
||||||
|
ssl_certificate /etc/letsencrypt/live/jp.hayashiei.top/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/jp.hayashiei.top/privkey.pem;
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$args;
|
||||||
|
}
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
### 7. 申请 SSL 证书
|
||||||
|
apt install -y certbot python3-certbot-nginx
|
||||||
|
certbot –nginx -d jp.hayashiei.top
|
||||||
|
|
||||||
|
### 8. 修改 WordPress 配置中的域名
|
||||||
|
编辑 /var/www/wordpress/wp-config.php,将 WP_HOME 和 WP_SITEURL 改为新域名(如果存在):
|
||||||
|
php
|
||||||
|
define(‘WP_HOME’, ‘https://jp.hayashiei.top’);
|
||||||
|
define(‘WP_SITEURL’, ‘https://jp.hayashiei.top’);
|
||||||
|
|
||||||
|
### 9. 重启服务并测试
|
||||||
|
systemctl restart nginx php8.2-fpm
|
||||||
|
curl -k https://jp.hayashiei.top
|
||||||
|
此时,你应该能看到博客网站的内容。至此,网站迁移完成。
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
# iStoreOS+WireGuard异地组网配置手册
|
||||||
|
家庭端(服务端) + 公司端(客户端)+ 手机移动端接入
|
||||||
|
适用场景:两个 iStoreOS 路由器通过 WireGuard 组建虚拟局域网,实现内网互访,并支持手机客户端接入。
|
||||||
|
首先要说iStore是基于Openwrt做的,但是说实话要比Openwrt好用多了,当然可能运行起来资源占用会大一点,但是who care?在Opwnwrt上很多比较麻烦的问题,iStoreOS上都没有。所以我还是很愿意安利大家用这个的!
|
||||||
|
下面正式说整个搭建流程和注意事项!
|
||||||
|
|
||||||
|
## 一、网络拓扑与规划
|
||||||
|
家庭端(服务端),设备iStoreOS(主路由),内网网段192.168.1.0/24,VPN接口IP10.0.0.1/32,有公网动态IP,域名wireguard.yousuke.net。
|
||||||
|
家庭端(客户端),设备iStoreOS(二级路由),内网网段192.168.3.0/24,VPN接口IP10.0.0.2/32,无公网动态IP。
|
||||||
|
公司端上级网络,设备烽火CPE(主路由,内网网段)192.168.3.0/24,无公网动态IP。
|
||||||
|
手机端(客户端),VPN接口IP10.0.0.3/32,通过家庭段接入。
|
||||||
|
|
||||||
|
## 二、家庭端(服务端)配置
|
||||||
|
### 1. 创建 WireGuard 接口
|
||||||
|
进入 网络 → 接口 → 添加新接口
|
||||||
|
名称:wg_home
|
||||||
|
协议:WireGuard VPN
|
||||||
|
点击“创建接口”
|
||||||
|
|
||||||
|
### 2. 配置接口参数
|
||||||
|
(1)常规设置
|
||||||
|
生成新的密钥对(记录公钥,后面需要添加到其他端Peer的公钥)
|
||||||
|
监听端口:51820(建议更换,这个端口很容易连不了,不要选太小的)
|
||||||
|
IP 地址:10.0.0.1/32
|
||||||
|
|
||||||
|
(2)防火墙设置
|
||||||
|
创建/分配防火墙区域:新建一个 wg 区域,入站数据、出站数据、区域内转发均选接受,勾选TCP MSS钳制,该函的网络选择wg_home,允许转发到目标区域选择lan,允许来自源区域的转发选择lan。
|
||||||
|
|
||||||
|
(3)添加对端(公司 iStoreOS)
|
||||||
|
进入 接口 → wg_home → 对端 → 添加对端
|
||||||
|
公钥:填写公司 iStoreOS 的公钥
|
||||||
|
允许的 IP:10.0.0.2/32,192.168.2.0/24,192.168.3.0/24
|
||||||
|
勾选“为允许的 IP 创建路由”
|
||||||
|
持续 Keep-Alive:25
|
||||||
|
保存
|
||||||
|
|
||||||
|
### 3. 添加对端(手机)
|
||||||
|
(1)再次点击“添加对端”
|
||||||
|
描述:Mobile
|
||||||
|
公钥:填写手机端生成的公钥
|
||||||
|
允许的 IP:10.0.0.3/32
|
||||||
|
勾选“为允许的 IP 创建路由”
|
||||||
|
保存
|
||||||
|
|
||||||
|
### 4. 防火墙放行
|
||||||
|
进入 网络 → 防火墙 → 通信规则 → 添加
|
||||||
|
名称:Allow-WG
|
||||||
|
协议:UDP
|
||||||
|
来源区域:wan
|
||||||
|
目标端口:51820(之前面的一样哟)
|
||||||
|
目标区域:设备(或 wg)
|
||||||
|
动作:接受
|
||||||
|
|
||||||
|
## 三、公司端(客户端)配置
|
||||||
|
### 1. 创建 WireGuard 接口
|
||||||
|
进入 网络 → 接口 → 添加新接口
|
||||||
|
名称:wg_office
|
||||||
|
协议:WireGuard VPN
|
||||||
|
点击“创建接口”
|
||||||
|
|
||||||
|
### 2. 配置接口参数
|
||||||
|
(1)常规设置
|
||||||
|
生成新的密钥对(这里的公钥要填到服务端那边)
|
||||||
|
IP 地址:10.0.0.2/24
|
||||||
|
|
||||||
|
(2)防火墙设置
|
||||||
|
创建/分配防火墙区域:这个地方和服务端完全一样。
|
||||||
|
|
||||||
|
### 3. 添加对端(家庭 iStoreOS)
|
||||||
|
进入 接口 → wg_office → 对端 → 添加对端
|
||||||
|
公钥:填写家庭 iStoreOS 的公钥
|
||||||
|
预共享密钥:可选,建议生成
|
||||||
|
允许的 IP:10.0.0.1/32,192.168.2.0/24
|
||||||
|
勾选“为允许的 IP 创建路由”
|
||||||
|
对端地址:填写家庭公网 IP 或 DDNS 域名
|
||||||
|
对端端口:58888
|
||||||
|
持续 Keep-Alive:25
|
||||||
|
保存
|
||||||
|
|
||||||
|
### 4. 添加手机路由(重要!)
|
||||||
|
为了让公司端知道手机 10.8.0.3 的存在,需要在家用端对端里补充路由信息:
|
||||||
|
进入 接口 → wg_office → 对端 → 编辑“家庭 iStoreOS”对端
|
||||||
|
在“允许的 IP”中添加:10.0.0.3/32(也就是在公司的对端允许的IP就会多一个10.0.0.3/32,最终变成10.0.0.1/32,10.0.0.3/32,192.168.2.0/24)
|
||||||
|
确保仍勾选“为允许的 IP 创建路由”
|
||||||
|
保存并应用
|
||||||
|
后续如果还要添加其他非两个局域网的节点按照这个步骤来就可以了。
|
||||||
|
|
||||||
|
### 5. 防火墙放行
|
||||||
|
进入 网络 → 防火墙 → 通信规则 → 添加
|
||||||
|
名称:Allow-WG-In
|
||||||
|
协议:UDP
|
||||||
|
来源区域:wan
|
||||||
|
目标端口:51820
|
||||||
|
动作:接受
|
||||||
|
|
||||||
|
## 四、手机客户端配置(手动方式)
|
||||||
|
### 1. 在手机上生成密钥
|
||||||
|
安装 WireGuard App
|
||||||
|
点击“新建空隧道”
|
||||||
|
系统自动生成一对密钥,复制公钥(用于填到家庭端对端中)
|
||||||
|
|
||||||
|
### 2. 手机端配置文件(手动填写)
|
||||||
|
```
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = <手机私钥(App自动生成)>
|
||||||
|
Address = 10.8.0.3/32
|
||||||
|
DNS = 192.168.1.1(家里iStoreOS的局域网地址)
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = <家庭 iStoreOS 的公钥>
|
||||||
|
PresharedKey = (可选,与家庭端对端中保持一致)
|
||||||
|
Endpoint = 你的公网IP或DDNS:51820
|
||||||
|
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24
|
||||||
|
PersistentKeepAlive = 25
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 导入并连接
|
||||||
|
保存配置,开启 VPN
|
||||||
|
查看握手状态,应能成功连接
|
||||||
|
注意:添加了新节点后,最好重启一下wg接口(家庭端和公司端都需要)
|
||||||
|
|
||||||
|
## 五、最终验证
|
||||||
|
家庭端任意计算机,可以ping通10.0.0.2、10.0.0.3、192.168.2.0/24网段设备、192.168.3.0/24网段设备。
|
||||||
|
公司端任意计算机,可以ping通10.0.0.1、10.0.0.2、192.168.1.0/24网段设备。
|
||||||
|
手机端,可以ping通10.0.0.1、10.0.0.2、192.168.1.0/24网段设备、192.168.2.0/24网段设备、192.168.3.0/24网段设备。
|
||||||
|
注意:ping电脑的时候注意检查电脑是否禁ping,否则通了还以为没通。
|
||||||
|
|
||||||
|
## 六、常见问题排查
|
||||||
|
(1)手机能连但 ping 不通内网:手机端 AllowedIPs 没写全,添加对应网段;
|
||||||
|
(2)公司端 ping 不通家庭:路由未同步,检查对端 AllowedIPs 是否包含对面网段;
|
||||||
|
(3)手机能通家庭但通不了公司:公司端不知道手机,在公司端对端添加 10.8.0.3/32;
|
||||||
|
(4)端口不通:主路由未转发或防火墙未放行,检查端口转发 + 防火墙规则。
|
||||||
|
|
||||||
|
以上就是简单的公司和家庭异地Site-to-Site组网方案,有问题欢迎留言!
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
# 基于Debian12的Uptime Kuma部署与配置
|
||||||
|
本文讲述Debian12环境下进行Kuma部署和配置,包括Docker 安装、Kuma 部署、HTTPS 域名配置。
|
||||||
|
|
||||||
|
## 1. 安装 Docker (Debian 12)
|
||||||
|
#更新系统并安装依赖
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
sudo apt install -y ca-certificates curl gnupg lsb-release
|
||||||
|
|
||||||
|
#添加 Docker 官方 GPG 密钥和软件源
|
||||||
|
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||||
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
|
||||||
|
#安装 Docker Engine
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||||
|
|
||||||
|
#启动 Docker 并设置开机自启
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo systemctl enable docker
|
||||||
|
|
||||||
|
#将当前用户加入 docker 组,避免每次输入 sudo
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
#重要:执行完毕后,需要退出 SSH 重新登录才能使权限生效
|
||||||
|
|
||||||
|
## 2. 部署 Uptime Kuma 容器
|
||||||
|
#创建数据持久化目录
|
||||||
|
mkdir -p /opt/uptime-kuma-data
|
||||||
|
|
||||||
|
#运行 Kuma 容器 (使用 host 网络模式,简化后续代理配置)
|
||||||
|
docker run -d --restart=always \
|
||||||
|
--network host \
|
||||||
|
-v /opt/uptime-kuma-data:/app/data \
|
||||||
|
--name uptime-kuma \
|
||||||
|
louislam/uptime-kuma:2
|
||||||
|
• 访问地址:http://你的IP:3001
|
||||||
|
• 首次访问:设置管理员邮箱和密码。
|
||||||
|
• 注意:使用 --network host 模式后,-p 参数失效,容器直接使用宿主机的 3001 端口。
|
||||||
|
|
||||||
|
## 3. 配置 HTTPS 访问
|
||||||
|
你的现有架构为:Nginx Stream (SNI分流) -> 后端 Nginx (HTTPs) -> 服务。Kuma 作为新服务,通过独立端口 8444 接入。
|
||||||
|
步骤 3.1:修改 Stream 分流配置
|
||||||
|
编辑 Nginx 主配置文件(例如 /etc/nginx/nginx.conf),在 stream 块的 map 中添加 Kuma 域名的映射:
|
||||||
|
```nginx
|
||||||
|
stream {
|
||||||
|
map $ssl_preread_server_name $backend {
|
||||||
|
#... 你现有的其他域名映射 ...
|
||||||
|
kuma.你的域名 127.0.0.1:8444; #新增,将 Kuma 域名指向新端口
|
||||||
|
}
|
||||||
|
#... 其他配置 ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
步骤 3.2:为 Kuma 添加 Nginx 站点配置并申请 SSL 证书
|
||||||
|
如果你已拥有泛域名证书可直接复用。新建配置文件 /etc/nginx/sites-enabled/kuma:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:8444 ssl http2;
|
||||||
|
server_name kuma.你的域名;
|
||||||
|
|
||||||
|
#复用已有的泛域名证书路径
|
||||||
|
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:3001;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
步骤 3.3:测试并重载 Nginx
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
最终访问地址:https://kuma.你的域名
|
||||||
|
后续设置:登录 Kuma 后台,进入 设置 → 反向代理,将 信任代理 设为 是。
|
||||||
|
|
||||||
|
## 4. 配置Kuma
|
||||||
|
手机端:安装 Bark App,注册后复制你的专属 URL (例如 https://api.day.app/你的Key/)。
|
||||||
|
|
||||||
|
Kuma 管理端:
|
||||||
|
进入 设置 → 通知。
|
||||||
|
添加通知,类型选择 Bark (API v2)。
|
||||||
|
Bark 接入点:填入你的 URL 并在末尾加上 /push (格式:https://api.day.app/你的Key/push)。
|
||||||
|
Bark 群组:填入英文标识,如 homemonitor。
|
||||||
|
点击 测试,手机应收到推送。保存。
|
||||||
|
|
||||||
|
配置完成后,任一方 Kuma 服务中断,你的手机都会立即收到告警。
|
||||||
|
|
||||||
|
## 5. 常用管理命令
|
||||||
|
#查看 Kuma 容器状态
|
||||||
|
docker ps -a --filter name=uptime-kuma
|
||||||
|
|
||||||
|
#重启 Kuma 容器
|
||||||
|
docker restart uptime-kuma
|
||||||
|
|
||||||
|
#查看 Kuma 实时日志
|
||||||
|
docker logs -f uptime-kuma
|
||||||
|
|
||||||
|
#升级 Kuma
|
||||||
|
docker stop uptime-kuma
|
||||||
|
docker rm uptime-kuma
|
||||||
|
docker pull louislam/uptime-kuma:2
|
||||||
|
#之后使用相同的 docker run 命令重新创建容器
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
# 浅谈IPv4和IPv6在家庭服务的应用
|
||||||
|
本文算是我一直折腾家庭服务器的一个简单的总结,如果有不对的地方欢迎大家指正。
|
||||||
|
## 1.家庭网络环境
|
||||||
|
### 1.1家庭宽带情况
|
||||||
|
我家目前是三条宽带,分别是电信、联通、移动,均是1000M的下行,上行的话电信和联通差不多是50-60M,移动差不多有80M。然后其中电信和联通均有动态的公网IPv4、电信、联通和移动均有动态的公网IPv6.三台光猫均完整了改桥接操作。
|
||||||
|
### 1.2家庭组网情况
|
||||||
|
由于我属于比较喜欢折腾的人,所以经常瞎搞,当然一瞎搞就把全屋的网络整瘫了。为了解决这个问题,我在家里弄了两套局域网出来,其中一套局域网给家里其他人用,这里定义为网络A;另一套当然就是自己用,这里定义为网络B。
|
||||||
|
#### 1.2.1 网络A组网情况
|
||||||
|
网络A网段:10.8.3.0/24
|
||||||
|
网络A是使用的联通线路,原因是我自己个人比较偏爱电信,然后移动又比较拉胯,所以就把联通给家里人用了。这里可能有人会问,联通有公网的IPv4为什么给家里人用呢,他们只是普通的上上网,公网IPv4完全浪费了。这里我先卖个关子,因为后续会讲到这个问题。
|
||||||
|
网络A由联通光猫和两台锐捷的x60Pro组成。其中,联通光猫桥接,由其中一台x60Pro进行拨号,另一台x60Pro才用无线中继方式实现全屋无线网络覆盖。网络拓扑如下所示:
|
||||||
|
|联通光猫|——|锐捷x60Pro(主路由,拨号)|——|锐捷x60Pro(子路由,有线中继)|
|
||||||
|
#### 1.2.2 网络B组网情况
|
||||||
|
网络B网段:10.8.2.0/24
|
||||||
|
网络B的设备包括一台iStoreOS软路由4个2.5G网口+1个千兆网口、两台锐捷x60Pro、一台16口2.5G交换机、电信光猫和移动光猫。
|
||||||
|
iStoreOS的LAN1口连接电信光猫,进行拨号实现电信网络上网;
|
||||||
|
iStoreOS的LAN2口连接网络A主路由的LAN口,通过DHCP获取IP实现联通网络上网;
|
||||||
|
iStoreOS的LAN3口连接移动光猫,进行拨号实现移动网络上网。
|
||||||
|
从以上描述可以看出,B网络只有电信有公网的IPv4,然后电信、联通和移动均有公网的IPv6。由于LAN2口连接到了网络A的主路由上,使得网络B能够实现对网络A的管理。
|
||||||
|
|
||||||
|
## 2.最初选择和问题
|
||||||
|
实际上我最开始特别在意公网IPv4,原因也很简单就是要实现家庭访问有一个公网IPv4是很方便的。最早期我一直是只解析公网IPv4地址实现对家庭网络的访问,直到那一天。
|
||||||
|
那一天是在龙湖天街,小盆友想看看家里的奥特曼电影,结果不管是移动流量还是电信流量都最多能够刷出Emby的主页面,然后就没有然后了。
|
||||||
|
这事儿之后,我做了一下试验,仔细分析了一下原因,大致有如下因素:
|
||||||
|
(1)当时龙湖移动的网络质量比较好,但由于是跨网、晚高峰访问,由于层层NAT,导致最终无法看视频;
|
||||||
|
(2)电信的情况则不同,主要是电信本身的网络质量就差一点,然后加上晚高峰,同样是层层NAT,导致最终无法看视频。
|
||||||
|
## 3.第一次尝试
|
||||||
|
分析出原因之后(层层NAT那会还没分析出来),我认为电信本身的问题肯定是无法解决的,毕竟我不可能去建一个基站。那么就只能从移动入手了。当时觉得主要原因是跨网访问的原因,所以我决定弄一个一进二出的方案。具体就是电信请求,检查后从电信出去;移动请求,检查后从移动出去。我天真的认为这样就可以解决晚高峰跨网导致的访问速度慢的问题。
|
||||||
|
### 3.1 具体方案
|
||||||
|
电信 WAN:网关跃点 10
|
||||||
|
移动 WAN2(锐捷 DHCP 获取):网关跃点 20
|
||||||
|
两条都自动拿到网关,靠跃点控优先级,默认全网走电信。
|
||||||
|
**第一步:新建自定义路由表**
|
||||||
|
系统 → 路由 → 路由规则(有的版本叫「策略路由」)先编辑路由表文件:
|
||||||
|
登录 iStoreOS SSH:
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
uci set network.rtbl100=route_table
|
||||||
|
uci set network.rtbl100.table='100'
|
||||||
|
uci commit network
|
||||||
|
/etc/init.d/network restart
|
||||||
|
```
|
||||||
|
作用:新建路由表 100,专门给移动回包用。
|
||||||
|
|
||||||
|
**第二步:给表 100 加移动 WAN2 的默认路由**
|
||||||
|
把所有要走移动回包的流量,默认扔给移动网关。
|
||||||
|
先查你移动 WAN2 的网关是多少(必做):
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
route -n | grep WAN2
|
||||||
|
```
|
||||||
|
你会看到类似:192.168.3.1 就是移动网关。
|
||||||
|
然后执行(把下面网关换成你实际的,比如 192.168.3.1):
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
# 清空旧规则
|
||||||
|
uci delete network.rule100 2>/dev/null
|
||||||
|
uci delete network.route100 2>/dev/null
|
||||||
|
|
||||||
|
# 给表100加默认路由 走移动WAN2网关
|
||||||
|
uci set network.route100=route
|
||||||
|
uci set network.route100.interface='WAN2'
|
||||||
|
uci set network.route100.target='0.0.0.0/0'
|
||||||
|
uci set network.route100.gateway='192.168.3.1'
|
||||||
|
uci set network.route100.table='100'
|
||||||
|
|
||||||
|
uci commit network
|
||||||
|
/etc/init.d/network restart
|
||||||
|
```
|
||||||
|
**第三步:加策略规则 —— 移动 IP 来访 查表 100 回包**
|
||||||
|
原理:只要外网客户端是移动 IP 段,回程强制走表 100(移动 WAN2)
|
||||||
|
全国移动公网大段,直接逐条添加
|
||||||
|
继续 SSH 执行,批量导入移动网段规则:
|
||||||
|
```
|
||||||
|
运行
|
||||||
|
# 移动核心公网段,匹配绝大多数移动用户
|
||||||
|
ips=(
|
||||||
|
"112.0.0.0/10"
|
||||||
|
"117.128.0.0/10"
|
||||||
|
"120.192.0.0/10"
|
||||||
|
"183.128.0.0/10"
|
||||||
|
"211.136.0.0/15"
|
||||||
|
"218.200.0.0/13"
|
||||||
|
)
|
||||||
|
id=100
|
||||||
|
for ip in "${ips[@]}"; do
|
||||||
|
uci set network.rule$id=rule
|
||||||
|
uci set network.rule$id.src="$ip"
|
||||||
|
uci set network.rule$id.lookup='100'
|
||||||
|
uci set network.rule$id.priority="$id"
|
||||||
|
id=$((id+1))
|
||||||
|
done
|
||||||
|
|
||||||
|
uci commit network
|
||||||
|
/etc/init.d/network restart
|
||||||
|
```
|
||||||
|
这里添加的时候for是没办法用的,比较简单的方案就是nano之后去下载IP段,然后直接张贴进去。
|
||||||
|
这样之后所有外网请求 只从电信 WAN 公网进来
|
||||||
|
系统看来访者源 IP:
|
||||||
|
命中上面移动网段 → 查表 100 → 走移动 WAN2 回包
|
||||||
|
没命中 → 走系统默认路由(跃点 10 电信 WAN)
|
||||||
|
### 3.2实际测试
|
||||||
|
完成上述修改后,我在下午3点左右测试,通过抓包发现移动手机访问的时候只有移动有上行流量,成功。然后我信心满满的等待夜幕的降临。
|
||||||
|
左灯右等,在龙湖里,总算熬到了8点,手机打开移动上网流量,打开Emby客户端,页面出现了,点击一个视频,那个该死的圈又转了起来,不用说,失败了。
|
||||||
|
这次失败后,我赶紧回家想说是不是龙湖的信号没那么好。结果兴冲冲的赶回家。8点30分再次测试,依然是不停的圈圈转啊转。
|
||||||
|
这次测试失败后,我又再分析了一下,发现了最后一个问题,也是最大的问题就是层层NAT。稍微懂网络的人肯定知道层层NAT是造成晚高峰网速慢的主要原因。但是不管怎么说,这个方案是破产了。
|
||||||
|
接下来,我还不甘心,又买了一个腾讯迅驰型的轻量应用服务器,然后通过他来中转。结果,结果,我又被现实很很打脸了。因为使用中转后,原本小区邻居原本可以在晚高峰访问我家的。结果现在也无法访问了。
|
||||||
|
钱花出去了,问题没有解决,肯定要再分析,为了验证到底是移动端到中转服务器的问题还是中转服务器到我家这段的问题。为了验证,我在服务器上弄了一个网站,放了一个视频。结果发现移动端访问还是蛮快的,可以流畅的看720P,没有问题。那么这回问题就回到了中转服务器到我家这段了。哎,该死的层层NAT,即使有公网IPv4也没有用。
|
||||||
|
山穷水尽疑无路,柳暗花明又一村!
|
||||||
|
在已经要绝望的时候,感谢AI提醒我可以试试IPv6,当然反正也折腾了这么久,死马当活马医。
|
||||||
|
## 4.IPv6方案
|
||||||
|
首先我不是要说IPv6是完美的,他有一个明显的短板,但是瑕不掩瑜,接下来就来分享IPv6方案。
|
||||||
|
### 4.1天生优势
|
||||||
|
首先要说的就是在多线路环境下,IPv6自带的优势,自带源进源出。也就是说只要从移动的IPv6进来,那么就会自动走移动的上行出去。然后iStoreOS不需要做任何的配置。
|
||||||
|
### 4.2域名解析
|
||||||
|
**简单方案**
|
||||||
|
既然可以源进源出,那么我们要做的就是将不同线路的IPv6解析到公网上。当然这里最简单的方案就是不同的线路对应不同的域名。比如你的主域名叫test.xyz,那么就可以做如下解析关系:
|
||||||
|
电信线路:telecon.test.xyz,指定中国电信线路;
|
||||||
|
联通线路:unicom.test.xyz,指定中国联通线路;
|
||||||
|
移动线路:mobile.test.xyz,指定中国移动线路。
|
||||||
|
这样的好处就是域名解析和DDNS比较好配置,没那么多事儿,麻烦的就是你得自己去记住域名。
|
||||||
|
**优选方案**
|
||||||
|
优选方案就是一个域名根据源解析出三个不同的IP,具体操作步骤如下:
|
||||||
|
**第一步在阿里云或者腾讯云进行域名解析**
|
||||||
|
这里进行域名解析的时候一定要给IP指定线路,即做一一对应。
|
||||||
|
**第二步是通过API接口获取RecordID**
|
||||||
|
以阿里云为例,先安装阿里CLI
|
||||||
|
下载工具:点击这个链接直接下载:aliyun-cli-windows-latest-amd64.zip 。
|
||||||
|
解压文件:下载的是一个压缩包,把它解压到一个你找得到的文件夹里,例如 C:\aliyun。
|
||||||
|
添加到 Path (重点):为了让电脑在任何地方都能识别 aliyun 命令,需要把这个路径添加到系统环境变量 Path 中 。
|
||||||
|
按下 Win + R 键,输入 SystemPropertiesAdvanced 并回车。
|
||||||
|
点击 “环境变量”。
|
||||||
|
在 “系统变量” 列表中找到 Path,双击打开。
|
||||||
|
点击 “新建”,输入你解压的文件夹路径(例如 C:\aliyun)。
|
||||||
|
一路点击 “确定” 保存。
|
||||||
|
|
||||||
|
配置凭证(让命令行认识你)
|
||||||
|
打开 命令提示符 (cmd) 或 PowerShell。
|
||||||
|
输入以下命令并按回车,开始配置阿里云访问权限:
|
||||||
|
```
|
||||||
|
aliyun configure
|
||||||
|
|
||||||
|
根据提示依次输入以下信息 :
|
||||||
|
|
||||||
|
Access Key Id: 输入你的 AccessKey ID。
|
||||||
|
|
||||||
|
Access Key Secret: 输入你的 AccessKey Secret。
|
||||||
|
|
||||||
|
Default Region Id: 输入 cn-hangzhou (或其他地域)。
|
||||||
|
|
||||||
|
Default Output Format: 输入 json (保持默认)。
|
||||||
|
|
||||||
|
Default Language: 输入 en。
|
||||||
|
```
|
||||||
|
|
||||||
|
小提示:如果还没有 AccessKey,可以去阿里云控制台右上角的 AccessKey 管理里创建一个。
|
||||||
|
|
||||||
|
获取 RecordId
|
||||||
|
配置成功后,直接在刚才的命令行窗口里输入下面的命令:
|
||||||
|
```
|
||||||
|
aliyun alidns DescribeDomainRecords --DomainName "你的主域名"
|
||||||
|
```
|
||||||
|
执行后,屏幕上会显示一串 JSON 格式的文本。仔细找找 "RR" 字段为 "home" 和 "*.home" 的记录,它们旁边的 "RecordId" 后面跟着的那串数字,就是你需要的 。
|
||||||
|
把这两串数字记下来,后面需要填到DDNS-GO的配置里。
|
||||||
|
|
||||||
|
### 4.3DDNS-GO配置
|
||||||
|
这里不得不说就是我自己踩过的坑。最开始我的填写方式如下:
|
||||||
|
```
|
||||||
|
telecom.test.xyz?RecordId=1234567890123456789
|
||||||
|
mobile.test.xyz?RecordId=0987654321098765432
|
||||||
|
unicom.test.xyz?RecordId=1357913579135791357
|
||||||
|
```
|
||||||
|
这样填写后,就可以对应解析出来了。但是这里有一个天坑:一旦IP变化了,你会发现阿里云解析那边的线路就又乱了,怎么办呢?需要加上线路,正确的写法如下:
|
||||||
|
```
|
||||||
|
telecom.test.xyz?RecordId=1234567890123456789&Line=telecom
|
||||||
|
mobile.test.xyz?RecordId=0987654321098765432&Line=mobile
|
||||||
|
unicom.test.xyz?RecordId=1357913579135791357&Line=unicom
|
||||||
|
```
|
||||||
|
加上线路标识之后,IP发生变化也不会再导致线路号乱了。
|
||||||
|
### 4.4实际测试
|
||||||
|
呃,结果不要太惊喜。跑到龙湖天街,晚上8点高峰时段,不管是移动还是电信(联通手机还没办法用)看1080P的电影可以随便拖拉,一点都不卡,就和本地播放一个感觉,丝滑的我都有点懵了。
|
||||||
|
为什么IPv6那么丝滑呢?原因主要有以下两点:
|
||||||
|
(1)IPv6没有IPv4那么多NAT,因为每一个设备都有公网地址,不存在需要层层转发的必要条件;
|
||||||
|
(2)IPv6在Qos上估计没有被运营商怎么限制;
|
||||||
|
但是实际测试中也发现,就是即使是IPv6跨网访问还是会比网内访问要慢不少。所以,对于移动手机用户来讲,移动网络其实也蛮有用的。
|
||||||
|
## 5.最终方案
|
||||||
|
看了上面内容,小伙伴是不是发现IPv4环境就会挂。是的,比如酒店,公司这种基本上纯IPv4的环境,上面的IPv6方案就抓瞎了。所以还是需要保留IPv4的域名解析。
|
||||||
|
这里我实在是不想搞了,因为IPv4的的线路和IPv6差异太多了。比如240e开头就是电信、2408是联通、2409是移动,只要记得这个谁都能一下识别出来。但是对于IPv4就不是了。对于同一个IP,今天是移动,可能过几天就是联通了。所以就会出现误解析的问题,而一旦出现错误解析就会直接超时。
|
||||||
|
当然最大的问题还是IPv4有跳跃点,所以实际只能有一个入口。所以也没有必要解析两个IP,也就是说做单进多出就是最简单也是最有效的。这个方案上面我已经叙述过怎么实现。
|
||||||
|
最终我自己是选择了只解析电信,别说我只有电信了,最开始我还是有联通的,只是发现不靠谱之后就把联通拿走了。然后我也没做单进多出,因为IPv4纯粹就是后备方案,不值当了。
|
||||||
Reference in New Issue
Block a user