飞牛OS给容器魔方上行宽带限速

下面我将详细讲解(容器网络命名空间限速)的持久化配置步骤,确保在飞牛OS重启后自动生效。请严格按照顺序执行以下操作:

🛠️ 完整持久化配置教程(带详细解释)

步骤1:确认容器魔方名称

# 查看运行的容器列表
docker ps
# 从输出中找到容器魔方的名称(通常在NAMES列)
# 示例输出:
# CONTAINER ID IMAGE ... NAMES
# a1b2c3d4e5f6 wxedge-image ... wxedge

确认容器名称(如上例的 ​​wxedge​​),后续步骤将用到这个名称。容器魔方的名字默认wxedge

步骤2:创建限速脚本

# 创建脚本目录
sudo mkdir -p /opt/scripts
# 创建脚本文件
sudo nano /opt/scripts/limit_container_traffic.sh

在编辑器中粘贴以下内容(​​记得替换 YOUR_CONTAINER_NAME 为你的实际容器名称​​):容器魔方的名字为wxedge
eth0是网卡名称,可以在飞牛OS中的网络设置中查看自己的网卡名称,替换自己的使用网卡即可

#!/bin/bash
# 容器名称(必须修改)
CONTAINER_NAME="wxedge"
# 等待容器完全启动(重要!)
echo "等待容器启动..."
while ! docker inspect --format='{{.State.Running}}' $CONTAINER_NAME | grep -q "true"; do
sleep 3
done
# 额外等待5秒确保网络初始化
sleep 5
# 获取容器PID
PID=$(docker inspect -f '{{.State.Pid}}' "$CONTAINER_NAME")
if [ -z "$PID" ]; then
echo "错误:无法获取容器 $CONTAINER_NAME 的PID"
exit 1
fi
# 2025-06-04 修改通过veth接口配置网络,避免docker限速影响飞牛系统的网络监控
# ========================= 核心修改开始 =========================
# 查找容器对应的veth接口(关键新增步骤)
VETH_INDEX=$(nsenter -t $PID -n cat /sys/class/net/eth0/iflink)
VETH_NAME=$(ip -o link | grep "if$VETH_INDEX" | awk -F': ' '{print $2}' | sed 's/@.*//')
if [ -z "$VETH_NAME" ]; then
echo "错误:无法找到容器对应的veth接口"
exit 1
fi
# 在宿主机侧对veth接口限速(替换容器内操作)
echo "为容器 $CONTAINER_NAME (veth:$VETH_NAME) 设置上行带宽限制..."
tc qdisc replace dev $VETH_NAME root tbf \
rate 20mbit \
burst 320kbit \
latency 400ms
# ========================= 核心修改结束 =========================
# 检查结果
if [ $? -eq 0 ]; then
echo "成功设置上行带宽限制:20Mbps"
else
echo "限速设置失败!"
exit 2
fi

按 Ctrl+O 保存文件,然后 Ctrl+X 退出编辑器。

给脚本添加可执行权限:

sudo chmod +x /opt/scripts/limit_container_traffic.sh

步骤3:创建Systemd服务单元

# 创建服务配置文件
sudo nano /etc/systemd/system/container-bandwidth.service

粘贴以下内容:

[Unit]
Description=Container Bandwidth Limiter for Magic Container
After=docker.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/opt/scripts/limit_container_traffic.sh
Restart=on-failure
RestartSec=30
StartLimitInterval=0
[Install]
WantedBy=multi-user.target

保存并退出(Ctrl+O → Enter → Ctrl+X)

步骤4:启用并启动服务

# 重载systemd配置
sudo systemctl daemon-reload
# 启用服务(开机自启)
sudo systemctl enable container-bandwidth.service
# 立即启动服务
sudo systemctl start container-bandwidth.service

步骤5:验证服务状态

# 检查服务状态
sudo systemctl status container-bandwidth.service
# 预期看到 "active (running)" 状态
# 检查日志(查看限速是否成功)
journalctl -u container-bandwidth.service -n 50 --no-pager

日志中应看到类似:

等待容器启动...
为容器 container_magic (PID:12345) 设置上行带宽限制...
成功设置上行带宽限制:20Mbps

步骤6:测试限速效果,理论上如果容器魔方正在上传,不需要测试,直接看效果,立竿见影。

飞牛OS系统中的UI界面有网速,看那个即可。比如之前是7Mb/s,限制完上传后变为了2.4Mb/s,速度根据自己需求调整

  1. ​​在容器内安装测试工具​​:
# 进入容器魔方Shell
docker exec -it YOUR_CONTAINER_NAME /bin/bash
# 在容器内安装speedtest-cli
apt-get update && apt-get install -y speedtest-cli # 对于Debian系
# 或(如果使用Alpine):
# apk add curl
  1. 运行上行速度测试​​:
# 方法1: 使用speedtest-cli
speedtest --simple
# 方法2: 使用curl测试上传
curl -T /dev/zero http://speedtest.ftp.otenet.gr/files/test10Mb.db
# 观察输出速度(应稳定在~2.5MB/s左右,因为20Mbps = 2.5MB/s)

步骤7:重启验证持久化

# 重启飞牛OS
sudo reboot
# 重启后检查
sudo systemctl status container-bandwidth.service
docker exec YOUR_CONTAINER_NAME tc qdisc show dev eth0

应看到类似:

qdisc tbf 800d: root refcnt 2 rate 20Mbit burst 32Kb lat 400.0ms

🚨 排错指南

问题现象解决方案
"无法获取容器PID"检查容器名称是否正确、容器是否正常运行
"No such file or directory"确认已创建 /opt/scripts/limit_container_traffic.sh 并有执行权限
"RTNETLINK answers: File exists"添加 replace 关键字:tc qdisc replace...
网卡名称不是eth0修改脚本中的 dev eth0 → 使用 docker exec 容器名 ip addr 查看正确网卡名
限速不精确调整 burst 值:burst = rate/8 * 1.5
服务启动过早增加脚本中的 sleep 时间

🔄 更新限速配置

如需修改带宽限制(例如改为30Mbps):

编辑脚本文件:

sudo nano /opt/scripts/limit_container_traffic.sh

修改 rate 20mbit → rate 30mbit
修改 burst 320kbit → burst 480kbit (30÷8×1.5=5.625,约480kbit)
重启服务:

sudo systemctl restart container-bandwidth.service

💡 此方案通过Systemd在宿主机层面自动管理,避免修改容器内部,确保每次重启飞牛OS后自动生效且不影响容器魔方的正常功能。

原创作者: JacobX 转载于: https://www.cnblogs.com/JacobX/p/18908334
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值