当网站采用全站静态化技术,所有内容都在页面生成之后变为静态文件存储在服务器上,而不是每次用户访问时动态生成。以下是全站静态化的一些优点:

  • 提升网站性能:由于静态页面不需要动态生成,访问静态页面速度更快,减少服务器负载,提升网站的整体性能。

  • 提高网站安全性:静态化可以大大减少服务器暴露给外部的接口,减少被攻击的风险。

  • 改善搜索引擎优化(SEO):搜索引擎更容易理解和索引静态网页,从而提高网站在搜索引擎结果页面中的排名。

  • 降低维护成本:静态页面不需要与数据库进行交互,减少了维护和更新的复杂性和成本。

  • 支持高并发访问:由于静态页面可以直接由服务器返回,而无需经过后端处理,能够更好地应对高并发的访问需求。

请注意,实施全站静态化需要根据具体的网站架构和技术选型进行设计和实施。这些是基本优点,具体情况可能因网站需求和实现方式而有所变化。

全站静态化脚本

创建静态化目录

mkdir -p /data/halo

创建同步目录

mkdir -p /data/sync

创建静态化脚本

vi /data/sync/sync.sh

脚本内容

#!/bin/bash

replaceFileName(){
    keyword=$1 # 要被替换的关键字
    folder=$2 # 目标文件所在的文件夹路径

    [ -d $folder ] && cd $folder
    for file in `ls`
    do
        if [ -f "$file" ]; then
            new_name=$(echo "$file" | sed "s/$keyword//g")
            mv "$file" "$new_name"
        fi
    done
}

cd /data/sync/
wget -r -p -np -k --header="accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" --header="user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" http://127.0.0.1:8090

cd 127.0.0.1\:8090/

sed -i 's/http\:\/\/127.0.0.1:8090//g' ./index.html ./links ./photos
sed -i 's/index.html/\//g' ./index.html ./links ./photos

sed -i 's/http\:\/\/127.0.0.1:8090//g' ./archives/* ./authors/* ./categories/* ./page/* ./tags/*
sed -i 's/index.html//g' ./archives/* ./authors/* ./categories/* ./page/* ./tags/*

replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/css'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/js'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/bootstrap'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/clipboard'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/glightbox'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/highlight'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/iconfont'
replaceFileName '?t=1690208597434' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/iconfont'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/swiper'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/theia-sticky-sidebar'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/tocbot'
replaceFileName '?v=1.0.9' '/data/sync/127.0.0.1:8090/themes/theme-pandapro/assets/plugins/vanilla-lazyload'

cd /data/sync/127.0.0.1\:8090/plugins/PluginCommentWidget/assets/static
wget 'http://127.0.0.1:8090/plugins/PluginCommentWidget/assets/static/style.css?version=1.8.0'

replaceFileName '?version=1.8.0' '/data/sync/127.0.0.1:8090/plugins/PluginCommentWidget/assets/static'
replaceFileName '?22t19m' '/data/sync/127.0.0.1:8090/plugins/PluginLightGallery/assets/static/fonts'
replaceFileName '?version=1.3.1' '/data/sync/127.0.0.1:8090/plugins/PluginSearchWidget/assets/static'

cd /data/sync/127.0.0.1\:8090/

mkdir -p plugins/PluginCommentWidget/assets/static/emoji/
wget 'http://127.0.0.1:8090/plugins/PluginCommentWidget/assets/static/emoji/all.json' -O plugins/PluginCommentWidget/assets/static/emoji/all.json

rsync -av --delete ./ /data/halo/

cd ..
rm -rf 127.0.0.1\:8090/

注:不要照搬照抄,需要修改成适合你自己的脚本。主要是主题相关文件名的替换,插件遗漏文件的补下载。并做好自测。

执行全站静态化脚本

sh /data/sync/sync.sh

设置定时任务

crontab -e
0 2 * * * sh /data/sync/sync.sh > /data/sync/sync.log 2>&1

每天晚上2点更新一次。

caddy2

docker-compose

version: '3.8'
services:
  caddy:
    image: caddy
    container_name: caddy
    restart: unless-stopped
    network_mode: host  
    volumes:
      - /data/caddy/data:/data
      - /data/halo:/data/halo
      - /data/caddy/Caddyfile:/etc/caddy/Caddyfile

Caddyfile配置文件

:80, www.xxx.com:443 {
    encode gzip
    route /* {
        rate_limit {remote.ip} 30r/s 10000 401
        root * /data/halo
        file_server
    }
    route /apis/* {
        rate_limit {remote.ip} 30r/s 10000 401
        reverse_proxy /apis/* 127.0.0.1:8090
    }
    route /actuator/globalinfo {
        rate_limit {remote.ip} 30r/s 10000 401
        reverse_proxy /actuator/globalinfo 127.0.0.1:8090
    }
    route /console* {
        respond "A purely static page site that does not provide console services."
    }
    log {
        output file /data/caddy/logs/access.log {
            roll_size     100MiB
            roll_keep     30
            roll_keep_for 24h
        }
        format json {
            time_format "iso8601"
        }
    }
}

如果不想和后端交互 删除 /apis/*/actuator/globalinfo 配置即可。暴露后端容易被攻击,不暴露后端部分功能不完整,请自行取舍。