news 2026/9/9 14:09:28

从屏幕上的 PDF 倒着追回去:Overleaf 的 3 个服务如何跑通一条 LaTeX 编译流水线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从屏幕上的 PDF 倒着追回去:Overleaf 的 3 个服务如何跑通一条 LaTeX 编译流水线

从屏幕上的 PDF 倒着追回去:Overleaf 的 3 个服务如何跑通一条 LaTeX 编译流水线

【免费下载链接】overleafA web-based collaborative LaTeX editor项目地址: https://gitcode.com/GitHub_Trending/ov/overleaf

打开 Overleaf,点击编译,几秒后左侧预览栏就躺着一份 PDF。这条"LaTeX 编译 → PDF 预览"的链路横跨三个服务,今天我们不按"请求发出去之后发生了什么"的常规顺序讲,而是反着来:从你屏幕上的那份 PDF 出发,一路往回追到编译内核,看看每个环节到底把什么交给了下一个环节。

第一站:PDF 预览层,浏览器里的"最后一公里"

先看终点。前端预览组件在 services/web/frontend/js/features/pdf-preview/components/pdf-js-viewer.tsx,它基于 pdfjs 渲染,并且用usePersistedState把每个项目的缩放比例存在本地——你上次放大到多少,下次进来还是多少。

这里有个容易被忽略的细节:浏览器并不是去"请求一个接口拿 PDF",而是直接从一个独立的下载域名拉取文件。该域名由后端配置pdfDownloadDomain下发(对应环境变量COMPILES_USER_CONTENT_DOMAIN),定义在 services/web/config/settings.defaults.js。静态产物走独立域名,编辑请求走 API,这条分流在架构上很典型。

那么预览层拿到的 PDF,是谁生成的?

第二站:CLSI 的输出端口,编译结果的"出货口"

往下追,就要认识这条链路的发动机:CLSI(Common LaTeX Service Interface),一个把命令行 LaTeX 工具包装成 REST API 的服务。它默认监听 3 个端口:

端口用途
TCP/3013RESTful 接口,编译请求与输出文件都从这里进出
TCP/3048向负载均衡器上报负载信息
TCP/3049服务控制接口

端口定义见 services/clsi/config/settings.defaults.cjs,完整说明见 services/clsi/README.md。

编译完成后,CLSI 返回的响应长这样(节选):

{ "compile": { "status": "success", "outputFiles": [ { "type": "pdf", "url": "http://localhost:3013/project/<id>/output/output.pdf" }, { "type": "log", "url": "http://localhost:3013/project/<id>/output/output.log" } ] } }

也就是说,预览层最终加载的 URL,正是 CLSI 的output目录。再追问一层:这个output.pdf是怎么产生的?

第三站:编译内核,沙箱容器里的 TeX Live

答案在请求解析器 services/clsi/app/js/RequestParser.js 里。CLSI 接受四种引擎:pdflatexlatexxelatexlualatex,缺省为pdflatex;请求体里还带draft(草稿模式,跳过部分环节换速度)、stopOnFirstError等开关。

真正执行编译的环节依赖一个前置概念:TeX Live 是一套完整的 LaTeX 发行版。CLSI 自己并不内置它——当环境变量SANDBOXED_COMPILES=true时,CLSI 会为每次编译拉起一个"兄弟容器",用TEXLIVE_IMAGE指定的镜像运行引擎,编译完即弃。这种沙箱编译把任意 LaTeX 宏包带来的进程风险关进了容器里。

几个直接影响编译行为的关键参数:

参数作用默认值
COMPILE_SIZE_LIMIT请求体(即源文件包)大小上限7mb
PROCESS_LIFE_SPAN_LIMIT_MSCLSI 进程生命周期上限2 天(到期自动换进程,防资源泄漏)
timeout(请求内)单次编译超时,秒600(超过会被钳制到 600)
TEXLIVE_IMAGE沙箱容器使用的 TeX Live 镜像quay.io/sharelatex/texlive-full:2017.1
FILESTORE_HOST源文件下载来源127.0.0.1:3009

这里顺带回答两个高频痛点:编译超时不是改"60 秒"那么简单——单次编译上限 600 秒是在RequestParser里硬钳制的,真正的长期资源安全阀是processLifespanLimitMs想换引擎输出样式,就在请求的options.compiler里写xelatexlualatex,请求示例:

{ "compile": { "options": { "compiler": "xelatex", "timeout": 600, "draft": false }, "rootResourcePath": "main.tex", "resources": [ { "path": "main.tex", "url": "http://filestore:3009/<blob>" } ] } }

注意resources里的文件只带 URL 不带内容——源码本身存在另一个服务里。

终点站:Filestore,源码与产物的"仓库管理员"

链条的最上游是 services/filestore/:一个只管文件进出的极简服务(默认端口 3009)。它不编译任何东西,只负责把项目里每个.tex和素材存好、按需吐出 URL。CLSI 收到编译请求后,按resources里的 URL 把文件拉进沙箱容器,编译完再把 PDF 挂回 3013 端口的输出目录——Filestore 管"原料进",CLSI 管"成品出",前端只负责把成品渲染出来。

一句话复盘:Overleaf 的 PDF 处理就是一条三级流水线——Filestore 供料、CLSI 在沙箱 TeX Live 容器里编译、pdfjs 前端渲染,三者各守一个端口、各干一段活。

延伸阅读:服务级细节可对照 services/clsi/README.md 与 README.md。

如果你正自部署 Overleaf,欢迎在评论区聊聊你调TEXLIVE_IMAGE时踩过的坑。

【免费下载链接】overleafA web-based collaborative LaTeX editor项目地址: https://gitcode.com/GitHub_Trending/ov/overleaf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 14:09:04

位错攀移耦合的晶体塑性蠕变模拟实战解析

各位做高温结构材料数值模拟的朋友&#xff0c;今天想跟你们聊聊我在“基于考虑位错攀移的晶体塑性&#xff08;CPFE&#xff09;蠕变模拟”这个方向上的实战经验。蠕变模拟本身不稀奇&#xff0c;但一旦把位错攀移这个机制正式纳入晶体塑性有限元框架&#xff0c;整个模型的物…

作者头像 李华
网站建设 2026/9/9 14:08:03

昇腾910B适配生成式推荐模型HSTU的实战路径

1. 项目概述&#xff1a;这不是一次简单的“换卡”&#xff0c;而是一场推荐系统底层范式的重构 “HSTU模型昇腾NPU适配”这个标题&#xff0c;乍看是技术迁移&#xff0c;实则是国产算力生态落地推荐系统核心场景的一次关键验证。我带团队在2023年底启动这个项目时&#xff0c…

作者头像 李华
网站建设 2026/9/9 14:02:38

跨境多币种支付系统设计:账户模型、汇率引擎与踩坑实践

1. 项目概述&#xff1a;这个系统到底解决什么问题先说个我自己的经历。之前给一家做跨境电商 SaaS 的公司做支付系统改造&#xff0c;老板上来就说"我们的业务已经铺到十几个国家了&#xff0c;但现在收单还是要通过代理商换成美元再回款&#xff0c;中间汇率损失和手续费…

作者头像 李华
网站建设 2026/9/9 14:02:30

课程达成情况评价系统的设计与实现:基于Spring Boot+Vue的OBE落地实践

最近在帮几所高校做教学质量保障类的信息化项目&#xff0c;其中被问到最多也最让人头疼的就是课程达成情况评价系统。这个系统听起来不复杂&#xff0c;似乎就是把期末试卷、平时作业、实验报告的成绩汇总一下再算个平均分&#xff0c;但真正动手之后才发现&#xff0c;评价模…

作者头像 李华
网站建设 2026/9/9 14:00:21

物联网项目日志模块设计:统一采集、缓冲落盘与降级策略实战

物联网项目的日志模块往往是最不被重视、但后期最让人头疼的部分。尤其是当你有几千台设备在跑&#xff0c;每一台都在上报数据&#xff0c;每一条链路都可能出错的时候&#xff0c;你才会发现"日志能查、能筛、能定位"这件事到底有多重要。我这篇主要聊的是在物联网…

作者头像 李华