常见问题
本文档整理了 DNS-Go 部署和使用过程中的常见问题及解决方案。
安装部署问题
Q: 启动时提示 "配置文件不存在"
原因: 首次启动时没有找到配置文件
解决方案:
自动生成配置:
bash# 运行程序,会自动生成配置模板 ./dns-go-linux-amd64 # 根据提示修改 config/config.toml vim config/config.toml手动下载配置:
bashmkdir -p config curl -o config/config.toml \ https://gitee.com/liumou_site/dns-go/raw/master/vitepress/public/config.example.toml
Q: 数据库连接失败
错误信息:
failed to connect to database: connection refused解决方案:
检查数据库服务状态:
bash# PostgreSQL sudo systemctl status postgresql # MySQL sudo systemctl status mysql检查数据库监听地址:
bashsudo netstat -tlnp | grep -E '5432|3306'验证连接信息:
bash# PostgreSQL psql -h localhost -U dnsgo -d dns_go -c "SELECT 1;" # MySQL mysql -h localhost -u dnsgo -p -e "SELECT 1;"检查防火墙:
bashsudo iptables -L -n | grep -E '5432|3306'
Q: DNS 服务无法绑定 53 端口
错误信息:
bind: permission denied原因: Linux/macOS 上 1024 以下端口需要 root 权限
解决方案:
方案 1:使用 root 权限运行
bash
sudo ./dns-go-linux-amd64方案 2:授权程序绑定特权端口
bash
sudo setcap cap_net_bind_service=+ep ./dns-go-linux-amd64
./dns-go-linux-amd64 # 之后可以普通用户运行方案 3:使用高位端口 + iptables 转发
bash
# 配置 DNS-Go 使用 5353 端口
# 然后配置 iptables 转发
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5353
sudo iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5353Q: 53 端口被占用
检查占用进程:
bash
sudo lsof -i :53
# 或
sudo netstat -tlnp | grep :53常见占用者及处理:
systemd-resolved:
bash
# 停止 systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 修改 DNS 配置
sudo rm /etc/resolv.conf
sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf其他 DNS 服务:
bash
# 停止其他 DNS 服务
sudo systemctl stop named
sudo systemctl stop dnsmasq使用问题
Q: 登录时提示 "Token 无效"
可能原因:
- JWT 密钥已更改
- Token 已过期
- 浏览器缓存问题
解决方案:
- 清除浏览器缓存和 Cookie
- 重新登录
- 如果修改了 JWT 密钥,所有用户需要重新登录
Q: 域名解析不生效
排查步骤:
检查 DNS 服务状态:
bashcurl http://localhost:8085/api/dns/status测试本地解析:
bashdig @localhost www.example.local检查域名状态:
- 确保域名已启用
- 确保解析记录已启用
- 检查 TTL 设置
检查上游配置:
- 确保上游 DNS 可用
- 检查上游策略配置
Q: 缓存不生效
可能原因:
- Valkey/Redis 未连接
- 缓存配置错误
- TTL 设置为 0
解决方案:
检查缓存连接:
bashredis-cli -h localhost ping检查缓存配置:
toml[valkey] ip = "127.0.0.1" port = 6379检查程序日志中的缓存相关错误
Q: 如何重置管理员密码
通过数据库重置:
bash
# 生成新密码的 bcrypt 哈希
# 可以使用在线工具或程序生成
# PostgreSQL
sudo -u postgres psql -d dns_go -c "
UPDATE users
SET password = '\$2a\$10\$...'
WHERE username = 'admin';"
# MySQL
mysql -u dnsgo -p dns_go -e "
UPDATE users
SET password = '\$2a\$10\$...'
WHERE username = 'admin';"注意: \$ 是转义的 $ 符号
性能问题
Q: DNS 查询响应慢
排查步骤:
检查上游 DNS 健康状态
- 进入「上游管理」→「健康检查」
- 确保上游 DNS 响应正常
检查缓存命中率
- 进入「系统监控」
- 查看缓存命中率统计
检查系统资源
- CPU 使用率
- 内存使用率
- 网络延迟
优化建议:
- 启用 Valkey/Redis 缓存
- 调整上游策略
- 优化健康检查间隔
Q: Web 界面加载慢
可能原因:
- 后端响应慢
- 前端资源加载慢
- 数据库查询慢
解决方案:
- 检查后端日志,找出慢查询
- 为数据库添加索引
- 检查网络连接质量
Q: 数据库连接数过多
错误信息:
too many connections解决方案:
调整 PostgreSQL 最大连接数:
confmax_connections = 200调整 DNS-Go 连接池:
toml[postgres] max_open_conns = 50检查是否有连接泄漏
升级问题
Q: 如何升级到最新版本
Docker 部署:
bash
# 1. 备份数据
docker exec dns-go cp -r /app/data /app/data.backup
# 2. 拉取新镜像
docker pull ccr.ccs.tencentyun.com/liumou/dns-go:latest
# 3. 停止并删除旧容器
docker stop dns-go
docker rm dns-go
# 4. 启动新容器
docker run -d --name dns-go ...二进制部署:
bash
# 1. 备份
sudo systemctl stop dns-go
cp /opt/dns-go/dns-go-linux-amd64 /opt/dns-go/dns-go-linux-amd64.backup
# 2. 下载新版本
wget -O /opt/dns-go/dns-go-linux-amd64 ...
chmod +x /opt/dns-go/dns-go-linux-amd64
# 3. 启动
sudo systemctl start dns-goQ: 升级后数据丢失
预防措施:
- 升级前务必备份数据库
- 查看升级说明,了解是否有破坏性变更
- 先在测试环境验证升级
数据恢复:
bash
# 停止服务
sudo systemctl stop dns-go
# 恢复数据库
pg_restore -h localhost -U dnsgo -d dns_go backup.dump
# 启动服务
sudo systemctl start dns-go安全相关问题
Q: 如何修改 JWT 密钥
编辑配置文件:
toml
[jwt]
secret_key = "your_new_secret_key_min_32_chars"注意:
- 修改后所有用户需要重新登录
- 使用强随机字符串
- 定期更换密钥
Q: 如何限制管理界面访问
方案 1:防火墙限制
bash
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 8085 -j ACCEPT
iptables -A INPUT -p tcp --dport 8085 -j DROP方案 2:Nginx 反向代理
nginx
location / {
allow 192.168.1.0/24;
deny all;
proxy_pass http://127.0.0.1:8085;
}Q: 如何启用 HTTPS
使用 Nginx 反向代理:
nginx
server {
listen 443 ssl;
server_name dns-admin.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:8085;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}其他问题
Q: 日志文件过大
配置日志轮转:
bash
sudo tee /etc/logrotate.d/dns-go <<EOF
/opt/dns-go/logs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 dnsgo dnsgo
postrotate
/bin/kill -HUP \$(cat /var/run/dns-go.pid 2>/dev/null) 2>/dev/null || true
endscript
}
EOFQ: 如何查看错误日志
Docker:
bash
docker logs -f dns-gosystemd:
bash
sudo journalctl -u dns-go -f直接运行:
bash
tail -f /opt/dns-go/logs/app.logQ: 如何导出所有配置
导出脚本:
bash
#!/bin/bash
EXPORT_DIR="/backup/export-$(date +%Y%m%d)"
mkdir -p $EXPORT_DIR
# 导出数据库
pg_dump -h localhost -U dnsgo dns_go > $EXPORT_DIR/database.sql
# 导出配置文件
cp -r /opt/dns-go/config $EXPORT_DIR/
# 打包
tar czf $EXPORT_DIR.tar.gz $EXPORT_DIR
rm -rf $EXPORT_DIR
echo "Export completed: $EXPORT_DIR.tar.gz"获取帮助
如果以上解决方案无法解决您的问题:
- 查看日志:获取详细的错误信息
- 检查文档:查看相关功能文档
- 提交 Issue:在 Gitee 上提交问题
- 社区求助:加入 QQ 群讨论
联系方式:
- 📧 邮箱:liumou.site@qq.com
- 💬 QQ群:点击加入
- 🐛 Issue:Gitee Issues