恢复网站

缘由

2023.11:当时就 frp 相关实验修改了 Nginx 和 SSL 证书配置,之后证书于 2024.1 过期,之后没有续签,故而网站无法正常访问。

2024.3.5:准备来处理这个问题。本来以为只需续签,结果显示无法续签。怀疑是之前(2023.11)在调整相关配置的时候将原本的配置打乱了,于是直接删除了原先的所有配置,以图直接重新签证书——但是导致更多配置错误,故而不得不全部重来。

记录一下我当时干了什么:

  1. 寻找所有的 .pem 文件(我以为删除了就好了)。
find / -name "*.pem"
  1. 在结果中找出了合适的结果并进行了删除(仅示例),还顺手删除了所有 Nginx 配置(这个估计是问题原因)。
rm -rf dir1 dir2 dir3

导出数据

首先是数据库中的数据:

mysqldump -uroot -p --databases www_sheniao_top > t.sql

需要输入密码,然而我忘了,最后发现宝塔面板的数据库这里有。

之后恢复:

mysql -uroot -p www_sheniao_top < t.sql

其次是 Typecho 网站上提到的一些文件:https://docs.typecho.org/upgrade,即保存 /usr 目录。

大致回顾之前建站过程

因为是重置网站,域名注册、域名实名认证、购买服务器、服务器备案、公安联网备案的部分就不用管了。

再回看这两篇:

大致流程是:

  1. 安装宝塔面板
  2. 点击宝塔一键部署源码,找到 Typecho,设置原数据库名称
  3. 安装完成后,添加第一个网站,如果已经有备案域名,可以直接配置域名映射
  4. 安装 Typecho,拷贝文件后,把原先备份的文件放回原位
  5. 去宝塔面板里创建一个数据库,并导回原数据库

更新:将镜像重置为宝塔 Linux 面板,结果发现软件商店一键部署源码 - 建站里没有 Typecho 了。

于是只能将镜像重置为预设好的 Typecho 1.1,描述为:

Typecho 是开源的博客建站平台,具有轻量、高效、稳定等特点,操作界面简洁友好。该镜像基于 Alibaba Cloud Linux 3 操作系统,PHP 7.4,MySQL 8.0,Nginx 1.18。"

上手

有好几层密码,别记混了。

  1. 服务器密码:首先需要修改的就是这个。
  2. 依照提示获取 Typecho 管理员账号和密码。
  3. 依照提示获取数据库账号和密码。

首先恢复原有数据,将 /usr 文件夹放到相应位置。Typecho 网站根目录可依照提示获得。

tar -zxvf 文件名.tar.gz

由于不确定现在这个数据库的名称,所以先查看。

  1. 首先登录到 MySQL 数据库服务器。使用以下命令,其中 -u 后面是您的用户名,-p 后面是您的密码:

    mysql -u your_username -p

    your_username 替换为数据库实际用户名。

  2. 输入正确的密码后,将进入 MySQL 监视器。在此处可执行 SQL 命令。
  3. 要列出所有数据库,请输入以下命令:

    SHOW DATABASES;

    这将返回一个包含所有数据库名称的结果集。

查看的结果是名称为 typecho,故而对 sql 文件进行相应修改。

之后执行命令导回数据:

mysql -uroot -p typecho < t.sql

SSL 证书

这次不想使用 Certbot 和手动 DNS 设置了,换 acme.sh

参考:https://zhuanlan.zhihu.com/p/347064501

虽然是挺不错的参考文章,但是文章前面结构不太行,很容易被误导。

另外有两个小问题,作者忘记了 acme 的注册步骤;以及 Nginx SSL 配置,其中 ssl_ciphers 给的例子似乎无法通过,我根据 Copilot 提示换成了 HIGH:!aNULL:!MD5:!EXPORT56:!EXP

大概有这样几个步骤:

  1. 安装 acme.sh
  2. 签发 SSL 证书

    1. acme.sh 的注册
    2. 第一步,验证你的域名所有权
    3. 第二步,签发证书,可选 ECC 证书
    4. 此外如有需要,还可进行多域名配置和泛域名配置
  3. 安装(复制)证书(Nginx 和 Apache 两种写法)
  4. 生成 dhparam.pem 文件(可选)
  5. 配置 Nginx
  6. 查看自动更新证书配置

关于验证域名所有权,有这两种途径:

  1. HTTP 验证,下面三种 mode 看情况选择

    1. Webroot mode
    2. Apache / Nginx mode
    3. Standalone mode
  2. DNS 验证,下面三种 mode 看情况选择

    1. DNS API mode
    2. DNS manual mode
    3. DNS alias mode

下面简要记录设置过程:

# 安装 acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc
acme.sh -h

# 签发 SSL 证书
## 命令行提示要注册
acme.sh --register-account -m shirou-emiya2002@outlook.com
## 使用 HTTP 验证,选择 Webroot mode,只需要最后的命令
acme.sh --issue -d sheniao.top -w /usr/share/nginx/html
## 多域名配置
acme.sh --issue -d sheniao.top -w /usr/share/nginx/html -d www.sheniao.top -d heres.top -d www.heres.top
## 签发 ECC 证书
acme.sh --issue -w /usr/share/nginx/html -d sheniao.top -d www.sheniao.top -d heres.top -d www.heres.top --keylength ec-256

# 查看自动更新证书配置
## 查看 acme.sh 自动更新任务
crontab -l

# 强制更新
acme.sh --renew -d sheniao.top --force
acme.sh --renew -d sheniao.top --force --ecc  # 如果用的是 ECC 证书

# 停止更新
acme.sh --list # 查看证书列表
acme.sh --remove -d sheniao.top [--ecc] # 停止 Renew,然后手动把目录下的证书移除

关于 Nginx 配置

本次相关参考:

将证书复制到 Nginx 目录下:

# 安装(复制)证书
acme.sh --installcert -d sheniao.top \
--key-file   /etc/nginx/ssl/sheniao.top.key \
--fullchain-file /etc/nginx/ssl/sheniao.top.fullchain.cer \
--reloadcmd  "service nginx force-reload"

# 生成 dhparam.pem 文件(可选)
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

# Nginx SSL 相关配置

## 修改网站的 conf 配置文件,加入 SSL 相关配置
### ssl_certificate /etc/nginx/ssl/sheniao.top.fullchain.cer;
### ssl_certificate_key /etc/nginx/ssl/sheniao.top.key;
### ssl_dhparam /etc/nginx/ssl/dhparam.pem;
### ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
### ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
### ssl_prefer_server_ciphers on;

## 重启 nginx
nginx -t
systemctl restart nginx

最后配置:

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl http2 default_server; # IPv4
    listen [::]:443 ssl http2 default_server; # IPv6
    server_name sheniao.top www.sheniao.top heres.top www.heres.top;
    root /usr/share/nginx/html;

    ssl_certificate /etc/nginx/ssl/sheniao.top.fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/sheniao.top.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
    ssl_prefer_server_ciphers on;

    # 301 重定向 http -> https
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    location / {
        index index.php index.html index.htm;
    }

    # 实现伪静态化,没有这个会出现这样的问题:
    # 只有首页能访问,访问其它页页面报 404 错误
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?q=$1 last;
    }

    # PHP 设置:PHP -> FastCGI
    include /etc/nginx/default.d/*.conf; # 实际上这里载入了其中的 php.conf
    # index index.php index.html index.htm;
    # location ~ \.(php|phar)(/.*)?$ {
    #     fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
    #
    #     fastcgi_intercept_errors on;
    #     fastcgi_index  index.php;
    #     include        fastcgi_params;
    #     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    #     fastcgi_param  PATH_INFO $fastcgi_path_info;
    #     fastcgi_pass   php-fpm; # php-fpm 就是前面的 server unix:/run/php-fpm/www.sock
    # }


    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

后记

之后等当前服务器到期之后就要迁移了,此次恢复倒是起到了准备作用。

  1. 积极备份文件,导出数据库和必需的文件
  2. 记录各级密码
  3. Nginx 设置也要保存

另外积极使用 Copilot 来提问帮了我很多忙,比如解读 Nginx 设置。

最后修改:2024 年 05 月 12 日
如果觉得我的文章对你有用,请随意赞赏