在 Linux下使用 Python 3.11 和 FastAPI 搭建带免费证书的 HTTPS 服务器

news2025/3/25 9:23:42

在当今数字化时代,保障网站数据传输的安全性至关重要。HTTPS 协议通过使用 SSL/TLS 加密技术,能够有效防止数据在传输过程中被窃取或篡改。本教程将详细介绍如何在 Ubuntu 22.04 系统上,使用 Python 3.11 和 FastAPI 框架搭建一个带有免费 SSL 证书的 HTTPS 服务器。

准备工作

在开始之前,你需要确保满足以下条件:

  • 拥有一台运行 Ubuntu 22.04 的服务器。
  • 具备一个有效的域名,并将其 DNS 解析指向你的服务器 IP 地址。因为 Let's Encrypt 不支持为 IP 地址颁发证书,所以域名是必需的。
  • 服务器已经连接到互联网,并且能够正常访问外部网络。

步骤 1:安装必要的软件包 

首先,我们需要更新系统的软件包列表,并安装 Python 3.11、pip(Python 包管理工具)、Certbot(用于获取免费 SSL 证书)和 Nginx(作为反向代理服务器)。 

# 更新系统软件包列表
sudo apt update
# 安装 Python 3.11 和 pip
sudo apt install python3.11 python3.11-venv python3-pip
# 安装 Certbot 和 Nginx
sudo apt install certbot python3-certbot-nginx nginx

 解释

  • sudo apt update:该命令用于更新系统软件包列表,确保我们能够获取到最新的软件包信息。
  • sudo apt install python3.11 python3.11-venv python3-pip:安装 Python 3.11 及其虚拟环境创建工具 venv 和包管理工具 pip。虚拟环境可以帮助我们隔离不同项目的依赖,避免版本冲突。
  • sudo apt install certbot python3-certbot-nginx nginx:安装 Certbot 及其 Nginx 插件,用于获取和管理 Let's Encrypt 免费 SSL 证书,同时安装 Nginx 服务器。

步骤 2:创建 Python 虚拟环境并安装 FastAPI

为了避免全局 Python 环境的污染,我们将创建一个虚拟环境,并在其中安装 FastAPI 和 Uvicorn(一个用于运行 FastAPI 应用的 ASGI 服务器)。

 注意:也可以用conda来创建pyhton的虚拟环境。以下代码用的python3的source来创建的建议虚拟环境,也够用。

# 创建虚拟环境
python3.11 -m venv fastapi_env
# 激活虚拟环境
source fastapi_env/bin/activate
# 安装 FastAPI 和 Uvicorn
pip install fastapi uvicorn

解释

  • python3.11 -m venv fastapi_env:使用 Python 3.11 的 venv 模块创建一个名为 fastapi_env 的虚拟环境。
  • source fastapi_env/bin/activate:激活虚拟环境,激活后,我们在该终端中执行的所有 Python 命令都将使用该虚拟环境中的 Python 和相关包。
  • pip install fastapi uvicorn:在虚拟环境中安装 FastAPI 和 Uvicorn。

步骤 3:编写 FastAPI 应用

创建一个名为 main.py 的 Python 文件,并编写一个简单的 FastAPI 应用。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"..."}

 解释

  • from fastapi import FastAPI:导入 FastAPI 类。
  • app = FastAPI():创建一个 FastAPI 应用实例。
  • @app.get("/"):定义一个 HTTP GET 请求处理函数,当用户访问根路径 / 时,将返回一个包含 {"..."} 的 JSON 响应。

 步骤 4:配置 Nginx 作为反向代理

Nginx 可以作为反向代理服务器,将客户端的请求转发到我们的 FastAPI 应用。

 4.1 创建 Nginx 配置文件

创建一个新的 Nginx 配置文件 /etc/nginx/sites-available/fastapi_app

sudo nano /etc/nginx/sites-available/fastapi_app

在文件中添加以下内容: 

server {
    listen 80;
    server_name your_domain;  # 替换为你的实际域名

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释

  • listen 80;:指定 Nginx 监听 HTTP 端口 80。
  • server_name your_domain;:指定服务器的域名,需要将 your_domain 替换为你自己的域名。
  • proxy_pass http://127.0.0.1:8000;:将客户端的请求转发到本地的 8000 端口,即我们的 FastAPI 应用运行的端口。
  • proxy_set_header:设置一些代理请求头,确保 FastAPI 应用能够获取到客户端的真实信息。

4.2 创建符号链接并测试配置

将配置文件链接到 sites-enabled 目录,并测试 Nginx 配置是否正确。

# 创建符号链接到 sites-enabled 目录
sudo ln -s /etc/nginx/sites-available/fastapi_app /etc/nginx/sites-enabled/
# 测试 Nginx 配置
sudo nginx -t
# 重启 Nginx 服务
sudo systemctl restart nginx

 步骤 5:获取免费 SSL 证书

使用 Certbot 工具获取 Let's Encrypt 免费 SSL 证书。

sudo certbot --nginx -d your_domain  # 替换为你的实际域名

多个域名时,申请方法如下: 

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

详细提示和输入说明

5.1 邮箱地址输入

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

Let's Encrypt 需要一个有效的邮箱地址,用于在证书即将到期或有安全通知时联系你。输入你的常用邮箱地址,然后按回车键。

5.2 协议条款确认

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

你需要同意 Let's Encrypt 的服务条款才能继续注册并获取证书。输入 Y 然后按回车键表示同意。

5.3 订阅邮件选项

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

 这是一个可选的订阅选项,询问你是否愿意与电子前沿基金会(EFF)共享你的邮箱地址,以便接收他们的相关新闻和活动信息。如果你愿意接收相关邮件,输入 Y 并回车;如果不愿意,输入 N 并回车。

5.4 域名验证与证书安装确认

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your_domain
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/fastapi_app

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

 Certbot 会验证你的域名所有权,并在验证通过后部署证书。这里会询问你是否要将所有 HTTP 请求重定向到 HTTPS。

  • 如果你希望将所有 HTTP 请求重定向到 HTTPS,输入 2 并回车。
  • 如果你暂时不想进行重定向,输入 1 并回车。

5.5 完成提示

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for ftpeak.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ftpeak.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/ftpeak.com/privkey.pem
This certificate expires on 2025-06-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for ftpeak.com to /etc/nginx/sites-enabled/fastapi_app
Congratulations! You have successfully enabled HTTPS on https://ftpeak.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

这表示证书已经成功获取并安装,同时会显示证书和私钥的保存路径以及证书的到期日期等重要信息。

步骤 6:在配置中增加SSL

6.1 编辑配置文件

打开配置文件进入编辑状态:

sudo nano /etc/nginx/sites-available/fastapi_app

 代码修改如下:

# HTTP 服务器块,用于将所有 HTTP 请求重定向到 HTTPS
server {
    listen 80;
    server_name ftpeak.com;
    # 永久重定向 HTTP 请求到 HTTPS
    return 301 https://$host$request_uri;
}

# HTTPS 服务器块,处理实际的 HTTPS 请求
server {
    listen 443 ssl;
    server_name ftpeak.com;

    # SSL 证书和私钥配置
    ssl_certificate /etc/letsencrypt/live/ftpeak.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ftpeak.com/privkey.pem;

    # 包含 Certbot 提供的 SSL 配置选项
    include /etc/letsencrypt/options-ssl-nginx.conf;
    # SSL  Diffie-Hellman 参数配置
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 反向代理配置,将请求转发到本地的 FastAPI 应用
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

6.1 启动 FastAPI 应用

在激活的虚拟环境中启动 FastAPI 应用。

uvicorn main:app --host 127.0.0.1 --port 8000

解释

  • uvicorn main:app:指定要运行的 FastAPI 应用,main 是 Python 文件名,app 是 FastAPI 应用实例的名称。
  • --host 127.0.0.1:指定应用监听的 IP 地址为本地回环地址。
  • --port 8000:指定应用监听的端口为 8000。

步骤 7:验证 HTTPS 访问

现在,你可以通过浏览器访问 https://your_domain(替换为你的实际域名)来验证 HTTPS 服务器是否正常工作。如果一切正常,你应该能看到 {"..."} 的响应。

注意事项

  • 确保服务器的防火墙允许 HTTP(端口 80)和 HTTPS(端口 443)流量。可以使用以下命令开放端口: 
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 443

步骤8:自动更新证书

自动更新测试

Let's Encrypt 证书的有效期为 90 天,为了避免证书过期导致服务中断,建议设置定期自动更新证书。可以使用以下命令测试自动更新:

sudo certbot renew --dry-run

测试结果如果通过如下:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/ftpeak.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for ftpeak.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/ftpeak.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

可以使用系统的定时任务(如 crontab -e)来定期执行 certbot renew 命令。

crontab -e

 如果你是第一次使用该命令,系统可能会提示你选择一个文本编辑器,你可以根据自己的喜好选择,例如选择 nano 编辑器,输入对应的数字并回车即可。

添加定时任务

在打开的 crontab 文件中,添加如下一行内容:

0 2 * * 1 /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"

代码解释

  • 时间设置部分(0 2 * * 1

    • 0 表示分钟,即每小时的第 0 分钟(整点)。
    • 2 表示小时,即凌晨 2 点。
    • * 表示任意值,这里前两个 * 分别表示每月的任意天和每年的任意月。
    • 1 表示星期,即星期一。

    综合起来,0 2 * * 1 表示每周一凌晨 2 点执行该任务。你可以根据自己的需求调整时间,例如你也可以设置为每月执行一次,将时间设置为 0 2 1 * * ,表示每月 1 号凌晨 2 点执行。

  • 命令部分(/usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"

    • /usr/bin/certbot renew:这是执行 Certbot 证书更新的命令。
    • --quiet:表示以安静模式运行,避免在更新过程中输出过多的信息,减少不必要的干扰。
    • --deploy-hook "systemctl reload nginx":这是一个部署钩子选项,当 Certbot 成功更新证书后,会执行双引号内的命令。这里的 systemctl reload nginx 表示重新加载 Nginx 服务,使新的证书配置生效。

保存并退出

在 nano 编辑器中,按下 Ctrl + X 组合键,然后输入 Y 确认保存修改,最后按下回车键退出编辑器。 

列出你设置的定时任务

你可以使用以下命令查看当前用户的 crontab 任务列表,确认刚才添加的任务是否已经正确保存:

crontab -l

如果输出中包含你添加的定时任务,说明配置成功。之后,系统会按照你设置的时间定期执行证书更新操作。

注意事项

  • 确保 certbot 命令的路径 /usr/bin/certbot 是正确的。你可以使用 which certbot 命令来确认其实际路径。
  • 在使用 systemctl reload nginx 之前,要确保当前用户有足够的权限来执行该命令。如果遇到权限问题,可能需要调整 sudo 配置或使用其他方式来重新加载 Nginx 服务。

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

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

相关文章

XSS基础靶场练习

目录 1. 准备靶场 2. PASS 1. Level 1&#xff1a;无过滤 源码&#xff1a; 2. level2&#xff1a;转HTML实体 htmlspecialchars简介&#xff1a; 源码 PASS 3. level3:转HTML深入 源码&#xff1a; PASS 4. level4:过滤<> 源码&#xff1a; PASS: 5. level5:过滤on 源码…

Redis核心机制(一)

目录 Redis的特性 1.速度快 2.以键值对方式进行存储 3.丰富的功能 4.客户端语言多 5.持久化 6.主从复制 7.高可用和分布式 Redis使用场景 Redis核心机制——持久化 RDB bgsave执行流程 ​编辑 AOF AOF重写流程 3.混合持久化&#xff08;RDBAOF&#xff09; Red…

QGroupBox取消勾选时不禁用子控件

默认情况下&#xff0c;QGroupBox取消勾选会自动禁用子控件&#xff0c;如下图所示 那么如何实现取消勾选时不禁用子控件呢&#xff1f; 实现很简单&#xff0c;直接上代码了 connect(ui->groupBox, &QGroupBox::toggled, this, [](bool checked){if (checked false){…

MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!

目录 一、什么是 MyBatis-Plus 自动填充&#xff1f; &#x1f914;二、自动填充的原理 ⚙️三、实际例子&#xff1a;创建时间和更新时间字段自动填充 ⏰四、注意事项 ⚠️五、总结 &#x1f389; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢…

canvas数据标注功能简单实现:矩形、圆形

背景说明 基于UI同学的设计&#xff0c;在市面上找不到刚刚好的数据标注工具&#xff0c;遂决定自行开发。目前需求是实现图片的矩形、圆形标注&#xff0c;并获取标注的坐标信息&#xff0c;使用canvas可以比较方便的实现该功能。 主要功能 选中图形&#xff0c;进行拖动 使…

【UI设计】一些好用的免费图标素材网站

阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一&#xff0c;拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等&#xff0c;适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…

ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”

问题如题所示&#xff0c;我挂载一个squanfs文件系统到指定目录&#xff0c;当我使用完后&#xff0c;准备解挂载时&#xff0c;提示umount: /home/xx/Applications/yy: target is busy.&#xff0c;具体的如图所示&#xff0c; 这种提示通常是表明这个路径的内容正在被某些进…

一条不太简单的TEX学习之路

目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释&#xff1a; 总结&#xff1a; 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释&#xff1a; 图案解释&#xff1a; xetex pdelatex etc index 报…

Matplotlib完全指南:数据可视化从入门到实战

目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图&#xff08;Line Plot&#xff09; 2.2 柱状图&#xff08;Bar Chart&#xff09; 三、高级图表类型 3.1 散点图&#xff08;Scatter Plot&#xff…

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代&#xff0c;数据已成为企业最核心的资产。然而&#xff0c;分散在业务系统、日志文件…

OAuth 2.0认证

文章目录 1. 引言1.1 系列文章说明1.2 OAuth 2.0 的起源与演变1.3 应用场景概览 2. OAuth 2.0 核心概念2.1 角色划分2.2 核心术语解析 3. 四种授权模式详解3.1 授权码模式&#xff08;Authorization Code Grant&#xff09;3.1.1 完整流程解析3.1.2 PKCE 扩展&#xff08;防止授…

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源&#xff0c;它们有类似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别&#xff1a; 1. 功能的演进 ReplicationController 是 Kubernete…

[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝

目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接&#xff1a;2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…

可视化动态表单动态表单界的天花板--Formily(阿里开源)

文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态&#xff1a; 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…

Amdahl 定律

Amdahl 定律是用来表示&#xff0c;当提高系统某部分性能时对整个系统的影响&#xff0c;其公式如下&#xff1a; a表示我们提升部分初始耗时比例&#xff0c;k是我们的提升倍率&#xff0c;通过这个公式我们可以轻松的得知对每一部分的提醒&#xff0c;对整个系统带来的影响…

Linux系统之美:环境变量的概念以及基本操作

本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令&#xff08;我们的exe&#xff09; 我们以往的Linux编程经验告诉我们&#xff0c;我们在对一段代码编译形成可执行文件后…

pnpm 报错 Error: Cannot find matching keyid 解决

1. 查看corepack版本&#xff0c;升级至0.31.0 npm i -g corepack0.31.0 这里注意环境变量&#xff0c;可能升级后还是指向旧版本&#xff0c;可以选择更新环境变量或者删除原指向的corepack命令 2. 更新pnpm corepack install -g pnpmlatest 问题解决。

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…

Fiddler抓包工具最快入门

目录 前言 了解HTTP网络知识 简单了解网络访问过程 简单了解HTTP网络传输协议 工作过程 HTTP请求&#xff1a; Fildder工具使用教程 抓包的概念 一、什么是抓包 二、为什么要抓包 三、抓包的原理&#xff08;图解&#xff09; Fiddler工具 安装 使用 Fiddler查看…