docker系列 搭建基于shlink的长链转短链工具
本文最后更新于 361 天前,其中的信息可能已经有所发展或是发生改变,如有失效可到评论区留言。

前言

本来,我对长链转短链这个功能没有太大的需求,因为我在用cryptgeon,生成的链接也能设定阅读次数、时间(虽然是分钟为单位),并且还能设置访问密码。不过后来我发现,在不适合用cryptgeon的场合,一些长链接(特别是分享的下载链接),直接发给别人,或者放在网页上,都不雅观,非常的没有逼格,所以被迫研究了下,从3款短链接生成工具(Myurls,YOURLS,shlink)选择了最适合我的一个shlink。

长链转短链工具比较

这里简单对比下这3种工具:

Myurls

简单到极限,界面如下:

image.png

简单吧,不过搭建到也不算简单,还要依赖redis,感觉性价比不高的样子。。

YOURLS

这个功能就比Myurls要多一些了,如下:

image.png

从上图中可以看出,YOURLS可以看到更多的信息,包括短链接的点击数等,而且YOURLS有登录账号认证,安全方便,这点上其实比myurls和shlink都要好。

shlink

为啥我最终选择了shlink?无图无真相,上图:

image.png

Device-specific long URLs:
可以根据不同的访问设备返回不同的长链接,安卓,ios,桌面系统。
Limit access to the short URL:
可以设置短链接最大访问次数,以及生效的时间。
就这2个就很厉害了,更别说还包括:Extra checks,Validate URL可以检查长链接的有效性,不能访问会在点击保存的时候报错;Configure behavior中,Make it crawlable可以让短链接被搜索引擎索引等。而且,还能通过多种维度查看短链接的访问情况,还能定位访客位置,如下图:
image.png

所以,我最终选择了shlink,理由充分吧。

注册MaxMind账号

不过,shlink也是最麻烦的,主要是因为需要定位访问者的来源,需要使用到MaxMind的GeoLite2数据库,所以需要去MaxMind注册一个账号,并获取key:

image.png

推荐使用第2种方式注册,注册链接如下:
https://www.maxmind.com/en/geolite2/signup?utm_source=kb&utm_medium=kb-link&utm_campaign=kb-create-account
大家自行搞定注册即可,注册成功以后,在如下图最下方位置点击下方红框:
image.png

输入描述,然后点击下方的confirm即可生成完毕:
image.png

注意,key只有第一次创建成功的时候才会显示内容,随后就看不到了,请大家注意保存好。

部署shlink

然后准备工作已做好,接下来开始正式的创建过程。

简单来说,shlink的部署分为2个部分:后端server和前端web-client,这2个可以部署在一起,也可以分开来部署,大家可以根据自己的条件来选择,我是选择将后端server部署在腾讯云的轻量服务器上,因为有443端口,更方便,而前端web-client是部署在家里,这样不用映射端口,主打一个安全。

部署后端server:

docker run --name shlink -d --restart=always \
    -p 9040:8080 \
    -e DEFAULT_DOMAIN=example.com \
    -e IS_HTTPS_ENABLED=true \
    -e GEOLITE_LICENSE_KEY=xxxxxxxxxxxxxxxxxxxxxxxx \
    shlinkio/shlink:latest

-p 9040:8080
指定容器的映射端口,9040这个按你自己规划修改就行。
-e DEFAULT_DOMAIN
用来指定你的短域名,其实这个也未必需要单独买一个很短的,一般来说你已有的域名就可以,比如你云主机对应的域名就行。假设你的云主机对应的域名是example.com,那么你这里可以直接填example.com,前提是你在域名解析服务器有@的A记录,当然也可以设置一个单独的域名,比如a.example.com,只要能够解析到你的云主机即可,因为最后生成的短链接的格式是https://example.com/xxxxx,或者https://a.example.com/xxxxx,所以只要指定的这个域名能够达到你部署shlink的服务器的443端口即可。那么如果是家庭宽带的公网ip,没有443或者80端口,行不行呢?答案是可以,比如你家庭宽带映射的端口是44444,那么-e DEFAULT_DOMAIN=example.com:44444即可。不过这样也是有些场景有不爽,比如在微信聊天记录里点链接,会提示不是标准端口啥的,也蛋痛,所以最后我才把server端部署到了腾讯云的轻量服务器上。
-e IS_HTTPS_ENABLED=true
用来指定shlink生成的是https链接还是http链接,true就是https,fales就是http。推荐开https,安全嘛,而且http链接在手机chrome浏览器上会报不是安全的链接,很蛋痛。
-e GEOLITE_LICENSE_KEY
就是前面你在注册MaxMind后获得的key,直接粘贴在=后面即可。


默认shlink会使用sqlite数据库,如果要利用已有的其他数据库,可以使用如下-e参数进行指定:
-e DB_DRIVER=maria \
-e DB_NAME=shlink \
-e DB_USER=shlink \
-e DB_PASSWORD=xxx\
-e DB_HOST=xxx \
其中,DB_DRIVER的类型可以是: mysql、maria、postgres、mssql,并且要提前在要用的数据库中把shlink的库和对应的user、密码都配置弄好。


经过以上步骤,server端就已经搭建完全,然后在反向代理上把example.com的443端口反代到127.0.0.1:9040(端口根据自己实际指定的为准)就大功告成了(反向代理设置方式可以参考我另2篇文章:linux面板系列 配置反向代理并使用非443端口进行发布docker系列 使用docker基于NPM搭建自己的反向代理)。实际访问一下https://example.com,会出现以下404输出就算成功:

image.png

然后执行以下命令获取shlink后端server的api-key,保存输出结果,这个需要配置在前端web-client里:

docker exec -it shlink shlink api-key:generate

部署前端web-client:

注:shlink的web-client前端和一般容器的使用习惯有点不一样,有2种方式选择:
1、创建容器的时候就用-e参数指定server端的地址和key
这样的好处在于你随意更换登录设备都能看到保存好的server信息

2、创建容器的时候不提前指定server信息,创建完成后登录添加
这种方式你添加的server信息回保存在当前的登录设备的cookie里,也就是说,你清空cookie或者更换登录设备,都需要重新添加后端server信息。

大家自行根据环境选择不同的方式吧。

第一种方式:

docker run --name shlink-web-client -d --restart=always \
  -p 9050:80 \
  -e SHLINK_SERVER_URL=http(s)://example.com \
  -e SHLINK_SERVER_API_KEY=xxxxxxxxxxxxxx \
  shlinkio/shlink-web-client

第二种方式:

docker run --name shlink-web-client -d --restart=always \
  -p 9050:80 \
  shlinkio/shlink-web-client

这个就非常简单了,容器搭建好以后直接用http://ip:9050端口访问即可。

通过web-client配置shlink

如果采用第二种方式部署,那么首次登录会看到如下界面:

image.png

点击Add a server:
image.png

name随意,url填后端server的访问地址:https://example.com,API key填前面用命令获得的key,然后点击Create server即可,如下图:
image.png

点击右边的3个竖点,选第一个Connect:
image.png

成功即可登录服务器:
image.png

进入后就是Overview界面,右边可以看到一些统计信息,包括有多少短链接,多少标记,以及多少访问等,在这个界面也可以使用右边的Create a short URL开始创建短链接。
image.png

点开红框中的高级选项,就可以看到我们前面看到的界面:
image.png

左边红框中URL to be shortened就是填写长链接的地方,其他的众多选项大家自己去研究就好了,最后点最下方的save即可生成短链接。

大功搞成。

总结:其实长链接改短链接,就是当大家通过生成的短链接访问到后端server的时候,后端server根据这条短链接对应的长链接,返回给大家一个301或者302的重定向并指向原本的长链接,就这么简单,如果访问量大对服务器的性能消耗还是不可小觑的,这点大家要注意。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       
error:
zh_CN
春节
快乐