Contents
前言
本来,我对长链转短链这个功能没有太大的需求,因为我在用cryptgeon,生成的链接也能设定阅读次数、时间(虽然是分钟为单位),并且还能设置访问密码。不过后来我发现,在不适合用cryptgeon的场合,一些长链接(特别是分享的下载链接),直接发给别人,或者放在网页上,都不雅观,非常的没有逼格,所以被迫研究了下,从3款短链接生成工具(Myurls,YOURLS,shlink)选择了最适合我的一个shlink。
长链转短链工具比较
这里简单对比下这3种工具:
Myurls
简单到极限,界面如下:
简单吧,不过搭建到也不算简单,还要依赖redis,感觉性价比不高的样子。。
YOURLS
这个功能就比Myurls要多一些了,如下:
从上图中可以看出,YOURLS可以看到更多的信息,包括短链接的点击数等,而且YOURLS有登录账号认证,安全方便,这点上其实比myurls和shlink都要好。
shlink
为啥我最终选择了shlink?无图无真相,上图:
Device-specific long URLs:
可以根据不同的访问设备返回不同的长链接,安卓,ios,桌面系统。
Limit access to the short URL:
可以设置短链接最大访问次数,以及生效的时间。
就这2个就很厉害了,更别说还包括:Extra checks,Validate URL可以检查长链接的有效性,不能访问会在点击保存的时候报错;Configure behavior中,Make it crawlable可以让短链接被搜索引擎索引等。而且,还能通过多种维度查看短链接的访问情况,还能定位访客位置,如下图:
所以,我最终选择了shlink,理由充分吧。
注册MaxMind账号
不过,shlink也是最麻烦的,主要是因为需要定位访问者的来源,需要使用到MaxMind的GeoLite2数据库,所以需要去MaxMind注册一个账号,并获取key:
推荐使用第2种方式注册,注册链接如下:
https://www.maxmind.com/en/geolite2/signup?utm_source=kb&utm_medium=kb-link&utm_campaign=kb-create-account
大家自行搞定注册即可,注册成功以后,在如下图最下方位置点击下方红框:
输入描述,然后点击下方的confirm即可生成完毕:
注意,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输出就算成功:
然后执行以下命令获取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
如果采用第二种方式部署,那么首次登录会看到如下界面:
点击Add a server:
name随意,url填后端server的访问地址:
https://example.com
,API key填前面用命令获得的key,然后点击Create server即可,如下图:点击右边的3个竖点,选第一个Connect:
成功即可登录服务器:
进入后就是Overview界面,右边可以看到一些统计信息,包括有多少短链接,多少标记,以及多少访问等,在这个界面也可以使用右边的Create a short URL开始创建短链接。
点开红框中的高级选项,就可以看到我们前面看到的界面:
左边红框中URL to be shortened就是填写长链接的地方,其他的众多选项大家自己去研究就好了,最后点最下方的save即可生成短链接。
大功搞成。
总结:其实长链接改短链接,就是当大家通过生成的短链接访问到后端server的时候,后端server根据这条短链接对应的长链接,返回给大家一个301或者302的重定向并指向原本的长链接,就这么简单,如果访问量大对服务器的性能消耗还是不可小觑的,这点大家要注意。