Debian 环境下自建 Shlink 短网址服务

开发者评论838字数 1402阅读模式

本文将指导使用 Docker 安装 Shlink 搭建自建短网址服务。这种方式也适用其他已安装 Docker 的 Linux 发行版,不限于 Debian 系统。

什么是短网址服务?

短网址,即 URL Shortener (缩略网址服务),一般我们使用 HTTP 协议 的 301 或 302 响应码,现在也有使用 307 或 308 来跳转一个长网址。

MDN 上有对这几个状态码的详细介绍:

301 和 302 有一个最重要的区别,前者会在浏览器留下缓存,后者不会,导致如果你需要精确的统计访客,尤其是有一些使用一个浏览器的重复访客会不准确,但是影响不大,而使用 302 每次都会请求服务器造成服务器资源的额外开销,所以一般没有特殊需求的话,使用 301 就行。

举一个典型的 301 跳转的例子:

root@debian ~ # curl -I http://infras.cn/ -A Mozilla
HTTP/1.1 301 Moved Permanently
Server: nginx/1.22.1
Date: Fri, 05 Jul 2024 06:29:35 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://infras.cn/

我们可以看到,使用浏览器访问 http://infras.cn/ 的时候,会返回 HTTP/1.1 301 Moved Permanently 状态,对应跳转到 Location https://infras.cn/

市面上开源和收费的短网址源码

众所周知,本人的短域名贼多,对各种短网址程序都有所研究,市面上主要有这几款免费的短网址程序:

  • Blink - Easy-to-host,SSO-integrated,CDN-powered link shortener (+decoupled analytics) for teams。(Source CodeAGPL-3.0 Nodejs
  • Kutt - A modern URL shortener with support for custom domains。(Source CodeMIT Nodejs
  • Polr - Modern,minimalist,modular,and lightweight URL shortener。(Source CodeGPL-2.0 PHP
  • Shlink - URL shortener with REST API and command line interface。Includes official progressive web application and docker images。(Source CodeClientsMIT PHP
  • YOURLS - YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener。Features include password protection,URL customization,bookmarklets,statistics,API,plugins,jsonp。(Source CodeMIT PHP

我基本上都安装使用过,数据量大了以后性能基本惨不忍睹,对比以后还是使用 PHP Swoole 写的 Shlink 稍微占优,所以本文推荐安装 Shlink。

至于收费的?呵呵,没一个好用的,建议别去踩坑,我都帮你们踩过了。。。

安装 Docker 和 Docker Compose

Debian 和 Ubuntu 系统请参考这里的教程

其他 Linux 系统可以使用 Docker 官方的脚本安装 Docker 和 Docker Compose:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

参考官网的安装教程,我们可以把 Server 和 Web Client 装在一个地方方便管理。

首先我们新建 /opt/shlink 和 /opt/shlink/data 目录:


mkdir -p /opt/shlink
mkdir -p /opt/shlink/data

然后我们新建一个 docker-compose.yaml 文件,假设你的域名是 example.com,放在 /opt/shlink/docker-compose.yaml

cat >> /opt/shlink/docker-compose.yaml << EOF
version: '3.8'

services:
    shlink:
      image: shlinkio/shlink:stable
      container_name: shlink
      ports:
        - '127.0.0.1:8080:8080'
      environment:
        - DEFAULT_DOMAIN=example.com
        - IS_HTTPS_ENABLED=true
        - GEOLITE_LICENSE_KEY=
        - DB_DRIVER=maria
        - DB_NAME=shlink
        - DB_USER=shlink
        - DB_PASSWORD=随机密码1
        - DB_HOST=db
        - DB_PORT=3306
        - TIMEZONE=UTC
        - REDIRECT_STATUS_CODE=301
      restart: always

    db:
      image: mariadb:10.11
      depends_on:
        - shlink
      container_name: db
      ports:
        - '127.0.0.1:3306:3306'
      environment:
        - MYSQL_ROOT_PASSWORD=随机root 密码
        - MYSQL_DATABASE=shlink
        - MYSQL_USER=shlink
        - MYSQL_PASSWORD=随机密码1
      volumes:
        - /opt/shlink/data:/var/lib/mysql
      restart: always

    shlink-web-client:
        image: shlinkio/shlink-web-client:stable
        container_name: shlink-web-client
        ports:
          - '127.0.0.1:8081:8080'
        restart: always
EOF

GEOLITE_LICENSE_KEY 需要在 Maxmind 注册帐号获取,可以参考《使用 Docker 安装 Plausible Analytics 自建网站统计

MYSQL_ROOT_PASSWORD 和 MYSQL_PASSWORD 记得设置两个随机的密码,同时 MYSQL_PASSWORD 需要和 DB_PASSWORD 一致。

更多的环境变量参数可以参考这里

然后拉取 Docker 镜像并运行:

cd /opt/shlink
docker compose pull
docker compose up -d

然后获取一个 API Key:

docker exec -it shlink shlink api-key:generate

注意输出中的,第一个 shlink 是 Docker 容器名字,第二个 shlink 是命令名称。

所有 API 命令如下:

docker exec -it shlink shlink

记得保存你的 API Key,下面会要用到。

安装配置 Nginx 反代

我们的 Docker Compose 配置文件中,Shlink Server 服务监听在 127.0.0.1:8080 端口,Shlink Web Client 监听在 127.0.0.1:8081 端口,所以我们需要配置 Nginx 反代来访问,假设你短网址是 https://example.com/ Web 客户端是 https://app.example.com/

example.com 段配置:

	location / {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_redirect off;
		proxy_set_header        X-Forwarded-Proto $scheme;
		proxy_connect_timeout       300;
		proxy_send_timeout          300;
		proxy_read_timeout          300;
		send_timeout                300;
		proxy_pass http://127.0.0.1:8080;
	}

app.example.com 段配置:

	location / {
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_redirect off;
		proxy_set_header        X-Forwarded-Proto $scheme;
		proxy_connect_timeout       300;
		proxy_send_timeout          300;
		proxy_read_timeout          300;
		send_timeout                300;
		proxy_pass http://127.0.0.1:8081;
	}

点击 + Add a server 添加你的 Shlink 服务:

Debian 环境下自建 Shlink 短网址服务

输入名称,URL 和 API Key 以后点击 Create server 即可使用:

如果你懒得搭建 Web Client,也可以使用官方现成的服务:Shlink Web Client

数据都是储存在浏览器本地的,可放心使用。

直接使用 Docker Compose 升级并删除旧的镜像文件:

cd /opt/shlink
docker compose pull
docker compose up -d
docker system prune -f

我们可以定期备份数据库,导出命令如下:

docker exec db /usr/bin/mysqldump -u root --password=随机root密码 shlink > shlink-$(date +"%Y_%m_%d_%I_%M_%p").sql

请替换 随机 root 密码 为你的数据库 root 密码。

文章末尾固定信息

继续阅读
 
joseph
  • 本文由 joseph 发表于 2024年7月5日
  • 除非特殊声明,本站文章许可协议为"署名-非商用-相同方式共享 4.0",转载请保留原链、作者等信息。
Debian 12 安装 Nvidia 驱动及问题修复 开发者

Debian 12 安装 Nvidia 驱动及问题修复

千万不要使用Nvidia官方提供的 run 文件,会有很大问题!!安装过程以英文版的 Debian Wiki 为主,不用看中文翻译版,有段时间没更新了。 一、安装前的工作确定你安装了当前内核的 hea...
Debian 使用 Btrfs 文件系统实现快照和恢复 开发者

Debian 使用 Btrfs 文件系统实现快照和恢复

我们大家都用过虚拟机,虚拟机可以打快照,弄坏了就可以回档。但这件事在真机上并不好实现。在 Linux 中我们可以借助 Btrfs 做到这一点。Btrfs 在文件系统中集成了快照功能,但由于手动创建和恢...
广告也精彩