使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期

使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期

目录

  • 使用 Let’s Encrypt 免费申请泛域名 SSL 证书,并实现自动续期
    • 🛠️ 环境准备
    • 💡 什么是 Let’s Encrypt?
    • 🧠 Let’s Encrypt 证书颁发原理
      • 1. 域名验证
      • 2. 证书生成
      • 3. 证书安装
      • 4. 自动续期
    • 🛠️ Certbot 的工作原理
    • 📦 安装 Certbot
      • Linux 系统
      • 其他系统平台
    • 🌐 单域名 SSL 证书
      • 🔒 申请单域名 SSL 证书
      • 🔄 单域名自动续期
    • 🌐 泛域名 SSL 证书
      • 🛡️ 申请泛域名 SSL 证书
        • 使用 DNS 验证申请泛域名证书
      • 🔄 泛域名设置自动续期
        • 1. 创建自动化 DNS 脚本
        • 2. 配置自动续期命令
        • 3. 配置 Crontab 定期续期任务
        • 4. 重载 Nginx 配置
        • 5. 验证自动续期配置
        • 🔍 深入解读
        • ✅ 配置完成后的效果
    • 📁 申请的 SSL 证书文件所在目录
      • nginx配置证书示例
    • 🔍 验证 HTTPS 配置
    • 🛡️ 常见问题及解决方法
      • 1. DNS 验证失败
      • 2. Nginx 配置冲突
    • 🎉 总结
    • 🔗 参考链接

在如今的互联网环境中,为网站配置 SSL 证书已成为安全的标配。本文将介绍如何使用 Let’s Encrypt 免费获取泛域名 SSL 证书,并实现自动续期,为你的网站保驾护航。

🛠️ 环境准备

在开始之前,确保你具备以下条件:

  • 一台可以访问互联网的服务器(Linux 环境,如 Ubuntu/CentOS)。
  • Root 权限或 sudo 权限。
  • 一个已解析的域名(本文以 example.com 为例)。

💡 什么是 Let’s Encrypt?

Let’s Encrypt 是一个免费的、自动化的、开放的证书颁发机构(CA),提供免费 SSL 证书。它的目标是让所有网站都能轻松实现 HTTPS 加密,保障用户数据的安全。通过 Let’s Encrypt,你可以为你的主域名、子域名,甚至泛域名配置安全证书,而且过程完全自动化,不需要手动申请和管理证书,官方推荐使用 Certbot。

🧠 Let’s Encrypt 证书颁发原理

Let’s Encrypt 证书的颁发是通过 自动化的认证流程 完成的,以下是基本流程:

1. 域名验证

在申请证书之前,Let’s Encrypt 必须验证你对所申请域名的控制权。这是通过以下几种方式进行的:

  • HTTP-01 验证:Let’s Encrypt 向你请求创建一个特定的文件,并放在你网站的指定路径下。它通过访问该文件来验证你是否控制该域名。
  • DNS-01 验证:Let’s Encrypt 提供一条 DNS TXT 记录,要求你将其添加到域名的 DNS 设置中。它通过检查 DNS 记录来验证你对域名的控制权。

对于 泛域名证书,必须使用 DNS-01 验证方式,因为 HTTP 验证不能跨域名层级进行。

2. 证书生成

一旦验证成功,Let’s Encrypt 会生成一个 SSL 证书,并将其发放给申请者。这个证书包含了公钥和域名信息,任何人都可以通过该证书与网站进行安全通信。

3. 证书安装

证书的安装你可以选择自己手动安装,我自己是手动安装的,因为我用的是docker版的nginx服务器。你也可以由 Certbot 自动完成,前提是你已经在服务器上安装 Nginx 或 Apache 等服务器。Certbot 会将证书安装到 Web 服务器(如 Nginx 或 Apache)上,并配置好相应的加密设置,自动安装会更方便,动手配置更灵活,比如申请证书和 Web 服务器不在同一台电脑上就需要手动。

4. 自动续期

Let’s Encrypt 的证书有效期为 90 天,因此需要定期续期。Certbot 自动进行续期验证,确保你的网站不会因为证书过期而遭到用户的安全警告。

🛠️ Certbot 的工作原理

Certbot 是一个命令行工具,用于自动化整个 SSL 证书的管理流程。它可以做以下几件事:

  • 申请证书:使用 ACME 协议从 Let’s Encrypt 获取证书。
  • 验证域名所有权:通过 HTTP-01 或 DNS-01 验证确保你拥有该域名。
  • 安装证书:将证书自动安装到你的 Web 服务器,并配置相关的加密参数。
  • 续期证书:定期自动续期证书,避免证书过期。

Certbot 的核心工作是通过 ACME 协议(自动证书管理环境)与 Let’s Encrypt 通信。ACME 是一套标准协议,用于自动化证书申请、验证和安装的过程。Certbot 使用 ACME 协议与 Let’s Encrypt 进行通信,确保你的网站能够通过安全的 HTTPS 连接。

📦 安装 Certbot

Certbot 是由 Electronic Frontier Foundation (EFF) 提供的一个开源工具,用于自动化从 Let’s Encrypt 获取和管理 SSL 证书。Certbot 会自动为你处理证书申请、安装和续期等过程。

Linux 系统

推荐使用 Linux 的 snap 包管理工具安装Certbot,支持snap后可以使用如下命令安装Certbot

sudo snap install --classic certbot #安装Certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot #创建一个符号链接,确保可以执行certbot命令(相当于快捷方式)

其他系统平台

参考Certbot官网

🌐 单域名 SSL 证书

🔒 申请单域名 SSL 证书

如果你只需要为单个域名(如 example.com 和 www.example.com)申请证书,可以使用以下命令:

sudo certbot --nginx -d example.com -d www.example.com

--nginx 需要服务器预先安装nginx,certbot获取到证书后会自动通过修改nginx的配置将证书安装到nginx上。

根据提示输入邮箱地址,并同意服务条款,Certbot 将自动完成证书申请和安装。

🔄 单域名自动续期

Let’s Encrypt 证书的有效期为 90 天,为了避免证书过期,我们可以使用 Cron Job 设置自动续期。

首先,你可以手动测试续期是否正常:

sudo certbot renew --dry-run

如果没有报错,可以继续配置自动续期任务:

sudo crontab -e

在打开的编辑器中添加以下行,表示每天凌晨 2 点执行自动续期任务:

0 2 * * * /usr/bin/certbot renew --quiet

--quiet 参数表示静默模式,不会输出非错误信息。

单域名的操作非常简单,就说到这里!!!

🌐 泛域名 SSL 证书

🛡️ 申请泛域名 SSL 证书

泛域名证书(Wildcard Certificate)可以为同一主域名下的所有子域名提供 HTTPS 支持。例如,*.example.com 可以覆盖 blog.example.comapi.example.com 等子域名。

使用 DNS 验证申请泛域名证书

Let’s Encrypt 要求通过 DNS-01 验证来申请泛域名证书。运行以下命令:

sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.com

Certbot 会要求你在 DNS 中创建一个特定的 TXT 记录 记录以验证域名的所有权。

_acme-challenge.example.com IN TXT "certbot给出的随机字符串"

前往你的域名 DNS 管理页面,添加该记录后,返回命令行按下 Enter
如图:
 


大概等几十秒钟,确保 DNS 记录在全网传播开来,Certbot 可以查询到。
Certbot 在执行验证时会发起 DNS 查询,如果能找到所需的 TXT 记录并验证其值,认证就会成功,然后就会颁发证书。证书颁发后,这条 TXT 记录 就可以删除了。

这个是手动添加删除 DNS 对应的 TXT 记录,这里只是演示Certbot颁发证书的过程,实际情况下最好采用自动化脚本添加和删除 DNS 的 TXT 解析记录。

🔄 泛域名设置自动续期

Let’s Encrypt 颁发的 SSL 证书有效期为 90 天,为了避免证书过期导致网站 HTTPS 中断,自动续期 是必须要配置的。对于 泛域名证书,由于使用了 DNS-01 验证,因此我们也需要使用相应的自动化脚本来管理 DNS TXT 记录,从而实现自动续期。由于我购买的是腾讯云域名,这里我们以 腾讯云DNSPod 的 API 为例,来配置自动续期。

1. 创建自动化 DNS 脚本

首先,我们需要编写两个脚本用于处理 DNS-01 验证的 DNS 记录添加和删除。假设你已经安装了 腾讯云 CLI 工具 (tccli),,以下是 dnspod.sh 脚本的内容:
tccli安装和使用参考 腾讯云 CLI 工具

#!/bin/bash
RECORD_FILE="/tmp/_acme-challenge.${CERTBOT_DOMAIN}_${CERTBOT_VALIDATION}"
if ! command -v tccli >/dev/null; then
echo "TCCLI is required: https://cloud.tencent.com/document/product/440" 1>&2
exit 1
fi
if [ "$1" = "clean" ]; then
# 删除 DNS TXT 记录
RECORD_ID=$(cat ${RECORD_FILE})
if [ -n "${RECORD_ID}" ]; then
tccli dnspod DeleteRecord --cli-unfold-argument \
--Domain ${CERTBOT_DOMAIN} \
--RecordId ${RECORD_ID} \
>/dev/null
fi
rm -f ${RECORD_FILE}
else
# 创建 DNS TXT 记录
RECORD_ID=$(
tccli dnspod CreateRecord --cli-unfold-argument \
--Domain ${CERTBOT_DOMAIN} \
--SubDomain _acme-challenge \
--RecordType TXT \
--RecordLine 默认 \
--Value ${CERTBOT_VALIDATION} \
--TTL 600 \
| grep "RecordId" | grep -Eo "[0-9]+"
)
echo ${RECORD_ID} > ${RECORD_FILE}
sleep 20 # 等待 DNS 记录传播
fi

脚本中涉及到一些环境变量比如CERTBOT_DOMAINCERTBOT_VALIDATION等等,这是由certbot自动将相关的环境变量传递给这些脚本的。

参考:Certbot DNS验证前后的钩子

2. 配置自动续期命令

我们使用 certbot 的 --manual-auth-hook 和 --manual-cleanup-hook 参数,调用 dnspod.sh 脚本来自动添加和清理 DNS 记录:

certbot renew --manual --preferred-challenges=dns \
--manual-auth-hook "/path/to/dnspod.sh" \
--manual-cleanup-hook "/path/to/dnspod.sh clean" \
--deploy-hook "/path/to/renew_and_reload_nginx.sh"
  • --manual-auth-hook:在验证开始时调用,用于创建 DNS TXT 记录。
  • --manual-cleanup-hook:在验证结束后调用,用于清理 DNS TXT 记录。
  • --deploy-hook:在证书更新成功后调用,用于重启并加载 Nginx 最新配置。
3. 配置 Crontab 定期续期任务

编辑 Crontab 文件,添加以下行,实现每 10 天凌晨 2 点自动尝试续期证书:

0 2 */10 * * root certbot renew --manual --preferred-challenges=dns \
--manual-auth-hook "/path/to/dnspod.sh" \
--manual-cleanup-hook "/path/to/dnspod.sh clean" \
--deploy-hook "/path/to/renew_and_reload_nginx.sh" >> /var/log/certbot-renew.log 2>&1
4. 重载 Nginx 配置

以下是 renew_and_reload_nginx.sh 的内容,用于在证书续期后重启 Nginx 服务(假设使用 Docker 运行 Nginx):

#!/bin/bash
# 停止 nginx 服务
docker compose -f /path/to/compose.yml stop nginx
# 重新启动 nginx 服务
docker compose -f /path/to/compose.yml up -d nginx
5. 验证自动续期配置

在完成配置后,可以运行以下命令来测试续期流程,确保一切正常:

certbot renew --manual --preferred-challenges=dns --manual-auth-hook "/path/to/dnspod.sh" --manual-cleanup-hook "/path/to/dnspod.sh clean" --deploy-hook "/path/to/renew_and_reload_nginx.sh" --dry-run

如果没有错误提示,说明自动续期配置成功。

加上--dry-run表示使用Let's Encrypt的测试服务器。防止多次使用真实服务器频繁颁发证书达到速率限制

🔍 深入解读
  1. DNS 验证和自动化挑战

    • 泛域名证书使用 DNS-01 验证,即要求在 DNS 中添加 _acme-challenge 的 TXT 记录。这种方式可以验证你对整个域名的控制权。
    • 使用 API 自动管理 DNS 记录,可以避免手动添加和删除 TXT 记录的繁琐操作,适合生产环境中的自动化需求。
  2. Crontab 定时任务

    • 由于 Let’s Encrypt 证书有效期为 90 天,我们配置 Crontab 每 10 天尝试续期一次,以确保在证书到期前完成续期。
    • 任务执行日志会被重定向到 /var/log/certbot-renew.log,便于后续检查和调试。
  3. Nginx 重载

    • 证书续期后,需要重新加载 Nginx 配置,以使新的证书生效。通过 docker compose 管理的 Nginx 服务,可以使用 up -d 命令实现无中断重启。
✅ 配置完成后的效果

完成上述配置后,你的服务器将能够自动管理泛域名 SSL 证书,定期续期并自动应用新的证书配置。这将大大降低证书管理的工作量,同时保证网站的 HTTPS 加密连接始终有效。

你可以随时使用以下命令检查现有证书的状态:

sudo certbot certificates

如果证书信息显示正确,并且 expiry date 在未来日期,说明配置成功。


通过自动化脚本和 Certbot 工具的结合,你已经为你的泛域名 SSL 证书实现了从申请、安装到续期的全流程自动化,让你的网站可以轻松保持 HTTPS 安全连接。

📁 申请的 SSL 证书文件所在目录

当使用 Certbot 成功申请到 SSL 证书后,证书文件将默认保存在以下目录中:

/etc/letsencrypt/live/your-domain-name/

具体包含以下几个文件:

  • cert.pem:这是你的 SSL 证书 文件。
  • privkey.pem:这是你的 私钥 文件,务必妥善保管,切勿泄露。
  • chain.pem:这是 中间证书链 文件,用于验证证书的完整性。
  • fullchain.pem:这是 完整证书链 文件,通常用于 Nginx 或 Apache 的 SSL 配置中。

例如,如果你的域名是 example.com,则目录路径为:

/etc/letsencrypt/live/example.com/

你可以使用以下命令查看证书详细信息:

sudo certbot certificates

输出示例:

Certificate Name: example.com
Domains: example.com www.example.com
Expiry Date: 2024-02-10 14:30:00+00:00 (VALID: 75 days)
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

提示:为了避免证书路径错误,建议在 Nginx 或 Apache 配置中直接使用 fullchain.pem 和 privkey.pem 两个文件。

nginx配置证书示例

server {
listen 80;
server_name example.com www.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
}
}

如果使用docker nginx,可以通过docker挂载卷使用证书,比如我就是这样使用的:
compose.yml:

services:
nginx:
image: nginx:latest
networks:
- spy
ports:
- "80:80"
- "443:443"
environment:
- TZ=Asia/Shanghai # 设置为上海时区
volumes:
# 主配置
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:rw
# include配置
- ./nginx/conf.d/:/etc/nginx/conf.d/:rw
# 证书
- /etc/letsencrypt/live/spystudy.cn/fullchain.pem:/etc/ssl/certs/spystudy.cn/fullchain.pem:rw
- /etc/letsencrypt/live/spystudy.cn/privkey.pem:/etc/ssl/certs/spystudy.cn/private.pem:rw
# 日志
- ./nginx/logs/:/var/log/nginx/:rw

然后nginx配置文件:

server {
listen 443 ssl;
server_name spystudy.cn;
ssl_certificate /etc/ssl/certs/spystudy.cn/fullchain.pem;
ssl_certificate_key /etc/ssl/certs/spystudy.cn/private.pem;
return 301 https://www.spystudy.cn$request_uri;
}

🔍 验证 HTTPS 配置

证书安装完成后,可以通过访问 https://example.com 检查是否成功启用了 HTTPS。你也可以使用以下命令查看证书状态:

sudo certbot certificates

如果证书信息显示正确,并且 expiry date 在未来日期,说明配置成功。

🛡️ 常见问题及解决方法

1. DNS 验证失败

检查 DNS 记录是否添加正确,并确保记录已完全传播,可以使用以下命令查看 DNS 解析状态:

nslookup -q=txt _acme-challenge.example.com

2. Nginx 配置冲突

如果 Certbot 无法自动修改 Nginx 配置文件,你可以手动更新 Nginx 配置文件(/etc/nginx/sites-available/default):

server {
listen 80;
server_name example.com www.example.com;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://127.0.0.1:8080;
}
}

保存并测试 Nginx 配置:

sudo nginx -t
sudo systemctl reload nginx

🎉 总结

通过本文的教程,你已经学会了如何使用 Let’s Encrypt 免费获取 SSL 证书,包括 单域名 和 泛域名 的配置,并且实现了 自动续期。此外,你还了解了 Certbot 工具的作用及工作原理。现在,你可以轻松为你的网站配置 HTTPS,保障用户的安全体验,如果你在配置证书过程中遇到任何问题,欢迎在下方留言。

如果你觉得这篇文章对你有所帮助,欢迎分享给更多需要的朋友!

🔗 参考链接

  • Let’s Encrypt 官方网站
  • Certbot 官方文档
  • ACME 协议介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93186.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键自动化:Kickstart无人值守安装指南

Kickstart文件实现自动安装1. Kickstart文件概述1.1 定义与作用Kickstart文件是Red Hat系Linux发行版(如RHEL、CentOS、Fedora)用于实现自动化安装的配置文件,采用纯文本格式保存。它通过预设安装参数的方式,使系统安装过程无需人…

深度解读 Browser-Use:让 AI 驱动浏览器自动化成为可能

目录 一、什么是 Browser-Use? 二、Browser-Use 的核心功能 1. AI 与浏览器的链接桥梁 2. 无代码 / 低代码操作界面 3. 支持多家 LLM 4. 开发体验简洁 可快速上手 三、核心价值与适用场景 四、与 Playwright 的结合使用 五、总结与展望 https://github.com…

React.memo、useMemo 和 React.PureComponent的区别

useMemo 和 React.memo 都是 React 提供的性能优化工具,但它们的作用和使用场景有显著不同。以下是两者的全面对比: 一、核心区别总结特性useMemoReact.memo类型React Hook高阶组件(HOC)作用对象缓存计算结果缓存组件渲染结果优化目标避免重复计算避免不…

Lumerical INTERCONNECT ------ CW Laser 和 OPWM 组成的系统

Lumerical INTERCONNECT ------ CW Laser 和 OPWM 组成的系统 引言 正文 引言 这里我们来简单介绍一下 CW Laser 与 OSA 组成的简单系统结构的仿真。 正文 我们构建一个如下图所示的仿真结构。 我们将 CWL 中的 power 设置为 1 W。 然后直接运行仿真查看结果如下: 虽然 …

想涨薪30%?别只盯着大厂了!转型AI产品经理的3个通用方法,人人都能学!

在AI产品经理刚成为互联网公司香饽饽的时候,刚做产品1年的月月就规划了自己的转型计划,然后用3个月时间成功更换赛道,转战AI产品经理,涨薪30%。 问及她有什么上岸秘诀?她也复盘总结了3个踩坑经验和正确路径&#xff0c…

基于Hadoop的全国农产品批发价格数据分析与可视化与价格预测研究

文章目录有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍每文一语有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 随着我国农业数字化进程的加快,农产品批发市场每天都会产生海量的价格…

STM32在使用DMA发送和接收时的模式区别

在STM32的DMA传输中,发送使用DMA_Mode_Normal而接收使用DMA_Mode_Circular的设计基于以下关键差异:1. ‌触发机制的本质区别‌‌发送方向(TX)‌:由USART的‌TXE标志(发送寄存器空)触发‌&#x…

【秋招笔试】2025.08.15饿了么秋招机考-第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围在线刷题 bishipass.com 03. A先生的商贸网络投资 问题描述 A先生是一位精明的商人,他计划在 n n n 个城市之间建立商贸网络。目前有 m m

Socket 套接字的学习--UDP

上次我们大概介绍了一些关于网络的基础知识,这次我们利用编程来深入学习一下一:套接字Socket1.1什么是Socketsocket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、IPv6,. 然而, 各种网络协议的地址格式并不相同。1.2套接字的分类套接字…

AI - MCP 协议(一)

AI应用开发的高级特性——MCP模型上下文协议,打通AI与外部服务的边界。 ************************************************************************************************************** 一、需求分析 当你的AI具备了RAG的能力,具备了调用工具的…

在es中安装kibana

一 安装 1.1 验证访问https的连通性 # 测试 80 端口(HTTP) curl -I -m 5 http://目标IP:端口号 说明: -I:仅获取 HTTP 头部(Head 请求),不下载正文,减少数据传输。 -m 5&#x…

嵌入式开发学习———Linux环境下网络编程学习(二)

UDP服务器客户端搭建UDP服务器代码#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h>#define PORT 8080 #define BUFFER_SIZE 1024int main() {int sockfd;char buffer[BUFFER_SIZE…

UVa1465/LA4841 Searchlights

UVa12345 UVa1465/LA4841 Searchlights题目链接题意输入格式输出格式分析AC 代码题目链接 本题是2010年icpc亚洲区域赛杭州赛区的I题 题意 在一个 n 行 m 列&#xff08;n≤100&#xff0c;m≤10 000&#xff09;的网格中有一些探照灯&#xff0c;每个探照灯有一个最大亮度 k&…

详解区块链技术及主流区块链框架对比

文章目录一、区块链技术栈详解二、主流区块链框架对比1. 公有链&#xff08;Public Blockchain&#xff09;2. 联盟链&#xff08;Consortium Blockchain&#xff09;3. 私有链&#xff08;Private Blockchain&#xff09;三、技术选型建议1. 按需求选择框架2. 开发工具与生态四…

大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?

技术文章大纲&#xff1a;大模型 垂直场景的新玩法大模型与搜索领域的结合大模型在搜索领域的应用可以显著提升搜索结果的准确性和用户体验。利用大模型进行语义理解和上下文关联&#xff0c;能够实现更精准的意图识别。结合知识图谱和动态索引优化&#xff0c;可以增强长尾查…

p5.js 3D盒子的基础用法

点赞 关注 收藏 学会了 如果你刚接触 p5.js&#xff0c;想尝试 3D 绘图&#xff0c;那么box()函数绝对是你的入门首选。它能快速绘制出 3D 长方体&#xff08;或正方体&#xff09;&#xff0c;配合简单的交互就能做出酷炫的 3D 效果。本文会从基础到进阶&#xff0c;带你吃…

【动态规划 完全背包 卡常】P9743 「KDOI-06-J」旅行|普及+

本文涉及知识点 C动态规划 完全背包 C记忆化搜索 「KDOI-06-J」旅行 题目描述 小 C 在 C 国旅行。 C 国有 nmn\times mnm 个城市&#xff0c;可以看做 nmn\times mnm 的网格。定义 (i,j)(i,j)(i,j) 表示在网格中第 iii 行第 jjj 列的城市。 该国有 222 种交通系统&#x…

pytest框架-详解

目录 一、前言 二、pytest安装 2.1、安装 2.2、验证安装 2.3、pytest文档 三、pytest框架的约束 3.1、 python的命名规则 3.2、 pytest的命名规则 四、pytest的运行方式 4.1、主函数运行 4.2、命令行运行 五、pytest配置文件pytest.ini文件 六、前置和后置 七、as…

【递归、搜索与回溯算法】DFS解决FloodFill算法

FloodFill算法简介一、[图像渲染](https://leetcode.cn/problems/flood-fill/description/)二、[岛屿数量](https://leetcode.cn/problems/number-of-islands/description/)三、[岛屿的最大面积](https://leetcode.cn/problems/max-area-of-island/description/)四、[被围绕的区…

解决网络传输中可能出现的“粘包”

先理解核心问题&#xff1a;什么是“TCP粘包”&#xff1f; TCP 就像一条水管&#xff0c;数据通过水管从一端传到另一端。但它有个特点&#xff1a;不会按“发送时的小包”来划分&#xff0c;而是把数据当成连续的字节流。 比如&#xff1a; 你分两次发数据&#xff1a;第一次…