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

开发者评论254字数 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 使用 Btrfs 文件系统实现快照和恢复 开发者

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

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