Sanic 与 Caddy 反向代理部署实战:TLS、HTTP/3 与静态资源卸载
Sanic 与 Caddy 反向代理部署实战TLS、HTTP/3 与静态资源卸载【免费下载链接】sanicAccelerate your web app development | Build fast. Run fast.项目地址: https://gitcode.com/gh_mirrors/sa/sanic导读本文基于 Sanic 官方部署指南guide/content/en/guide/deployment/caddy.md完整讲解如何让 Sanic 应用在本地端口监听由 Caddy 作为面向公网的入口服务器自动签发 Lets Encrypt TLS 证书、支持 HTTP/1.1/2/3、处理反向代理头并进一步将静态文件托管、Brotli 预压缩与 Unix Socket 通信等高级玩法落到可复制的配置。读完你将掌握一套从单行命令起步、到 Caddyfile 与 Sanic 代理头配置的完整部署方案。部署架构一览Caddy 是一款现代 Web 服务器与反向代理支持最高 HTTP/3 协议。它的简洁性体现在极简配置和内置能力上自动为你的域名从 Lets Encrypt 申请 TLS 证书无需手动管理证书续期。在本部署方案中分工如下组件角色监听位置Sanic 应用业务后端仅监听本地127.0.0.1:8001Caddy面向公网的入口代理example.com:443TCP/UDPCaddy 承担 TLS 终止、HTTP 到 HTTPS 跳转、反向代理头注入、流式传输与 WebSocket 转发Sanic 只关心业务逻辑。Caddy 可通过各平台Windows、Linux、Mac的软件包管理器安装软件包名为caddy。第一步准备一个可被代理的 Sanic 应用以官方指南中的proxied_example.py为例from sanic import Sanic from sanic.response import text app Sanic(proxied_example) app.get(/) def index(request): # This should display external (public) addresses: return text( f{request.remote_addr} connected to {request.url_for(index)}\n fForwarded: {request.forwarded}\n )保存为proxied_example.py通过 Sanic 命令行接口启动SANIC_PROXIES_COUNT1 sanic proxied_example --port 8001设置SANIC_PROXIES_COUNT环境变量的作用是告诉 Sanic 信任 Caddy 发送的 X-Forwarded-* 请求头从而正确识别真实客户端的 IP 地址等信息。注意此时--port 8001仅绑定本地回环地址127.0.0.1外部流量必须经由 Caddy 进入。代理头在源码层面是如何生效的SANIC_PROXIES_COUNT对应应用配置中的PROXIES_COUNT默认值为None见 sanic/config.py即默认不信任任何代理头——这本身就是一道安全防线恶意客户端无法通过伪造X-Forwarded-For来伪装自己的 IP。当配置了PROXIES_COUNT后sanic/headers.py 中的parse_xforwarded会读取REAL_IP_HEADER指定头部如CF-Connecting-IP作为直接来源否则拼接、拆分并过滤X-Forwarded-For链中的所有 IPFORWARDED_FOR_HEADER默认即X-Forwarded-For取链中倒数第PROXIES_COUNT个 IP 作为真实客户端地址addr proxies[-proxies_count]即前面每一跳都是代理只有倒数第 N 个才是用户。随后请求对象的request.forwarded属性会综合 RFC 7239Forwarded头与传统 X-头x-forwarded-proto、x-forwarded-host、x-forwarded-port、x-forwarded-path、x-scheme归一化出for、proto、host、port、path字段实现见 sanic/request/types.py。request.remote_addr即取forwarded[for]的值若要有代理读代理、无代理读直连可优先使用request.client_ipself.remote_addr or self.ip见 sanic/request/types.py。相关配置项在 sanic/config.py 中的默认值如下配置项默认值说明PROXIES_COUNTNone信任的代理层数须为正整数REAL_IP_HEADERNone直接携带真实 IP 的头部名FORWARDED_FOR_HEADERX-Forwarded-For传统代理链头部FORWARDED_SECRETNoneRFC 7239Forwarded头的校验密钥更完整的代理头语义含FORWARDED_SECRET用法与 curl 验证示例可参见 guide/content/en/guide/advanced/proxy-headers.md。另外注意PROXIES_COUNT为负数会触发断言错误对应测试见 tests/test_config.py。第二步一行命令完成公网部署如果你机器上没有运行其他 Web 服务器可以直接用 Caddy 命令行Linux 下需要sudocaddy reverse-proxy --from example.com --to :8001这条命令背后是一个完整的生产级服务器为你的域名申请并管理证书、HTTP 自动跳转 HTTPS、注入反向代理头、支持流式传输和 WebSocket。执行后你的 Sanic 应用即可通过 HTTP/1.1、HTTP/2 与 HTTP/3 三种版本对外提供服务。提醒要在公网启用 HTTP/3基于 QUIC请记得在防火墙中开放UDP/443端口仅开放 TCP/443 无法建立 H3 连接。第三步从命令行到 Caddyfile单行命令适合起步但很快你会需要托管多个站点、或对细节有更多控制——此时应当使用配置文件。上面的命令等价于以下Caddyfile它也是你部署的起点example.com { reverse_proxy localhost:8001 }Caddy 配置的加载方式部分 Linux 发行版安装 Caddy 后会自动从/etc/caddy/Caddyfile读取配置并对每个站点执行import /etc/caddy/conf.d/*。如果你的发行版没有这样的机制则需要手动将caddy run作为系统服务运行并指向正确的配置文件caddy run --config /path/to/Caddyfile另一种方式是使用 Caddy 的 API 模式持久化修改配置caddy run --resume需要特别留意任何一次 Caddyfile 的加载都会替换掉此前全部配置因此传统方式下caddy-api管理接口所保存的配置并不与 Caddyfile 混用。第四步进阶静态资源卸载与 Unix Socket有时你希望站点根路径同时服务静态文件与业务处理器获得更干净的 URL。在 Sanic 中可以这样实现app.static(/, static, indexindex.html)app.static的完整签名见 sanic/mixins/static.py除index外还支持stream_large_files大文件流式传输、use_content_range范围请求、directory_view目录浏览等参数。不过为了更好的性能可以把静态文件服务卸载给 Caddy让 Sanic 专注于动态请求app.example.com { # Look for static files first, proxy to Sanic if not found route { file_server { root /srv/sanicexample/static precompress br # brotli your large scripts and styles pass_thru } reverse_proxy unix//tmp/sanic.socket # sanic --unix /tmp/sanic.socket } }这段配置的三个要点file_server块指定静态文件根目录/srv/sanicexample/staticprecompress br预先用 Brotli 压缩体积较大的脚本和样式文件并直接下发pass_thru表示未命中静态文件时继续走后续处理流程即把请求转交给反向代理reverse_proxy unix//tmp/sanic.socket通过 Unix Domain Socket 转发动态请求省去 TCP 回环开销Sanic 侧对应启动方式sanic --unix /tmp/sanic.socket即让应用监听 Unix Socket 而非 TCP 端口。代码中亦可等价地通过app.run(unix./uds_socket)指定见 examples/unix_socket.pyNginx 部署指南中同样给出了 Unix Socket 的上游写法可作参照见 guide/content/en/guide/deployment/nginx.md。验证与排查建议完成部署后可以在浏览器或 curl 中检查https://example.com/应展示request.remote_addr为真实公网 IPrequest.forwarded中包含for/proto等字段证明代理头配置生效若remote_addr显示为127.0.0.1之类的代理地址优先检查SANIC_PROXIES_COUNT是否设置、Caddy 是否正常注入代理头若 HTTP/3 不可用确认防火墙已开放 UDP/443并可用支持 QUIC 的浏览器访问验证。更多 Caddy 指令与高级选项如负载均衡、访问日志、重写规则可查阅 Caddy 官方文档Sanic 侧的代理头语义与FORWARDED_SECRET的强校验用法则可继续阅读仓库中的 代理配置指南。【免费下载链接】sanicAccelerate your web app development | Build fast. Run fast.项目地址: https://gitcode.com/gh_mirrors/sa/sanic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

EMQX 集成 TimescaleDB 数据桥接实战:基于 PostgreSQL 扩展的时序数据写入方案

EMQX 集成 TimescaleDB 数据桥接实战:基于 PostgreSQL 扩展的时序数据写入方案

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 开源仓库中的 emqx_bridge_time…

2026/9/21 15:17:21 阅读更多 →
TiXL 节点详解:BlendVector3——多向量循环插值(Lerp)混合器

TiXL 节点详解:BlendVector3——多向量循环插值(Lerp)混合器

TiXL 节点详解:BlendVector3——多向量循环插值(Lerp)混合器 【免费下载链接】t3 TiXL is an open source software to create realtime motion graphics. 项目地址: https://gitcode.com/GitHub_Trending/t3/t3 本文以 TiXL 开源实时…

2026/9/21 15:17:21 阅读更多 →
naive-ui 图标组件 Icon 与 IconWrapper 完全指南:从基础用法到主题定制

naive-ui 图标组件 Icon 与 IconWrapper 完全指南:从基础用法到主题定制

naive-ui 图标组件 Icon 与 IconWrapper 完全指南:从基础用法到主题定制 【免费下载链接】naive-ui A Vue 3 Component Library. Fairly Complete. Theme Customizable. Uses TypeScript. Fast. 项目地址: https://gitcode.com/gh_mirrors/na/naive-ui naive…

2026/9/21 15:17:21 阅读更多 →

最新新闻

测验全流程解析与完整示例

测验全流程解析与完整示例

测验全流程解析与完整示例 版本升级后 API 全变了,老代码直接跑不通,这种痛谁懂?别慌,今天不整虚的,直接上 完整示例 ,把【测验】这块硬骨头掰碎了揉烂了讲透。…

2026/9/22 17:04:25 阅读更多 →
3个致命坑让你项目崩盘,Jeer保姆级教程救你

3个致命坑让你项目崩盘,Jeer保姆级教程救你

3个致命坑让你项目崩盘,Jeer保姆级教程救你 刚学完Jeer语法,满脑子都是怎么搭个像样的项目?结果一动手就崩。别慌,这坑我踩了五年,今天给你一份 保姆级教程 ,专治“懂语法不会落地”的病。 现象:为什么你的项目跑不起来…

2026/9/22 17:04:24 阅读更多 →
3分钟看懂七日年化利率源码解析,避开计算大坑

3分钟看懂七日年化利率源码解析,避开计算大坑

3分钟看懂七日年化利率源码解析,避开计算大坑 官方文档里关于收益率的定义往往晦涩难懂,几千字的细则读下来还是抓不住重点,这是很多开发者在对接金融接口时的真实痛点。别急,今天咱们直接切入【源码解析】,把七日年化利率的底层逻辑扒个底朝天。…

2026/9/22 17:04:24 阅读更多 →
3步搞定添加次坐标轴,附完整示例避坑指南

3步搞定添加次坐标轴,附完整示例避坑指南

3步搞定添加次坐标轴,附完整示例避坑指南 很多应届生刚入行,对着文档把 twinx() 或 set_twinx() 的语法背得滚瓜烂熟,结果一到真实项目里画双轴图,页面直接卡死,或者图形渲染得稀烂,根本没法交付。这其实是个典型的“知道怎么做…

2026/9/22 17:04:24 阅读更多 →
3个死坑解决无限看片的视频高清免费报错 一文搞懂

3个死坑解决无限看片的视频高清免费报错 一文搞懂

3个死坑解决无限看片的视频高清免费报错 一文搞懂 昨晚刚部署完流媒体服务,重启服务器瞬间炸锅。控制台滚动的红色报错比代码还长,满屏的 StackTrace 堆栈信息像天书一样糊在眼前。 你盯着那个 java.io.IOException:…

2026/9/22 17:04:24 阅读更多 →
实时竞价底层原理避坑指南:3个核心机制让你面试不再卡壳

实时竞价底层原理避坑指南:3个核心机制让你面试不再卡壳

实时竞价底层原理避坑指南:3个核心机制让你面试不再卡壳 面试时面试官甩出“实时竞价”四个字,你脑子里是不是瞬间一片空白?只记得是广告拍卖,但问到“为什么第二名不用付第一名那么多”或者“价格到底怎么算出来的”,你就卡壳了。这种原理答不上来的尴…

2026/9/22 17:03:24 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →