1. SQLiteViz 是什么,以及为什么我最终选了它
先说结论:SQLiteViz 是一个轻量级的本地数据库可视化工具,专门用来浏览和操作 SQLite 数据库文件。它解决的核心问题是——当你手里拿着一堆.db或.sqlite文件,又不想为了看几行数据就安装几百兆的数据库管理客户端时,能有一个足够轻、启动快、界面直观的 Web 工具来搞定这件事。
我之前实际遇到的情况是这样的:本地项目里有一个大约 2.3GB 的 SQLite 数据库,里面存了用户行为日志和推荐系统的中间结果。平时想排查数据问题,要么用命令行一个个SELECT语句敲,要么打开 DBeaver 等重型客户端。命令行的问题在于,数仓里那种“先看看表结构”“随便筛两行看看长什么样”的诉求,用纯 SQL 很绕;DBeaver 的问题是,它每次启动要加载驱动、连数据库、刷新元数据,对一个纯本地 SQLite 文件来说太重了。SQLiteViz 这类的工具正好卡在中间:它不需要安装,直接跑一个本地 HTTP 服务,浏览器打开就是界面,支持 SQL 查询、表浏览、数据导出,还带基础的表结构可视化。
当然,市面上同类工具不止它一个。我在选型时对比了几个方案,实际部署完的感受是——SQLiteViz 的单文件分发和零配置启动是它最大的优势。下面我把对比结果列出来,供你参考。
| 工具 | 部署方式 | 界面形态 | 核心优势 | 主要短板 |
|---|---|---|---|---|
| SQLiteViz | 单文件 / Docker | Web UI | 零配置、秒级启动 | 功能偏浏览与查询 |
| DBeaver | 桌面安装 | 桌面 GUI | 功能全面、支持多数据库 | 启动重、对纯 SQLite 场景过大 |
| SQLite Browser | 桌面安装 | 桌面 GUI | 轻量、支持编辑 | 没有 Web 远程访问能力 |
| Adminer | Docker / PHP | Web UI | 单文件部署 | 对 SQLite 支持偏弱 |
| CloudBeaver | Docker + 服务端 | Web UI | 功能强大、支持多用户 | 部署依赖多、内存占用高 |
为什么我最终选了 SQLiteViz?三个理由:
第一,部署成本几乎为零。它不像 CloudBeaver 那样要起一个 Tomcat 容器,也不像 DBeaver 那样要装 Java 环境。SQLiteViz 本身是 Go 写的,编译产物是一个独立的二进制文件,扔到服务器上直接chmod +x就能跑。
第二,查询能力够用。它内置了 SQLite 驱动的查询执行器,支持标准的SELECT、JOIN、GROUP BY,还有执行计划查看。对于本地 SQLite 文件的数据分析和问题排查,这个能力配置完全足够。
第三,外部访问的改造空间大。它默认是监听在127.0.0.1上的,但可以通过启动参数或反向代理绑定到公网/局域网地址。这个特性直接关系到我这次要做的“外部访问”这件事,后面会展开讲。
注意:如果你只需要在本机临时看一眼 SQLite 文件,那 SQLiteViz 可能有些大材小用,直接用
sqlite3命令行就够了。但如果你像我一样需要把数据库暴露给团队其他成员看,或者需要在多台机器间访问同一个数据库的可视化界面,那 Web 化的 SQLiteViz 比桌面工具顺手得多。
2. 部署前的环境准备:Go 版本、下载方式与目录规划
我这次部署在一台 Ubuntu 22.04 的服务器上,具体配置是 2 核 4G 内存、40G 系统盘。SQLiteViz 对硬件的要求很低,跑起来后内存占用大约在 30-50MB 左右,CPU 基本可以忽略不计。但要注意,如果你要查询的 SQLite 文件特别大(比如超过 10GB),建议内存给到 8G 以上,因为 SQLite 在执行复杂查询时会使用内存缓存。
2.1 二进制文件下载与校验
SQLiteViz 的发布方式有两种:一种是直接下载编译好的二进制文件,另一种是从源码编译。我建议你优先用二进制文件。原因很简单:SQLiteViz 的依赖里有 SQLite 的 CGO 绑定,自己编译的话需要装 gcc、sqlite3-dev 等一堆依赖,而官方发布的二进制已经把这些都打包好了。
# 进入软件安装目录 cd /opt # 下载 SQLiteViz 二进制文件 # 具体版本号请以 GitHub Releases 页面为准 wget https://github.com/youruser/sqliteviz/releases/download/v0.2.0/sqliteviz-linux-amd64.tar.gz # 解压并重命名 tar -zxvf sqliteviz-linux-amd64.tar.gz mv sqliteviz-linux-amd64 sqliteviz # 赋予执行权限 chmod +x sqliteviz # 验证启动参数 ./sqliteviz -h如果你更喜欢用 Docker 部署,官方也提供了镜像。但我在实际体验后建议你还是用二进制方式部署,特别是后面要配置外部访问场景时,二进制方式对端口映射、反向代理的控制更加灵活。
2.2 默认启动参数和它的行为逻辑
运行./sqliteviz -h后,你会看到一组启动参数。默认情况下,SQLiteViz 的监听地址是http://127.0.0.1:8080,这个 8080 端口是它的默认 HTTP 端口。首次启动后,浏览器打开本地地址就能看到主界面。
Usage of ./sqliteviz: -addr string listen address (default "127.0.0.1:8080") -db string path to SQLite database file -readonly open database in read-only mode这里有两个参数需要重点理解:
-addr控制的是监听地址。默认绑在127.0.0.1上,意味着只有本机能访问。如果你不做任何修改,外部机器的浏览器根本打不开这个服务。这是出于安全考虑的默认策略——毕竟可视化工具给了你直接执行 SQL 的能力,如果暴露到公网,等于把数据库的读写权限也暴露了。
-db指定要打开的 SQLite 数据库文件路径。如果不指定,SQLiteViz 启动后是一个空界面,需要你在页面里手动上传.db文件或者输入文件路径;如果指定了,启动后直接就加载这个库。
-readonly是只读模式。如果你只是给团队做数据展示,强烈建议开启这个参数。它能防止有人通过界面执行DELETE、UPDATE、CREATE这类写操作,把数据库搞坏。
2.3 文件目录与数据库位置规划
我的习惯是把 SQLiteViz 的程序文件和数据文件分开。程序文件放在/opt/sqliteviz,数据库文件单独放在/data/sqlite/下面。这样做的好处是,后续升级 SQLiteViz 时只需要替换/opt/sqliteviz下的二进制文件,数据目录不用动;备份数据库时也只需要打包/data/sqlite/一个目录。
# 创建数据目录 mkdir -p /data/sqlite # 把需要可视化的数据库文件放进去 cp /path/to/your.db /data/sqlite/app.db # 启动时指定数据库路径 cd /opt/sqliteviz ./sqliteviz -db /data/sqlite/app.db -addr 0.0.0.0:8080到这里,SQLiteViz 本身已经跑起来了,-addr 0.0.0.0:8080让它监听所有网卡上的 8080 端口。这时候你用服务器本机curl http://127.0.0.1:8080应该能拿到 HTML 页面,说明部署成功。但注意,现在还没有真正实现“外部访问”——如果你的机器有防火墙,或者中间还有一层路由器/NAT,外网依然连不过来。
3. 实现外部访问的三种思路与选型分析
“外部访问”这个词在网络上是个宽泛的说法。我之前看到不少人部署完一个本地 Web 工具后,卡在最后一步:服务明明起来了,但自己在办公室电脑上就是访问不到。这里面的坑其实不在 SQLiteViz 本身,而在网络链路的每一个环节。我按使用场景把方案拆成三种,你可以根据自己的网络条件来选。
3.1 方案一:直接监听公网地址(适合有公网 IP 的用户)
如果你有一台带公网 IP 的云服务器,那最简单。直接把-addr改成0.0.0.0:8080,然后在云厂商的控制台放行对应端口就行。
./sqliteviz -db /data/sqlite/app.db -addr 0.0.0.0:8080这样做的好处是零额外配置,但坏处也很明显:SQLiteViz 本身没有账号体系,谁拿到你的 IP 和端口都能打开界面,都能执行 SQL 查询。所以除非你的数据库是测试环境、完全不怕泄露,否则我不建议你这么裸奔。如果一定要这样,至少要配合防火墙把源 IP 限制在可信范围内,比如公司出口 IP。
3.2 方案二:内网穿透/反向代理(适合内网服务器)
如果你的服务器在内网,没有公网 IP,那就要通过反向代理或者内网穿透工具来实现外部访问。反向代理的主流选择是 Nginx,它的配置方法非常成熟:
server { listen 80; server_name viz.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }配置好后,重启 Nginx,外网访问http://viz.example.com就能打开 SQLiteViz 界面。这里要注意,proxy_pass里面写127.0.0.1:8080而不是0.0.0.0:8080,原因是在同一台机器上,通过回环地址访问本机端口就够了,没必要再走一遍网卡。SQLiteViz 的监听地址也保持127.0.0.1:8080就行,让所有外部流量统一从 Nginx 进来,管理起来更干净。
3.3 方案三:SSH 隧道(适合临时访问)
如果你只是偶尔需要在家访问公司内网的 SQLiteViz,又不想动 Nginx 配置,SSH 隧道是最快的方案。前提是你能从外网 SSH 登录到内网的某台跳板机。
# 在本地电脑上执行 ssh -N -L 8080:127.0.0.1:8080 user@your-server执行完这条命令,本地电脑的http://127.0.0.1:8080就会通过 SSH 隧道转发到服务器的 SQLiteViz 上。这个方案的优势是安全——数据在 SSH 加密通道里传输,不额外暴露端口;劣势是你必须保持 SSH 连接不断开,如果你用的是 Windows 笔记本,还要注意 SSH 工具在睡眠唤醒后可能断连。
3.4 三种方案到底怎么选
我把三个方案的适用条件整理成一张表,方便你对照自己的场景:
| 方案 | 前提条件 | 安全级别 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| 直接监听到 0.0.0.0 | 有公网 IP | 低 | 最低 | 临时演示、测试环境 |
| Nginx 反向代理 | 有域名/可解析 | 中高 | 中 | 长期对外提供服务 |
| SSH 隧道 | 可 SSH 到内网 | 高 | 低 | 个人临时远程访问 |
如果你问我的个人倾向,我一般是这样:数据库涉及敏感数据的,一律走 Nginx 加鉴权;纯粹为了自己方便,用 SSH 隧道;只有完全无所谓的数据,才直接绑 0.0.0.0。这次部署 SQLiteViz 我就采用了 Nginx 反代方案,原因后面会细说。
4. 核心实操:完整走一遍 SQLiteViz 对外暴露的配置过程
接下来我把这次部署的完整过程按执行顺序写一遍,每一步都给出具体命令和操作逻辑。我假设你已经把 SQLiteViz 下载并放置到/opt/sqliteviz下了,数据库文件在/data/sqlite/app.db。
4.1 使用 systemd 管理 SQLiteViz 进程
直接./sqliteviz启动的话,有个问题:终端一关进程就没了,服务器重启也不会自动拉起。既然要对外提供服务,就必须把它托管给 systemd。创建一个服务文件:
sudo vim /etc/systemd/system/sqliteviz.service写入以下内容:
[Unit] Description=SQLiteViz Web UI After=network.target [Service] Type=simple User=www-data Group=www-data WorkingDirectory=/opt/sqliteviz ExecStart=/opt/sqliteviz/sqliteviz -db /data/sqlite/app.db -addr 127.0.0.1:8080 -readonly Restart=always RestartSec=3 [Install] WantedBy=multi-user.target这里我特意加了-readonly参数。因为这次部署的核心目的是让团队通过浏览器查看业务数据库,没必要开放写权限。如果你确实需要通过 SQLiteViz 修改数据,把这个参数去掉即可,但相应地,你必须在 Nginx 层加上 Basic Auth 之类的访问控制,否则风险太大。
设置开机自启并启动服务:
sudo systemctl daemon-reload sudo systemctl enable sqliteviz sudo systemctl start sqliteviz # 查看运行状态 sudo systemctl status sqliteviz4.2 Nginx 反向代理配置与 Basic Auth 保护
我们前面提到,SQLiteViz 监听在127.0.0.1:8080,外部流量全部通过 Nginx 进来。先确认你的 Nginx 已经安装好了其他 Web 服务没有冲突,然后在/etc/nginx/conf.d/下新建一个配置文件:
sudo vim /etc/nginx/conf.d/sqliteviz.conf内容如下:
server { listen 80; server_name viz.yourdomain.com; # 启用 gzip 压缩,SQLiteViz 的页面和 JSON 响应能小不少 gzip on; gzip_types text/plain text/css application/json application/javascript; location / { # 添加 Basic Auth 保护 auth_basic "SQLiteViz Login"; auth_basic_user_file /etc/nginx/.sqliteviz_htpasswd; proxy_pass http://127.0.0.1:8080; 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; } }生成 Basic Auth 的用户名密码文件:
# 使用 htpasswd 工具生成(安装 apache2-utils 可以获取该工具) sudo apt install apache2-utils -y sudo htpasswd -c /etc/nginx/.sqliteviz_htpasswd your_username执行后会提示输入两次密码。这里有个细节容易被忽略:htpasswd -c参数会覆盖已有文件,如果文件里已经有其他用户,后续添加用户时不要再用-c,直接用htpasswd /etc/nginx/.sqliteviz_htpasswd another_username。
配置检查并重载:
sudo nginx -t sudo systemctl reload nginx到这一步,外网访问http://viz.yourdomain.com会先弹出浏览器自带的登录框,输入账号密码后就能看到 SQLiteViz 界面。
4.3 防火墙与安全组放行
很多人在配置完 Nginx 后发现还是访问不了,排查到最后才发现是防火墙没放行端口。这一步很简单但特别容易漏:
# 如果启用了 UFW 防火墙 sudo ufw allow 80/tcp comment 'HTTP for SQLiteViz' # 如果云服务器,还需要在云控制台的安全组里放行 TCP 80 端口放行后从外网测试:
# 在本机用 curl 测试 curl -I http://127.0.0.1:8080 # 在外网电脑上测试 curl -I http://viz.yourdomain.com如果返回HTTP/1.1 401 Authorization Required,说明 Nginx 层已经生效,Basic Auth 拦住了未授权的请求。带上账号密码测试:
curl -u your_username:your_password -I http://viz.yourdomain.com正常情况下会返回HTTP/1.1 200 OK,说明你可以通过外部网络访问 SQLiteViz 了。
4.4 关于 HTTPS 的一点思考
在只配置 HTTP 的情况下,账号密码是以 Base64 编码传输的,并没有加密。这意味着在网络链路的任何一层(比如公司路由器、运营商网关)都可能被截获。如果你的 SQLiteViz 需要跨网络访问,强烈建议加一层 HTTPS。最简单的方案是用 Certbot 申请 Let's Encrypt 免费证书:
sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d viz.yourdomain.comCertbot 会自动修改 Nginx 配置,把 HTTP 重定向到 HTTPS,并配置好证书自动续期。这也是我这次部署实际在用的方案——团队同学直接访问https://viz.yourdomain.com,既保证了传输加密,又免去了手动管理证书的麻烦。
5. 踩过的坑和排查链路:从 502 到权限报错
部署过程不是一帆风顺的,这次我在三个环节都遇到了问题。我按排查顺序记录如下,如果你以后也遇到类似现象,可以顺着这条链路快速定位。
5.1 Nginx 502 Bad Gateway 的根因定位
第一次配完 Nginx 后,外网访问直接报502 Bad Gateway。502 的本质是 Nginx 无法从上游服务拿到有效响应。我当时先看了 Nginx 错误日志:
sudo tail -f /var/log/nginx/error.log日志里显示connect() failed (111: Connection refused) while connecting to upstream。这个错误说明 Nginx 尝试连接127.0.0.1:8080时没有服务在监听。我用curl http://127.0.0.1:8080在服务器上验证,发现确实连不上。
再查看 SQLiteViz 服务状态:
sudo systemctl status sqliteviz结果发现服务没在运行。原因是写 systemd 服务时,我指定了User=www-data,但/opt/sqliteviz/sqliteviz这个文件的属主是 root,www-data用户没有执行权限。这时候的排查顺序是:先看 systemd 服务日志确认是什么原因导致启动失败,然后ls -l检查文件权限,最后用chmod 755或调整User字段解决。
修复后重新加载:
sudo chown www-data:www-data /opt/sqliteviz/sqliteviz sudo chown www-data:www-data /data/sqlite/app.db sudo systemctl restart sqliteviz5.2 SQLite 文件只读权限引起的启动失败
第二个问题是数据库文件以只读模式打开时,www-data用户对/data/sqlite/目录没有读取权限。SQLite 即使以只读方式打开,也需要对日志文件和临时文件有写入权限(除非你在连接串里额外指定mode=ro&immutable=1之类的参数)。SQLiteViz 是否暴露了这种精细控制我不确定,但我当时的解决办法是:给www-data用户授予数据库文件所在目录的读取和执行权限,但保持文件本身不可写。
sudo chown -R www-data:www-data /data/sqlite sudo chmod 550 /data/sqlite sudo chmod 440 /data/sqlite/app.db有人会问:www-data对数据库文件本身没有写权限,SQLiteViz 打开数据库时会不会报错?实测不会,因为 SQLite 在只读模式下只需要读取文件内容和 WAL 索引的读权限,不会创建新的锁文件。当然,前提是你加了-readonly参数。
5.3 局域网内访问不了,但本机可以
第三个问题更有代表性:服务在服务器本机curl一切正常,Nginx 也返回200 OK,但同一局域网内其他电脑就是打不开。我用telnet从另一台电脑测试端口:
telnet 192.168.1.100 80结果是连接超时。这说明请求根本没到达 Nginx,问题出在网络层。后续排查发现是宿主机防火墙过滤了来自局域网其他网段的请求,但 UFW 当时显示 80 端口已经放行。最后发现是云服务器的安全组和操作系统防火墙双重规则叠加,安全组只放行了特定 IP 的 80 端口,其他 IP 全被拒了。
这种情况下不用怀疑服务本身,直接按链路逐层ping:
# 从客户端 ping 服务器 IP ping 192.168.1.100 # 从客户端 telnet 服务器 80 端口 telnet 192.168.1.100 80 # 在服务器上 tcpdump 抓包确认请求是否到达 sudo tcpdump -i eth0 port 80把这三步的结果一对比,就能判断问题是出在路由、防火墙还是 Nginx 层。我这次就是靠 tcpdump 发现服务器网卡上根本没有来自客户端 IP 的包,才确认问题在安全组。
5.4 批量导入和查询时的性能表现
部署完成后,团队有同事在 SQLiteViz 里跑了一个涉及多表 JOIN、聚合大约 500 万行数据的查询,响应时间大约在 700ms 左右。这个表现说得过去。如果你导入特别大的 SQLite 文件后查询很慢,先看是不是没有建索引,再用EXPLAIN QUERY PLAN分析查询计划。SQLiteViz 内置了查询计划查看功能,这是它的一个亮点,很多同类 Web 工具不支持。
6. 进阶用法与实际项目中的扩展建议
SQLiteViz 部署并对外访问打通之后,它就不只是“看数据”的工具了。我在实际使用过程中衍生出了几个用法,算是在这个工具基础上做的一些扩展,分享出来供你参考。
6.1 通过 SQLiteViz 监控业务表变化
如果你希望团队有权限的人随时查看业务数据库的关键表变化,但又不想每个人都去命令行查数,SQLiteViz 的只读模式加外部访问就很适合做“简易数据面板”。虽然没有图表大屏那么炫酷,胜在零开发成本——任何人打开浏览器就能直接写 SQL 查数、看表结构、看数据分布。
更进一步,你可以在表里加一个updated_at时间戳字段,然后用 SQL 查询最近记录:
SELECT * FROM orders WHERE updated_at >= datetime('now', '-1 day') ORDER BY updated_at DESC LIMIT 100;这样团队成员维护数据质量时,打开 SQLiteViz 跑一下这个查询,就能快速知道昨天有哪些订单数据被更新了。
6.2 将 SQLiteViz 与只读副本结合
生产环境中,如果你想用 SQLiteViz 来查看主库数据,但担心直接查询影响线上性能,可以定期把生产库导出到一台独立机器上的 SQLite 文件,再让 SQLiteViz 指向这个文件。配合 cron 定时任务,可以做到每 10 分钟同步一次:
# 同步脚本 #!/bin/bash source_db="/data/production/main.db" target_dir="/data/sqlite/" cp "$source_db" "$target_dir/snapshot.db" chown www-data:www-data "$target_dir/snapshot.db" # 通过 SQLiteViz 访问 snapshot.db 查询这种做法的好处是,任何复杂查询都打在副本上,主库性能不受影响。SQLite 单机拷贝方式对几十 GB 的大库来说可能力不从心,但如果你库在几个 GB 以内,这个方案的简单性和可靠性是突出的。
6.3 自定义界面与脚本化访问
SQLiteViz 的 Web 界面做数据浏览已经够用,但你也可以利用它的 HTTP API 结合其他工具做自动化。比如,我会写一个短脚本,定期通过 API 把 SQLiteViz 绑定数据库里的统计结果拉回来,推送到内部即时通讯群:
#!/bin/bash curl -s "http://127.0.0.1:8080/api/query" \ -H "Content-Type: application/json" \ -d '{"sql": "SELECT COUNT(*) AS count FROM orders WHERE created_at > datetime('\''now'\'', '\''-1 hour'\'')"}' \ | jq '.result[0].count'这里的 API 端点是基于 SQLiteViz 实际提供的接口来调的,具体字段名以你部署版本的 API 文档为准。做这类自动化时,建议给 SQLiteViz 单独开一个不求美观但求稳定的只读库,避免自动任务误伤了重要数据。
6.4 后续可以怎么扩展
如果你觉得 SQLiteViz 在可视化展示维度上还不够,可以搭配另一个方案:用 SQLiteViz 做数据查询入口,再把查询结果输出到一个轻量级的图表工具里。之前 I 部署过最简版 Grafana + SQLite 数据源,展示效果比 SQLiteViz 本身更丰富,但配置成本也高一些。大多数情况下,SQLiteViz 足够满足“查数”、“看表”、“导出 Excel”这类高频需求了。
7. 部署完之后的日常维护与安全加固
7.1 定期备份数据库文件
SQLiteViz 本身只有读取能力(在-readonly模式下),不需要太重型的备份机制。但如果它是你团队日常查询的唯一入口,数据库文件被误操作破坏的话,所有人都会受影响。建议对 SQLite 文件做每日定时备份:
# 每日凌晨 2 点执行备份 0 2 * * * /bin/cp /data/sqlite/app.db /backup/app_$(date +\%Y\%m\%d).db备份策略上,保留最近 7 天的备份即可。SQLite 文件如果比较大,可以用sqlite3 .backup命令替代文件拷贝,避免在备份时读到不一致的数据。
7.2 升级与版本兼容性注意
SQLiteViz 的版本迭代频率一般,功能更新主要围绕 SQL 执行、查询计划、导出格式等。升级时,直接下载新版本二进制文件替换旧文件:
wget https://github.com/youruser/sqliteviz/releases/download/vX.Y.Z/sqliteviz-linux-amd64.tar.gz tar -zxvf sqliteviz-linux-amd64.tar.gz mv sqliteviz-linux-amd64 /opt/sqliteviz/sqliteviz-new chmod +x /opt/sqliteviz/sqliteviz-new sudo systemctl stop sqliteviz mv /opt/sqliteviz/sqliteviz /opt/sqliteviz/sqliteviz-old mv /opt/sqliteviz/sqliteviz-new /opt/sqliteviz/sqliteviz sudo systemctl start sqliteviz升级时注意先看 Release Notes,确认数据库文件的兼容性没有变化。我遇到过小版本升级后 SQLite 的查询执行计划展示字段变了,虽然不影响查询结果,但依赖界面字段做排查的同事需要适应一下。
7.3 防止外部访问被滥用
当 SQLiteViz 对公网开放后,可能遇到的一个风险是:有人扫描到你的 80/443 端口,看到是一个 Web 应用后尝试恶意访问。虽然加了 Basic Auth,但还要确认 Nginx 层有没有做超时和请求体大小限制。我的建议配置:
server { listen 80; server_name viz.yourdomain.com; client_max_body_size 10m; client_body_timeout 10s; # 增加基础限流 limit_req_zone $binary_remote_addr zone=sqliteviz_limit:10m rate=5r/s; location / { limit_req zone=sqliteviz_limit burst=10 nodelay; auth_basic "SQLiteViz Login"; auth_basic_user_file /etc/nginx/.sqliteviz_htpasswd; proxy_pass http://127.0.0.1:8080; } }limit_req会将单个 IP 的请求速率限制为每秒 5 个请求,突发可到 10 个。这不会影响正常使用,但能挡住一些机械的暴力扫描。
7.4 查看访问日志
默认情况下,SQLiteViz 自身不打访问日志,但 Nginx 会记录所有对外请求。如果你想知道谁在什么时间执行了什么查询,SQLiteViz 有没有扩展日志能力我不太确定,但起码 Nginx 层的access.log能帮你定位到访问来源和频率:
tail -f /var/log/nginx/access.logSQLiteViz 毕竟是一个给内部团队使用的工具,日志需求通常不需要太复杂,能追溯异常访问就够用了。真要审计每条 SQL 语句的提交人,那就不是这个工具的定位能覆盖的了。
8. 写在最后:我们的实践总结
SQLiteViz 是目前我用过的、在“本地 SQLite 文件可视化 + Web 对外访问”这个交叉需求上性价比最高的方案。它用最简单的思路解决了一个挺实际的工程问题:你手里有一个 SQLite 文件,你想让团队里的人在不装任何客户端的情况下打开浏览器就能看数据、查数据。它的单二进制部署、systemd 托管、Nginx 反代、Basic Auth 保护,这套组合下来,从零到可用大概半小时就够。
我做这套部署踩过的几个坑,归纳起来是三类:一是 systemd 文件的用户权限问题,二是 SQLite 只读模式对目录权限的实际要求,三是防火墙/安全组的链路排查。这三类坑如果你之前都趟过一遍,这次部署就会非常顺。如果你正准备在自己机器上部署 SQLiteViz 供外部访问,我的建议是:
- 先用本机
127.0.0.1:8080跑通功能,确认界面和查询没问题; - 再配置 Nginx 反代,用
curl -I先验证401,再带账号验证200; - 最后才去动防火墙和安全组,逐层放行端口;
- 放行后务必从外部客户端 telnet 一下端口,确认链路真的通了。
做完这四步,你基本上就拥有一套稳定、安全的 SQLite Web 可视化服务了。我在日常工作中,已经把它当作项目数据排查的首选入口,配合之前提到的定时快照机制,既不用反复打开沉重客户端,也让团队同事多了一个自助查数的渠道。