重装了服务器系统,ssh证书更换,导致连不上服务器

今天重装了一台服务器,由debian改为ubuntu,使用阿里云重新绑定了密钥对,导致服务器连接失败。错误信息如下:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
……
Host key verification failed.

这个报错信息说明 服务器的主机密钥(Host Key)发生了变化,SSH 客户端发现和之前保存的不一致,所以拒绝连接。常见原因有:

  1. 服务器重装过系统,SSH 的 host key 变了。
  2. 更换了 IP 或 DNS 指向,连接到的机器其实不是原来的。
  3. 安全风险:如果不是你自己操作导致的变动,有可能存在中间人攻击(MITM)。

解决办法

如果你确认这是自己的服务器(比如你刚刚重装了系统或者更换了 SSH 配置),可以安全地删除旧的 key 再重新连接。

执行命令:

ssh-keygen -R server-ip

注意把server-ip改为你的服务器ip地址。这个命令是从~/.ssh/known_hosts文件中删除之前的连接记录,也可以直接编辑这个文件删除。

然后再次连接,会提示你保存新的主机指纹,输入 yes 即可。


如果提示Permissions 0644 for ....... are too open.这是证书文件的权限太大了,SSH 要求私钥文件必须 仅自己可读写,不能被其他用户访问。

执行下面的命令,修改私钥文件权限(只允许自己读写):

chmod 600 /Users/wujie/.ssh/aliyun99.pem

注意改为你自己的密钥路径,最后再次连接应该就可以了。

Git 初次提交:从 0 配置 SSH Key 到成功 push

1. 检查本地是否已有 SSH Key

ls -al ~/.ssh/

如果看到有 id_rsa、id_ed25519 或对应的 .pub 文件,说明已经有过 SSH Key。
如果没有,继续下一步生成。

2. 生成 SSH Key


推荐使用 ed25519 算法(更安全、更快):

ssh-keygen -t ed25519 -C "your_email@example.com"

如果想用 RSA 也可以:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

执行后会提示保存路径,直接回车即可(默认 ~/.ssh/id_ed25519)。
然后一路回车,直到生成完成。

3. 启动 ssh-agent 并添加私钥

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

如果你生成的是 RSA,那么就执行:

ssh-add ~/.ssh/id_rsa

4. 把公钥添加到远程仓库平台


查看公钥内容:

cat ~/.ssh/id_ed25519.pub

复制整行内容,到远程平台(比如 GitHub、GitLab、cnblogs tribe 等)的 SSH Keys 设置里添加。

5. 测试 SSH 连接


执行:

ssh -T git@tribe.cnblogs.com

如果配置正确,会输出类似:

Welcome to Git service...

如果提示 Permission denied (publickey),说明 key 没加对,要检查 .ssh/config 或公钥设置。

6. 配置 Git 远程仓库地址


查看当前远程地址:

git remote -v

如果地址不对(比如是 HTTPS),可以改为 SSH:

git remote set-url origin git@tribe.cnblogs.com:用户名/仓库名.git

7. 首次 push 代码

git add .
git commit -m "init commit"
git push --set-upstream origin main

如果前面步骤都成功,这里就能顺利把代码推送到远程仓库。

8. 额外(多钥匙管理)


如果你有多个 SSH Key,可以在 ~/.ssh/config 里写配置:

Host tribe.cnblogs.com
    HostName tribe.cnblogs.com
    User git
    IdentityFile ~/.ssh/id_ed25519

这样不同仓库可以指定不同的 key,避免冲突。

✨ 到这里,你就完成了 SSH Key 配置 + Git 初次 push 全流程。

服务器生成登陆密钥证书

在你的电脑上执行一下命令:

ssh-keygen -t rsa -b 4096 -C "bandwagonhost_dc3"

ssh-copy-id -i ~/.ssh/bandwagonhost_dc3.pub -p 22  server-user@server-ip

如果默认端口不是22,需要调整为响应的端口号。

如果本地的私钥丢失了,可以再次执行该命令,重新生成。

上述命令在 Mac 上验证通过,Windows 有待验证。

nginx反代Dash程序报错

昨天收到一个客户求助,用python dash框架开发的程序运行报错了。

客户发来的浏览器控制台报错信息如下:

我们可以看到错误信息是:

Failed to load resource: net::ERR_CONTENT_LENGTH_MISMATCH
Uncaught ReferenceError: DashRenderer is not defined

主要是ERR_CONTENT_LENGTH_MISMATCH这个错误,这个错误通常表示服务器返回的 Content-Length 头指定的内容长度与实际传输的长度不一致。原因可能有:

  • 文件未完整上传或被损坏
  • 被代理服务器(如 Nginx)截断
  • 服务端 gzip 压缩配置错误
  • 虚拟环境中的某些包没有正确安装或版本不匹配

查看了一下服务器环境,是通过nginx反代dash来运行的,首先排除是否是gzip压缩导致的,通过在nginx添加配置gzip off关掉gzip压缩,发现问题仍然存在。

然后尝试关闭nginx缓存:

proxy_buffering off;

问题解决!!

🔧 proxy_buffering off; 的作用

默认情况下,Nginx 会先把后端服务器的响应内容缓存到内存或磁盘中,等缓冲区装满或者传输结束后,再统一返回给客户端。这就是所谓的“响应缓冲”。

而设置:proxy_buffering off;则是告诉 Nginx:“不要缓存响应数据,而是直接把后端返回的数据一点一点地实时转发给客户端。”

在客户发来的错误截图中,可以看到,Dash 应用中,浏览器需要加载很多 JS 资源,比如:dash_core_components.min.js、dash_renderer.min.js,这些资源文件一般通过 Flask(或 Dash)后台动态提供给浏览器。如果 Nginx 开启了 proxy_buffering,但配置不当(例如 Content-Length、gzip 等不一致),就可能导致:

  • 浏览器收到的数据长度不对(出现 ERR_CONTENT_LENGTH_MISMATCH)
  • JavaScript 文件加载失败,从而导致 DashRenderer is not defined

关闭 proxy_buffering 后,Nginx 不再尝试缓存和处理这些文件,而是原样转发给浏览器,避免了出错。

在 Debian 12 上确定 Certbot 是否会自动续期

在 Debian 12 系统上,Certbot 通常会自动配置证书续期。您可以通过以下方法确认:

1. 检查 systemd 计时器

systemctl list-timers | grep certbot

正常情况下,您应该能看到 certbot.timer 被启用并计划在特定时间运行。

2. 检查 cron 配置

如果使用 cron 而不是 systemd:

cat /etc/cron.d/certbot

或查看当前用户的 crontab:

crontab -l | grep certbot

3. 执行模拟续期测试

sudo certbot renew --dry-run

这会模拟证书续期过程,确认一切配置正常。

4. 检查 Certbot 配置

cat /etc/letsencrypt/renewal/你的域名.conf

确认配置中有 renew_before_expiry 和 autorenew 相关设置。

5. 查看日志记录

sudo journalctl -u certbot

或

sudo cat /var/log/letsencrypt/letsencrypt.log

6. 查看证书信息

sudo certbot certificates

这将显示所有证书及其过期日期信息。

在 Debian 12 上,Certbot 默认会设置自动续期,通常通过 systemd timer 每天尝试续期(仅对即将到期的证书生效,通常是到期前 30 天)。

相关阅读:使用certbot自动获取SSL证书

构建docker出错:max depth exceeded

错误信息如下:

ERROR: failed to solve: failed to prepare cf9f3yt06q7scav6v9oiip1l0 as i3ft5qk817ms85wbfz25o430y: max depth exceeded
ERROR: Service 'web' failed to build : Build failed

解决办法:

首先,尝试清理 Docker 系统:

sudo docker system prune -a

2. 重启 Docker 守护进程

sudo systemctl restart docker

3、执行sudo docker-compose up -d --build重新构建,问题解决!

使用certbot自动获取SSL证书

Certbot 是一个由 EFF(Electronic Frontier Foundation) 推出的开源工具,用于自动从 Let’s Encrypt 获取免费 SSL/TLS 证书,并自动完成证书安装与续期。它极大地简化了为网站启用 HTTPS 的流程。

本文介绍在debian12上使用certbot。

sudo apt update
sudo apt install certbot

sudo docker-compose down  # 停止容器以释放80端口

sudo certbot certonly --standalone -d notes.wujie.me

# 获取证书后,修改 docker-compose.yml 文件挂载新证书

修改 docker-compose.yml 配置

sudo vi docker-compose.yml

将证书挂载部分修改为:

volumes:
  - ../:/var/www/html
  - ./apache/site_host.conf:/etc/apache2/sites-available/000-default.conf
  # 使用 Let's Encrypt 证书
  - /etc/letsencrypt/live/notes.wujie.me/fullchain.pem:/etc/apache2/ssl/server.crt
  - /etc/letsencrypt/live/notes.wujie.me/privkey.pem:/etc/apache2/ssl/server.key

 确保证书可被访问

Let’s Encrypt 证书默认权限较严格,需要确保容器可以读取:

# 添加读取权限
sudo chmod -R 755 /etc/letsencrypt/live
sudo chmod -R 755 /etc/letsencrypt/archive

 更新 Apache 配置

您的 Apache 配置文件site_host.conf 已经正确配置了,不需要修改。它已经引用了:

SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

这正是我们在 docker-compose.yml 中挂载 Let’s Encrypt 证书的位置。

重启 Docker 容器

# 停止当前容器
sudo docker-compose down
# 重新启动容器
sudo docker-compose up -d

自动续期

如果在安装完certbot时,看到Certbot has set up a scheduled task to automatically renew this certificate in the background.,就表示自动续期已经自动设置了。

但您还需要确保证书更新后重启 Docker 容器。创建一个续期钩子脚本:

sudo mkdir -p /etc/letsencrypt/renewal-hooks/post
sudo vi /etc/letsencrypt/renewal-hooks/post/restart-docker.sh

添加以下内容:

#!/bin/bash
cd /your-docker-file/path
docker-compose restart web

设置执行权限:

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/restart-docker.sh

最后重启容器:

sudo docker-compose restart

相关阅读:在 Debian 12 上确定 Certbot 是否会自动续期

屏蔽wordpress后台的自动升级失败提示信息

今天打开给客户做的一个wordpress网站时,发现网站后台出现了一行错误信息:自动升级 WordPress 失败 —— 请再试一次。如下图:

由于这个网站在开发时,为了不自动升级导致网站出问题,所以禁用了wordpress的自动升级功能,所以才会出现这个警告。

那么,怎么办呢?肯定不能把禁用自动升级的代码移除掉,那样就破坏了初衷了,再说如果移除掉自动升级代码,wordpress自动升级导致和环境不兼容,网站出错,那才麻烦。

所以,还是继续堆屎山,想办法把这个提示信息屏蔽掉。

通过F12查看这个提示的CSS类是notice-warning,那么只要使用CSS把它隐藏掉就好了。说干就干,直接上代码:

add_filter('pre_site_transient_update_core', function ($value) {
    if (isset($value->last_checked)) {
        // 模拟移除错误(不推荐修改核心,直接清空错误提示)
        unset($value->updates);
    }
    return $value;
});

add_action('admin_head', function () {
    echo '<style>
        .notice.notice-error, 
        .update-nag,
        .notice.notice-warning {
            display: none !important;
        }
    </style>';
});

把这段代码放到functions.php里面,刷新后台,提示消失!问题搞定!收工!

华为云debian12服务器更新系统报错

错误信息:

E: Failed to fetch https://packages.sury.org/php/pool/main/p/php-defaults/php-common_96%2b0%7e20250402.56%2bdebian12%7e1.gbp84a5b7_all.deb  Temporary failure resolving 'packages.sury.org'
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-bcmath_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Could not connect to packages.sury.org:443 (151.101.111.52), connection timed out
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-zip_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-xml_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-readline_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-opcache_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-mysql_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-mbstring_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-intl_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-gd_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-cli_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-fpm_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-curl_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php8.3/php8.3-common_8.3.20-4%2b0%7e20250414.61%2bdebian12%7e1.gbp1029c4_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/p/php-imagick/php8.3-imagick_3.8.0%7erc2-3%2b0%7e20250408.50%2bdebian12%7e1.gbpd16435_amd64.deb  Unable to connect to packages.sury.org:https:
E: Failed to fetch https://packages.sury.org/php/pool/main/d/debsuryorg-archive-keyring/debsuryorg-archive-keyring_2025.03.13_all.deb  Unable to connect to packages.sury.org:https:
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
错误信息截图

问题分析:

这个错误说明 Debian 12 在更新或安装 PHP 包时,无法连接到 packages.sury.org。这是 PHP 的一个常用第三方源(由 Ondřej Surý 提供),经常用于安装更新版本的 PHP。但现在遇到了类似 DNS 解析失败或连接超时的问题。

解决办法:

出现这个问题的原因,大概率是因为packages.sury.org在国内访问不畅,可以使用以下方法尝试解决:

尝试切换服务器DNS,执行/etc/resolv.conf,添加以下内容:

nameserver 8.8.8.8
nameserver 1.1.1.1

然后再执行:

sudo apt update
sudo apt upgrade

如果还是不能解决,可以那么只能挂代码,或者切换源,不过 sury.org 很少有完整镜像,可能需要手动下载 .deb 包安装。

最后如果都无法解决,可以暂时注释掉 Sury 源。

我是通过修改DNS解决的问题。

debian 清理内核

1、查看已安装的内核:

dpkg --list | grep linux-image

输出类似于:

root@localhost:~# dpkg --list | grep linux-image
rc  linux-image-5.10.0-15-amd64    5.10.120-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-16-amd64    5.10.127-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-17-amd64    5.10.136-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-19-amd64    5.10.149-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-20-amd64    5.10.158-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-21-amd64    5.10.162-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-22-amd64    5.10.178-3                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-23-amd64    5.10.179-3                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-24-amd64    5.10.179-5                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-26-amd64    5.10.197-1                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-27-amd64    5.10.205-2                                     amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-5.10.0-8-amd64     5.10.46-5                                      amd64        Linux 5.10 for 64-bit PCs (signed)
rc  linux-image-6.1.0-17-amd64     6.1.69-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-18-amd64     6.1.76-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-20-amd64     6.1.85-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-21-amd64     6.1.90-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-22-amd64     6.1.94-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-23-amd64     6.1.99-1                                       amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-25-amd64     6.1.106-3                                      amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-26-amd64     6.1.112-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
rc  linux-image-6.1.0-27-amd64     6.1.115-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-28-amd64     6.1.119-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-33-amd64     6.1.133-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-amd64              6.1.133-1                                      amd64        Linux for 64-bit PCs (meta-package)

标记 ii表示已安装
​标记 rc表示已卸载但残留配置

2、确定当前已安装的内核:

uname -r

3、如果使用的不是最新的内核,需要重启应用新内核:

sudo reboot

4、清理内核:

sudo apt autoremove --purge

5、清理rc状态的内核:

sudo apt purge $(dpkg --list | grep '^rc' | awk '{print $2}')

清理后内核列表如下:

root@localhost:~# dpkg --list | grep linux-image
ii  linux-image-6.1.0-28-amd64     6.1.119-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-6.1.0-33-amd64     6.1.133-1                                      amd64        Linux 6.1 for 64-bit PCs (signed)
ii  linux-image-amd64              6.1.133-1                                      amd64        Linux for 64-bit PCs (meta-package)

注意:系统会自动保留一个旧内核作为回退,不要强制删除。