WWW.NEKOPARA.UK is down!

昨天,大概中午12点,我家里云失联了!
我以为是停电了,打电话回去询问情况,然后才知道是因为断网。
光猫光信号闪红灯
然后我自己的全部服务都无法使用了(
众所周知,网站掉线会导致搜索引擎掉排名。于是,我想,能不能用我的云服务器搞个镜像服务器,以便于家里云出问题的时候,至少保持网站处于可访问状态。就有了如下的故事:

设置Hosts文件

编辑Host文件定义本地回环地址为网站,方便爬取。

nano /etc/hosts

加上这行:

127.0.0.1 www.nekopara.uk

镜像网站

经过与通义千问的友好技术交流,并尝试了多个工具后,我决定用wget进行网站的镜像工作。

wget --mirror --convert-links --adjust-extension --page-requisites --no-parent -P / https://www.nekopara.uk/

这样我就把网站镜像到了/www.nekopara.uk/这个目录。

安装Httpd

我云服务器使用的是默认的Debian11系统,以下是安装过程:

apt install apache2
a2enmod ssl
systemctl enable --now apache2

因为之前部署HAproxy占用了80443端口,所以启动服务应该是失败的。
不过没关系,后面会解决的。

放置证书

我的证书放置在/certs/目录下:

root@ali-nekoproxy-hk:~# tree /certs/
/certs/
├── le-chain.pem
├── nekopara_uk.key
└── nekopara_uk.pem

创建/修改配置文件

修改端口

配置文件是/etc/apache2/ports.conf,以下是修改后的内容:

Listen 8080

<IfModule ssl_module>
        Listen 8443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 8443
</IfModule>

我把http端口改成了8080,https改成了8443。

创建网站配置文件

使用nano/etc/apache2/conf-enabled/目录创建一个配置文件:

nano /etc/apache2/conf-enabled/nekopara.conf

文件内容如下:

<IfModule mod_ssl.c>
    <VirtualHost *:8443>
        ServerAdmin chocola@nekopara.uk
        ServerName www.nekopara.uk
        DocumentRoot /www.nekopara.uk

        # SSL Configuration
        SSLEngine on
        SSLCertificateFile /certs/nekopara_uk.pem
        SSLCertificateKeyFile /certs/nekopara_uk.key
        SSLCertificateChainFile /certs/le-chain.pem

        <Directory /www.nekopara.uk>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/nekopara_error.log
        CustomLog ${APACHE_LOG_DIR}/nekopara_access.log combined
    </VirtualHost>
</IfModule>

保存后,重启Httpd:

systemctl restart apache2

此时,访问 https://www.nekopara.uk:8443 就会出来镜像的网站了。
虽然元素有一些缺失了,不过无所谓,反正只是个备胎。

配置HAproxy实现宕机自动切换

HAproxy的配置文件位于:/etc/haproxy/haproxy.cfg
编辑这个配置文件:

nano /etc/haproxy/haproxy.cfg

然后增加备用服务器设置,增加后配置文件内容如下:

#---------------------------------------------------------------------
# 全局设定部分
#---------------------------------------------------------------------
global
 
defaults
    log                     global
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# 定义DNS解析器
#---------------------------------------------------------------------
resolvers dns1
    nameserver internal-dns 1.1.1.1:53
    resolve_retries 3
    timeout resolve 10s
    timeout retry 10s
    hold other 30s
    hold refused 30s
    hold nx 30s
    hold timeout 30s
    hold valid 10s
    hold obsolete 30s

#---------------------------------------------------------------------
# 接管HTTP流量实现302跳转HTTPS
#---------------------------------------------------------------------
frontend http
    bind :80 accept-proxy
    mode http

    redirect scheme https code 302 if { hdr(Host) -i www.nekopara.uk } !{ ssl_fc }
 
#---------------------------------------------------------------------
# 通过SNI Proxy对HTTPS流量实现四层转发
#---------------------------------------------------------------------
frontend https_proxy
    mode tcp
    bind :443
    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    acl is_www.nekopara.uk req_ssl_sni -i www.nekopara.uk
    use_backend www.nekopara.uk if is_www.nekopara.uk


backend www.nekopara.uk
    mode tcp
    balance roundrobin
    option tcp-check
    server  ddns-1 origin.nekopara.uk:3939 resolvers dns1 resolve-prefer ipv4 check send-proxy
    server backup-server 127.0.0.1:8443 backup

保存后,重启HAproxy

systemctl restart haproxy

这样就配置完成了。尝试在家停掉家里云的web服务器,一样可以访问博客,不过不完整了,部分内容缺失。

设置计划任务每天从家里云镜像博客

cron有玄学问题,最好是创建shell脚本执行任务。
在根目录创建一个download_nekopara.sh文件。

cd /
nano download_nekopara.sh

文件内容如下:

#!/bin/bash

cd /

# 定义下载目录
DOWNLOAD_DIR="/path/to/download"

# 创建下载目录(如果不存在)
mkdir -p "$DOWNLOAD_DIR"

# 使用wget下载网站
/usr/bin/wget --mirror --convert-links --adjust-extension --page-requisites --no-parent -P "$DOWNLOAD_DIR" https://www.nekopara.uk/

给文件执行权限:

chmod +x ./download_nekopara.sh

使用cronrab设置计划任务,选择用nano打开:

root@ali-nekoproxy-hk:/# crontab -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]: 1
crontab: installing new crontab

在打开文件后面加上这行:

0 2 * * * /download_nekopara.sh

然后按F2保存退出。然后使用crontab -l确认一下是否生效:

root@ali-nekoproxy-hk:/# crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

0 2 * * * /download_nekopara.sh

到此,就配置完成啦。