最近我想利用Oracle的免费套餐来免费托管我的低端网站。迁移到Oracle免费套餐后,我现在每月可以省下5美元,这笔钱原本是用来支付网站运行所在的VPS服务器的费用。
几天前, Low End Box发表了一篇关于我如何在 Oracle 免费套餐上设置 Caddy 服务器的文章。
在 Oracle 免费套餐实例中安装 Caddy 后,下一步是将我的网站文件从旧服务器迁移到新服务器。
为了移动文件,我使用了scp(1),即安全复制。安全复制, scp(1),是最初实现安全复制协议的命令。
本文探讨了使用 scp(1) 将文件从一台服务器复制到另一台服务器的简便方法。我们以我的网站从原服务器迁移到 Oracle 免费套餐为例进行说明。同时,我们也提供了一些实用建议,以便在出现问题时能够更安全地进行文件传输。
备份旧网站
首先,我们来备份旧网站。备份很重要!
在旧服务器上,我以 root 用户身份操作,如果误输了一些命令,就会惹上麻烦。因此,我想在迁移网站之前,先备份 /root 目录下的文件以及 /var/www/html 目录下的网站文件。
bash:~$ ssh [email protected]
Linux metalvps 5.10.0-8-amd64 #1 SMP Debian 5.10.46-5 (2021-09-23) x86_64
Debian GNU/Linux 系统附带的程序均为自由软件;
每个项目的具体分配条款均在以下文件中描述:
/usr/share/doc/*/copyright 中的单个文件。
Debian GNU/Linux 绝对不提供任何形式的担保。
在适用法律允许的范围内。
上次登录时间:2022年9月18日星期日 20:19:42,来自 200.68.171.136
root@metalvps:~# cd /
root@metalvps:/# 日期
2022年9月18日星期日 20:52:41 UTC
root@metalvps:/# tar cvzf metalvps.com-202209182052.tgz var/www/html root
var/www/html/
[...] 文件 [...]
根/
[...] 文件 [...]
root@metalvps:/#
现在旧服务器上多了一个tar压缩包。这个压缩包包含了所有待传输文件的额外副本,以防万一发生什么意外情况。
新盒子的管理设置不同
新服务器的管理配置与旧服务器略有不同。按照 Oracle 的默认设置,我在新服务器上并非以 root 用户身份操作,而是以名为 opc 的普通用户身份操作。不过,opc 可以执行 root 命令(执行“特权”操作),因为 opc 拥有sudo 权限。为了方便起见,我们将在新服务器的 /home/opc 目录下执行一些在旧服务器 /root 目录下执行的操作。
在新服务器上生成 SSH 密钥
要使用 scp(1) 命令,我们首先需要在新服务器上生成 SSH 密钥。我们需要这些新生成的密钥才能从新服务器直接访问旧服务器。因此,我们连接到新服务器,切换到 .ssh 目录,然后生成密钥。
bash:~$ ssh [email protected]
Activate the web console with: systemctl enable --now cockpit.socket
上次登录时间:2022年9月18日星期日 20:28:36,来自 187.189.238.1
[opc@instance-20220717-1620 ~]$ cd .ssh
[opc@instance-20220717-1620 .ssh]$ ssh-keygen -t ed25519
生成公钥/私钥 ed25519 对。
请输入要保存密钥的文件(/home/opc/.ssh/id_ed25519):
请输入密码(留空表示不设置密码):
再次输入相同的密码:
您的身份信息已保存在 /home/opc/.ssh/id_ed25519 中。
您的公钥已保存在 /home/opc/.ssh/id_ed25519.pub。
[...]
[[email protected]]$ ls
authorized_keys id_ed25519 id_ed25519.pub
[[email protected]]$
备份新盒子
所以,在新服务器上,我想把旧服务器的根目录内容放到 opc 的主目录中。因此,我想备份 /home/opc 目录在迁移前的内容,以防迁移过程中出现问题需要恢复。
[opc@instance-20220717-1620 home]$ sudo tar cvzf opc-202209182117.tgz opc
opc/
[ . . . files . . . ]
[opc@instance-20220717-1620 ~]$
此时新服务器上还没有 /var/www 目录,所以无需备份。
[opc@instance-20220717-1620 ~]$ cd /var; ls
account crash ftp kerberos lock nis preserve tmp
adm db games lib log oled run yp
cache empty gopher local mail opt spool
[opc@instance-20220717-1620 var]$
启用从旧服务器到新服务器的直接 SSH 访问
首先,打开新盒子看看!
我们使用 cat 命令显示新生成的公钥。将密钥复制到剪贴板:确保密钥中没有换行符。用鼠标选中密钥,然后按 Ctrl+C。
[opc@instance-20220717-1620 .ssh]$ cat id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHsyzJ1ev5mmmbVh13GpvV+qVQHg1QQ/T+5kXR9p/+5J opc@instance-20220717-1620
[opc@instance-20220717-1620 .ssh]$
第二,在旧盒子里
使用 echo(1) 将新密钥添加到 .ssh 目录下的 authorized_keys 文件中。输入 echo。从剪贴板粘贴密钥,输入两个“大于”符号,输入 authorized_keys,然后按回车键。
root@metalvps:/# cd .ssh
echo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHsyzJ1ev5mmmbVh13GpvV+qVQHg1QQ/T+5kXR9p/+5J opc@instance-20220717-1620 >> authorized_keys
root@metalvps:/#
使用 scp(1) 复制根目录文件
我们来迁移根目录下的文件。虽然这些文件并非网站的一部分,但我想要将它们从根目录迁移到新服务器上。当然,对于其他任何需要迁移的目录,操作步骤都类似。
[opc@instance-20220717-1620 ~]$ scp -pr [email protected]:/root root-old
Enter passphrase for key '/home/opc/.ssh/id_ed25519':
[ . . . files . . . ]
[opc@instance-20220717-1620 ~]$
让我们确认所有文件都已就位。
[opc@instance-20220717-1620 ~]$ ls -aR root-old/
[ . . . files . . . ]]
[opc@instance-20220717-1620 ~]$
创建 /var/www 目录
[opc@instance-20220717-1620 ~]$ cd /var
[opc@instance-20220717-1620 var]$ ls
[opc@instance-20220717-1620 var]$ sudo mkdir www
目录权限设置是否正确?
[opc@instance-20220717-1620 var]$ ls -l | grep www
drwxr-xr-x. 2 root root 6 Sep 18 22:24 www
[opc@instance-20220717-1620 var]$
使用 scp(1) 复制站点文件
让我们把网站文件从旧服务器复制到新服务器。
[opc@instance-20220717-1620 var]$ cd www
[opc@instance-20220717-1620 www]$ sudo scp -i /home/opc/.ssh/id_ed25519 -pr [email protected]:/var/www/html .
所有需要的文件都在那里吗?
[opc@instance-20220717-1620 html]$ ls
文件很多!
文件权限是否正确?
[opc@instance-20220717-1620 www]$ ls -l
total 4
drwxr-xr-x. 7 root root 4096 Sep 17 03:22 html
[opc@instance-20220717-1620 www]$ cd html
[opc@instance-20220717-1620 html]$ ls -l
文件很多!
之前已安装 Caddy 服务器
在之前的文章中,我们介绍了如何在新的服务器上安装 Caddy 服务器。
Caddyfile 的更改
下一步是对/etc/caddy/Caddyfile.正如 Caddy 默认网页和安装说明中所述,我将 :80 改为 metalvps.com,并将网站根目录改为/var/www/html.
SELinux 运行正常吗?
我第一次在Oracle Cloud上使用Oracle Linux 8.6尝试这个操作时,SELinux阻止了Caddy访问新传输的文件。尝试访问该网站时,我的浏览器只显示空白页面。真糟糕!
幸运的是,我很快在/var/log/messages.这些错误信息也可能出现在sudo journalctl -xe的输出中。
我用谷歌搜索了错误信息:“SELinux 阻止 caddy 对文件 /var/www/html/index.html 进行 getattr 访问”。根据谷歌搜索结果和有用的错误信息,解决方案似乎是运行sudo restorecon -v '/var/www/html/index.html'.我阅读了 restorecon 的手册页并尝试了一下,果然有效。
将监控设置为维护
在更新 DNS 之前,我将Hetrix Tools监控设置为维护模式。

更新 DNS
我前往Porkbun 网站,修改了该网站的 A 和 AAAA 级 DNS 记录。然后我等待了几分钟,让更改生效。
查看新盒子提供的网站服务
DNS更改生效后,我可以看到网站已从新服务器提供服务。

最后一步
一切似乎都运行正常后,我回到 Hetrix,修改了 IP 监控器的数字地址设置,并终止了维护模式。然后,我将网站备份到新服务器上,恢复到刚安装时的状态。当然,我也保留了旧服务器上的所有网站备份。我删除了旧服务器。现在我得想想怎么花掉用 Oracle 云免费套餐省下的数十亿资金了!
日志记录
有趣的是,我最初阅读的 Caddy 安装说明中并没有提到日志记录。服务器在新机器上运行后,我惊讶地发现/var/log下竟然没有 Caddy 日志!要让 Caddy 日志正常工作,需要对 Caddyfile 文件进行额外修改,并且还要解决另一个 SELinux 问题。这些经历将在后续文章中详细介绍。
结论
在本篇和上一篇文章中,我们已经了解了如何在 Oracle Cloud 免费套餐上安装 Caddy 服务器,以及将网站从其他提供商迁移到 Oracle Cloud 的一种方法。
附录:SCP(1)的最新变化
如今,SCP的简单应用看起来和以往一样,尽管其底层运行机制已经发生了变化:
根据版本 8.0 的发布说明:
The scp protocol is outdated, inflexible and not readily fixed. We
recommend the use of more modern protocols like sftp and rsync for
file transfer instead.
-- https://www.openssh.com/txt/release-8.0
根据版本 9.0 的发布说明:
This release switches scp(1) from using the legacy scp/rcp protocol
to using the SFTP protocol by default.
-- https://www.openssh.com/txt/release-9.0