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
占用了80
和443
端口,所以启动服务应该是失败的。
不过没关系,后面会解决的。
放置证书
我的证书放置在/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
到此,就配置完成啦。