Docker 安装 Shlink 自建短网址

Docker 安装 Shlink 自建短网址

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

本文介绍了在Debian 12上使用Docker安装Shlink来搭建短网址服务的步骤,包括安装Docker和Docker Compose、安装Shlink Server和Web Client、配置Nginx反向代理、升级和迁移Shlink,以及备份数据库。

🔎

延伸解读

301 与 302 跳转对统计的影响

文章指出,短网址服务通常使用 HTTP 301 或 302 状态码进行跳转。301 是永久重定向,浏览器会缓存该跳转,导致后续同一浏览器的访问可能不再请求服务器,从而影响访客统计的精确性;302 是临时重定向,每次都会请求服务器,统计更准确但会增加服务器负担。因此,若无特殊统计需求,使用 301 即可。

为何推荐 Shlink 而非其他开源程序

作者对比了 Blink、Kutt、Polr、Shlink、YOURLS 等多款免费短网址程序,并基于自身使用经验表示,数据量增大后多数程序性能下降明显,而用 PHP Swoole 编写的 Shlink 表现稍好,因此推荐使用 Shlink。对于收费短网址服务,作者认为体验不佳,不建议尝试。

部署架构与关键配置要点

在 Docker Compose 配置中,Shlink Server、MariaDB 和 Shlink Web Client 分别运行在独立容器,并仅监听本地回环地址的 8080、3306 和 8081 端口,需通过 Nginx 反向代理对外提供服务。配置时需注意设置 DEFAULT_DOMAIN、IS_HTTPS_ENABLED、数据库连接信息以及 REDIRECT_STATUS_CODE 等环境变量,并确保数据库密码一致。

升级、迁移与备份的注意事项

升级 Shlink 可通过 docker compose pull 和 up -d 完成,并可用 docker system prune -f 清理旧镜像。迁移可参考其他 Docker 应用教程。备份则通过 docker exec 执行 mysqldump 导出数据库,命令中需替换为实际的 root 密码,并建议定期执行以防数据丢失。

❓

Q&A

如何在 Debian 12 上使用 Docker 安装 Shlink 搭建短网址服务?

首先安装 Docker 和 Docker Compose,然后创建 /opt/shlink 和 /opt/shlink/data 目录,编写 docker-compose.yaml 文件,拉取镜像并运行 Shlink Server 和 Web Client,获取 API Key,配置 Nginx 反向代理,最后通过 Web Client 添加服务。

短网址跳转时 301 和 302 状态码有什么区别?

301 会在浏览器留下缓存,302 不会。使用 301 可能导致重复访客统计不准确,但影响不大;使用 302 每次都会请求服务器,造成服务器资源紧张。一般没有特殊需求建议使用 301。

为什么推荐使用 Shlink 而不是其他开源短网址程序?

因为 Shlink 使用 PHP Swoole 编写,在数据量大了以后性能优于其他开源短网址程序,如 Blink、Kutt、Polr、YOURLS 等。

如何获取 Shlink 的 API Key?

运行命令:docker exec -it shlink shlink api-key:generate,其中第一个 shlink 是容器名,第二个 shlink 是命令名。生成后保存 API Key 以备后用。

如何配置 Nginx 反向代理来访问 Shlink Server 和 Web Client?

在 Nginx 配置中,为短网址域名(如 example.com)设置 location / 代理到 http://127.0.0.1:8080,为 Web 客户端域名(如 app.example.com)设置 location / 代理到 http://127.0.0.1:8081,并添加必要的 proxy_set_header 等配置。

如何升级 Shlink?

进入 /opt/shlink 目录,运行 docker compose pull 拉取最新镜像,然后 docker compose up -d 重新启动容器,最后 docker system prune -f 删除旧镜像文件。

如何备份 Shlink 的数据库?

使用 mysqldump 命令导出数据库,例如:docker exec db /usr/bin/mysqldump -u root --password=随机root密码 shlink > shlink-$(date +"%Y_%m_%d_%I_%M_%p").sql,请替换密码为实际 root 密码。

🏷️

标签

➡️

继续阅读