跳到主內容

YOURLS 縮址服務 - Debian

  BUBU 使用 BookStack 服務在 po 連接文章給社群朋友們有點過長,想說使用短址服務來給社群朋友們使用,目前有比較常使用到 ptt 縮址服務產出來的連接使用,但是這樣子比較不太方便,想要了解目前給的連接服務被點來看機率有多高,在尋找的時候剛好有一個套件 YOURLS 服務有開源功能還滿其全的可以剛好又可以自行架設,記錄一下如何安裝及基本使用

2024.06.03 系統修改為 Debian 系統,PHP 版本會改用 8.3 版

運行環境


環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式

  • 系統環境: Debian 12
  • Web 服務: Nginx 1.26
  • PHP 服務: PHP 8.3
  • 資料庫服務: MariaDB 10.11

安裝過程


WEB 服務安裝

  請直接參考本站另一篇獨立安裝 Nginx 服務 Nginx 模組擴充 - Debian \ Ubuntu

資料庫服務

  請直接參考本站另一篇獨立安裝 MariaDB 服務 在 Debian 系統上安裝 MariaDB

  • 建立 Yourls 的資料表庫
# 登入資料庫裡設定資表及權限
mariadb -u root -p

# 在資料庫裡新增yourls表單
CREATE DATABASE IF NOT EXISTS yourls DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON yourls.* TO 'yourls_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; #密碼請自己輸入好記錄的密碼
FLUSH PRIVILEGES;
quit;
PHP 服務設定

  • 下載 GPG 密鑰
sudo apt update
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common
  • 新增 PHP 來源庫
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
  • 導入金鑰
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
  • PHP 套件安裝
apt install gcc curl php8.3 php8.3-{common,mysqlnd,pdo,xml,mbstring,fpm,mysql,gd,cli,opcache,curl,ldap,odbc,xmlrpc,soap,intl,zip,bcmath} -y
  • 安裝好 PHP 修改 php.ini 設定檔
# 設定時區
sed -i "s|^;date.timezone =.*$|date.timezone = Asia/Taipei|" /etc/php/8.3/fpm/php.ini
sed -i "s|^;date.timezone =.*$|date.timezone = Asia/Taipei|" /etc/php/8.3/cli/php.ini
# 設定安全性
sed -i "s|^;cgi.fix_pathinfo=1.*$|cgi.fix_pathinfo=0|" /etc/php/8.3/fpm/php.ini
sed -i "s|^;cgi.fix_pathinfo=1.*$|cgi.fix_pathinfo=0|" /etc/php/8.3/cli/php.ini
  • 重啟及開機自動啟動 php-fpm 服務
systemctl start php8.3-fpm && systemctl enable php8.3-fpm
or
systemctl enable --now php8.3-fpm
YOURLS 服務

  • 建立目錄
mkdir -p /var/www/html
  • 到 web 服務目錄下將 YOURLS 檔案下載
cd /var/www/html/
# 用 git 方式下載
git clone https://github.com/YOURLS/YOURLS
# 修改名稱
mv YOURLS/ yourls/
  • yourls 設定檔
cd /var/www/html/yourls/user/

# 修改設定檔
cp config-sample.php config.php

vim config.php
  • 修改內容如下
# 資料庫連接
/** MySQL database username */
define( 'YOURLS_DB_USER', 'your db user name' );

/** MySQL database password */
define( 'YOURLS_DB_PASS', 'your db password' );

/** The name of the database for YOURLS */
define( 'YOURLS_DB_NAME', 'yourls' );

/** MySQL hostname.
 ** If using a non standard port, specify it like 'hostname:port', eg. 'localhost:9999' or '127.0.0.1:666' */
define( 'YOURLS_DB_HOST', 'localhost' );

# 修改成該站台的連線網域
/** YOURLS installation URL -- all lowercase, no trailing slash at the end.
 ** If you define it to "http://sho.rt", don't use "http://www.sho.rt" in your browser (and vice-versa) */
define( 'YOURLS_SITE', 'http://your-own-domain-here.com' );

# 管理者或其他使用者的帳號及密碼
/** Username(s) and password(s) allowed to access the site. Passwords either in plain text or as encrypted hashes
 ** YOURLS will auto encrypt plain text passwords in this file
 ** Read http://yourls.org/userpassword for more information */
$yourls_user_passwords = array(
	'username' => 'password', // username 修改成管理者帳號、password 修改成管理者密碼
	// 'username2' => 'password2',
	// You can have one or more 'login'=>'password' lines
	);
  • 權限設定
chown -R www-data:www-data /var/www/html/yourls/
Nginx 設定檔

  • 服務設定檔 vim /etc/nginx/conf.d/xxx.conf
server {
# 這個主機的 Port
    listen 80;
# 這個主機的名稱
    server_name 網域網名;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}
#
server {
# 使用 https 和 http/2 協定
    listen 443 ssl;
    http2 on;
# 上述的 IPv6 方式
    listen [::]:443 ssl;
    server_name 網域網名;
    root /var/www/html/yourls;
#
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
#
# SSL 憑證證書路徑
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
# 私鑰路徑
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 緩存有效期
    ssl_session_timeout 1d;
# 緩存憑證類型和大小
    ssl_session_cache shared:SSL:50m;
#
# intermediate configuration. tweak to your needs.
#
# 使用的加密協定
    ssl_protocols TLSv1.3 TLSv1.2;
# 加密演算法,越前面的優先級越高
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
# 交握過程使用 Server 的首選加演算法,這裡使用 Client 為首選
    ssl_prefer_server_ciphers on;
#
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
#
# 增加 http header
    add_header Strict-Transport-Security max-age=63072000;
#
    access_log /var/log/nginx/ys_access.log;
    error_log /var/log/nginx/ys_error.log;
#
    client_max_body_size 1G;
    fastcgi_buffers 64 4K;
#
# html 檔
    location / {
# 使用「瀏覽器」瀏覽根目錄時,未指定檔名時預設使用的檔案
        index index.php index.html index.htm;
        autoindex off;
        try_files $uri $uri/ /yourls-loader.php;
    }
    location = /50x.html {
        root /usr/share/nginx/html;
    }
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
# php 檔
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        try_files $uri =404;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }
#
    location ~* \.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires 30d;
        log_not_found off;
    }
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
    location ~ /\.ht {
        deny all;
    }
# 發生 404 指定導向哪個網頁
#error_page  404              /404.html;
# redirect server error pages to the static page /50x.html
#
    error_page 500 502 503 504  /50x.html;
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
# location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}
#
}
  • 反代理設定檔
server {
    listen 80;
    server_name 網域名稱;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}
#
server {
# 使用 https 和 http/2 協定
    listen 443 ssl http2;
# 上述的 IPv6 方式
    listen [::]:443 ssl http2;
    server_name 網域名稱;
#
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
#
# SSL 憑證證書路徑
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
# 私鑰路徑
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 緩存有效期
    ssl_session_timeout 1d;
# 緩存憑證類型和大小
    ssl_session_cache shared:SSL:50m;
#
# intermediate configuration. tweak to your needs.
#
# 使用的加密協定
    ssl_protocols TLSv1.3 TLSv1.2;
# 加密演算法,越前面的優先級越高
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
# 交握過程使用 Server 的首選加演算法,這裡使用 Client 為首選
    ssl_prefer_server_ciphers on;
#
    access_log /var/log/nginx/ys_access.log;
    error_log /var/log/nginx/ys_error.log;
#
    location / {
        proxy_pass https://服務主機;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_pass_header Authorization;
    }
#
    location ~* \.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        proxy_pass https://服務主機;
    }
#
    location /nginx-status {
        stub_status on;
        access_log off;
# 允許看到的 IP
        allow 127.0.0.1;
        deny all;
    }
}

YOURLS 登入方式


  • 開啟瀏灠器 http://主機名稱/admin,按下安裝 YOURLS

ys-01.png

  • 這是服務安裝完成並且已建立好資料庫的資訊,按下 YOURLS 管理頁面

ys-02.png

  • 登入成功的畫面

ys-03.png

  • 由於 YOURLS 沒有 index.php 檔,需要手動增加,不然會出現404錯誤
<php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://yourdomain.com/admin");
>
  • 或者在 Nginx 設定檔上直接指向到 admin 目錄下
YOURLS 中文化

  • 因預設是中文,BUBU 我有 GOOGLE 一下有到有好心人放在 GitHub 上翻成繁體中文,登出再登入就中文化了,下載方式如下
cd ~
# 下載中文檔
wget https://github.com/alexclassroom/YOURLS-zh_TW/archive/refs/tags/v1.9.2.tar.gz
# 解壓縮
tar -zxvf v1.9.2.tar.gz
# 語系檔移動到 YOURLS 語系目錄下
cd YOURLS-zh_TW-1.9.2/
mv zh_TW.mo /var/www/html/yourls/user/languages
mv zh_TW.po /var/www/html/yourls/user/languages
  • 修改 yourls 設定檔 vim /var/www/html/yourls/user/config.php
# 修改前
/** YOURLS language
 ** Change this setting to use a translation file for your language, instead of the default English.
 ** That translation file (a .mo file) must be installed in the user/language directory.
 ** See http://yourls.org/translations for more information */
define( 'YOURLS_LANG', ' ' ); 

# 修改後
/** YOURLS language
 ** Change this setting to use a translation file for your language, instead of the default English.
 ** That translation file (a .mo file) must be installed in the user/language directory.
 ** See http://yourls.org/translations for more information */
define( 'YOURLS_LANG', 'zh_TW' );

YOURLS 外掛使用


Random ShortURLs

  • 在管理外掛裡面已有 Random ShortURLs 隨機產生 short URL link 直接啟用該外掛

YOURLS-U-SRV

wget https://github.com/joshp23/YOURLS-U-SRV/archive/refs/tags/2.3.4.tar.gz
  • 解壓剛剛下載好檔案
tar -zxvf 2.3.4.tar.gz
  • 將解壓出來的 usrv 目錄移到 Yourls 目錄下
cd YOURLS-U-SRV-2.3.4

mv usrv /var/www/html/yourls/user/plugins/
  • 移動過去後到後台的管理外掛去啟動該服務

ys-usrv.png

  • 設定 usrv 服務

ys-usrv-02.png

  • 選擇 config

ys-usrv-03.png

  • 設定快取存放地方,這個可以自動指定位置

ys-usrv-04.png

  • 設定權限
chown -R www-data:www-data /var/www/html/yourls/
YOURLS-IQRCodes

wget https://github.com/joshp23/YOURLS-IQRCodes/archive/refs/tags/2.3.1.tar.gz
  • 解壓該套件
tar -zxvf 2.3.1.tar.gz
  • 解壓後套件移動到 Yourls 目錄下
cd YOURLS-IQRCodes-2.3.1

mv iqrcodes /var/www/html/yourls/user/plugins/
  • 用超連結或複製檔案 qrchk.php 服務放到 pages 目錄下
Symlink:
    ln -s user/plugins/iqrcodes/assets/qrchk.php user/pages/qrchk.php
Copy:
    cp user/plugins/iqrcodes/assets/qrchk.php user/pages/qrchk.php
  • 因我是用 nginx web 服務運行,所以還要修改一段指令,不然產生出來會無法正常顯示圖片
# 修改前
try_files $uri $uri/ /yourls-loader.php;

#修改後
if (!-e $request_filename){ rewrite ^(.+)$ /yourls-loader.php?q=$1 last; }
  • 移動完之後到管理後台啟動該服

ys-qrcode-01.png

  • 產生舊的連結 QR-Code 出來,在 Run 要打勾

ys-qrcode-02.png

  • 顯示結果如下

ys-qrcode-03.png

  • 設定權限
chown -R www-data:www-data /var/www/html/yourls/



參考相關網頁