OpenResty高性能Web平台:从Nginx到动态网关的架构与实战
1. OpenResty不只是Nginx更是动态Web应用的瑞士军刀如果你在寻找一个高性能的Web平台既能处理海量静态请求又能轻松嵌入复杂的业务逻辑那么OpenResty绝对值得你花时间深入了解。很多朋友第一次听说它可能会觉得“这不就是个带Lua的Nginx吗”。没错它的核心确实是Nginx但它的能力边界早已远远超出了传统的Web服务器或反向代理。我把它比作一个“瑞士军刀”因为它在一个统一的、高性能的框架内集成了网关路由、应用逻辑、缓存、认证、限流、日志处理等几乎所有Web后端开发中会遇到的核心模块。通过LuaJIT你可以在请求处理的各个阶段比如访问阶段、内容生成阶段、日志阶段注入Lua脚本实现前所未有的灵活性和性能。这尤其适合API网关、微服务入口、实时数据处理、高并发Web应用等场景。无论你是运维工程师想打造更智能的流量管控层还是后端开发者希望将部分业务逻辑前置以提升响应速度OpenResty都能提供一个极佳的解决方案。2. 核心架构与设计哲学为什么是LuaNginx2.1 Nginx的事件驱动模型高并发的基石要理解OpenResty的强大必须先理解Nginx。Nginx采用经典的事件驱动、非阻塞I/O模型。它不像传统Apache那样为每个连接创建一个线程或进程而是由一个Master进程管理多个Worker进程。每个Worker进程内部使用一个高效的事件循环如epoll、kqueue来监听和处理成千上万个连接。当一个连接有数据可读或可写时Worker才会去处理它处理完立刻返回事件循环等待下一个事件。这种模型避免了进程/线程切换的巨大开销使得Nginx在资源消耗极低的情况下能轻松应对C10K甚至C100K级别的高并发连接。这是OpenResty高性能的底层保障。2.2 LuaJIT让动态脚本飞起来如果只有Nginx我们只能通过写C模块来扩展功能门槛高、周期长。OpenResty的革命性在于集成了LuaJIT。Lua本身是一门轻量级、嵌入式的脚本语言而LuaJIT是其即时编译JIT实现能将Lua代码在运行时编译成本地机器码执行效率接近C语言。这意味着你可以用写脚本的速度和灵活性获得近乎原生代码的性能。OpenResty将LuaJIT深度集成到Nginx中暴露了丰富的Nginx API和一系列自研的Lua模块如lua-resty-core,lua-resty-redis,lua-resty-mysql让你可以直接在Lua脚本里操作请求头、响应体、访问数据库、调用Redis几乎无所不能。2.3 请求处理阶段精细化的控制钩子这是OpenResty编程模型的核心概念。Nginx将一个HTTP请求的处理划分为多个阶段OpenResty允许你在这些阶段挂载Lua代码。主要阶段包括set_by_lua: 在Nginx的set指令阶段执行用于设置变量。rewrite_by_lua: 在重写rewrite阶段执行常用于URL重写、访问控制。access_by_lua: 在访问控制access阶段执行这是实现鉴权、限流的黄金位置。content_by_lua: 最重要的阶段用于生成响应内容。可以在这里实现完整的业务逻辑。header_filter_by_lua: 在过滤响应头时执行可以修改或添加响应头。body_filter_by_lua: 在过滤响应体时执行可以对响应内容进行流式处理如压缩、替换。log_by_lua: 在记录日志时执行可以定制化日志格式和内容。这种阶段化设计让你能像组装乐高一样将不同的Lua代码块插入到请求生命周期的精确位置实现高度定制化的处理流程。3. 从安装到第一个“Hello World”3.1 安装方式选型包管理 vs 源码编译部署OpenResty主要有两种方式。第一种使用官方预编译包推荐给大多数用户。这是最快捷、最稳定的方式。OpenResty官方为主流Linux发行版如CentOS, Ubuntu提供了仓库。以Ubuntu为例安装步骤如下# 导入OpenResty的GPG密钥和仓库源 sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates sudo wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add - echo deb http://openresty.org/package/ubuntu $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/openresty.list # 更新并安装 sudo apt-get update sudo apt-get install openresty安装完成后OpenResty的相关文件会集中在/usr/local/openresty/目录下包括可执行文件、模块和Lua库。第二种源码编译安装。当你需要自定义编译参数例如启用或禁用某些Nginx模块或指定特定的安装路径时需要选择这种方式。步骤大致是下载源码包通过./configure配置然后make make install。这种方式更灵活但需要对Nginx编译有一定了解。注意网上有些教程会教你直接安装Nginx然后再手动添加ngx_lua模块。这种方式极其不推荐因为模块版本兼容性、依赖库等问题会让你后期维护痛不欲生。OpenResty是一个整体发行版其内部组件经过了严格测试请务必使用官方打包的完整版本。3.2 基础配置与服务管理安装后OpenResty的主程序是openresty实际是Nginx的一个符号链接。它的配置文件结构与Nginx完全一致默认配置文件路径通常是/usr/local/openresty/nginx/conf/nginx.conf。启动、停止、重载服务# 启动 sudo systemctl start openresty # 或使用 openresty 命令 sudo /usr/local/openresty/bin/openresty # 停止 sudo systemctl stop openresty # 重新加载配置平滑重启不中断已有连接 sudo systemctl reload openresty # 或 sudo /usr/local/openresty/bin/openresty -s reload3.3 编写第一个Lua内容处理器让我们创建一个最简单的示例在浏览器中输出“Hello, OpenResty!”。首先编辑Nginx配置文件例如在http块内添加一个serverserver { listen 8080; server_name localhost; location /hello { default_type text/html; content_by_lua_block { ngx.say(h1Hello, OpenResty!/h1) ngx.log(ngx.INFO, Hello request processed.) -- 记录一条日志 } } }在这个配置中listen 8080;让服务器监听8080端口。location /hello匹配到/hello路径的请求。content_by_lua_block是关键指令它定义了一个内联的Lua代码块在content阶段执行。ngx.say()是OpenResty提供的Lua API用于向响应体输出内容。ngx.log()用于向Nginx错误日志中写入信息ngx.INFO是日志级别。保存配置后重载OpenResty服务sudo systemctl reload openresty。现在访问http://你的服务器IP:8080/hello就能看到醒目的“Hello, OpenResty!”了。这个简单的例子揭示了OpenResty的核心工作模式通过配置定位用Lua代码动态生成响应。它跳过了静态文件或反向代理到后端应用的步骤直接在网关层完成了“业务逻辑”。4. 核心组件与生态库详解OpenResty的强大一半在于核心另一半在于其围绕核心构建的丰富生态。4.1 核心Lua模块与Nginx交互的桥梁OpenResty提供了一系列核心Lua模块它们是你在脚本中与HTTP请求、Nginx变量、I/O操作交互的主要接口。ngx模块这是最核心的全局模块无需require即可使用。它提供了诸如ngx.say,ngx.print输出响应ngx.req.get_headers,ngx.req.set_header操作请求头ngx.var访问Nginx变量ngx.location.capture发起内部子请求等关键API。ndk与ffi模块用于更底层或高性能的扩展。ndkNginx Development Kit提供了一些底层API。而ffiForeign Function Interface库是LuaJIT的杀手锏允许你直接调用C语言库的函数无需编写C模块。这意味着你可以用Lua代码直接调用像libc、OpenSSL这样的系统库或者任何你拥有的C动态库性能损失极小。lua-resty-core这是一个性能优化库。它用纯Lua和FFI重新实现了许多核心API如ngx.re正则、ngx.balancer负载均衡器相比旧的C函数绑定方式性能有显著提升。新项目强烈建议在init_by_lua阶段或通过lua_package_path加载它。4.2 官方与社区第三方库开箱即用的武器库OpenResty社区贡献了大量高质量的lua-resty-*库覆盖了后端开发的常见需求。数据库与缓存lua-resty-redis: 连接Redis客户端支持连接池、管道操作。lua-resty-mysql: 连接MySQL客户端。lua-resty-memcached: 连接Memcached客户端。lua-resty-lrucache: 一个高效的Lua-land LRU缓存适合在Worker内缓存少量热点数据。编码与处理lua-resty-string: 提供字符串哈希如MD5、SHA1、随机数、AES加密等实用函数。lua-resty-template: 一个轻量级的模板引擎可以在Lua中渲染HTML等模板文件。lua-resty-rsa: RSA加密解密库。网络与协议lua-resty-websocket: 支持WebSocket通信。lua-resty-http: HTTP客户端库用于向上游服务发起请求。lua-resty-dns: DNS解析器客户端。工具与工具链opm(OpenResty Package Manager): OpenResty的官方包管理工具用于安装社区开发的lua-resty-*库。resty-cli: 一个命令行工具让你可以直接在终端运行独立的Lua脚本并拥有完整的OpenResty Lua API环境非常适合调试和编写工具脚本。使用这些库通常非常简单。以lua-resty-redis为例在Lua代码中local redis require resty.redis local red redis:new() red:set_timeout(1000) -- 设置超时1秒 local ok, err red:connect(127.0.0.1, 6379) if not ok then ngx.log(ngx.ERR, failed to connect to redis: , err) return ngx.exit(500) end local res, err red:get(my_key) -- ... 处理结果 -- 将连接放回连接池 local ok, err red:set_keepalive(10000, 100) -- 连接池大小100空闲10秒4.3 配置管理代码与配置的分离实践随着业务逻辑变复杂将大量Lua代码直接写在nginx.conf里会难以维护。最佳实践是将Lua代码组织成独立的.lua文件并通过content_by_lua_file指令引入。例如创建/usr/local/openresty/nginx/lua/app/hello.lualocal _M {} function _M.say_hello() local name ngx.var.arg_name or Guest ngx.say(pHello, , name, !/p) ngx.say(pCurrent time: , os.date(%Y-%m-%d %H:%M:%S), /p) end return _M然后在Nginx配置中引用location /greet { content_by_lua_block { local hello require app.hello hello.say_hello() } }访问/greet?nameTom就会得到个性化的问候。这种方式使得业务逻辑清晰便于版本控制如Git和团队协作。5. 高级应用场景与性能优化实战5.1 构建高性能API网关这是OpenResty最经典的应用场景。在一个微服务架构中API网关负责路由、认证、限流、监控等横切关注点。动态路由根据请求头、URL路径或参数将请求代理到不同的上游服务集群。local upstream_map { [/v1/users] user_service_backend, [/v1/orders] order_service_backend, } local path ngx.var.uri for route, upstream in pairs(upstream_map) do if string.find(path, route) 1 then ngx.var.upstream upstream break end end -- 然后使用 proxy_pass 指令JWT认证在access_by_lua阶段验证JWT令牌。local jwt require resty.jwt local auth_header ngx.var.http_Authorization if not auth_header then ngx.exit(ngx.HTTP_UNAUTHORIZED) end local token string.match(auth_header, Bearer%s(.)) local jwt_obj jwt:verify(your-secret-key, token) if not jwt_obj.verified then ngx.exit(ngx.HTTP_FORBIDDEN) end -- 将用户信息传递给上游例如通过请求头 ngx.req.set_header(X-User-ID, jwt_obj.payload.sub)限流Rate Limiting使用lua-resty-limit-traffic库基于IP或用户ID进行精确限流防止恶意刷接口。local limit_req require resty.limit.req local limiter limit_req.new(my_limit_store, 10, 5) -- 10 req/s, 5 burst local key ngx.var.binary_remote_addr -- 按IP限流 local delay, err limiter:incoming(key, true) if not delay then if err rejected then ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE) end ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if delay 0.001 then ngx.sleep(delay) -- 延迟处理实现平滑限流 end5.2 实现边缘计算与动态响应利用content_by_lua可以直接在距离用户最近的边缘节点CDN或网关生成动态内容减少回源延迟。A/B测试根据用户特征如Cookie、设备类型动态返回不同的页面版本或API响应。实时数据聚合从多个上游API获取数据在网关层进行聚合、过滤、格式化后返回给客户端减少客户端请求次数。响应个性化根据用户地理位置、语言偏好动态插入不同的内容或广告。5.3 关键性能优化与避坑指南OpenResty性能很高但错误的使用方式会导致性能骤降。阻塞操作是性能杀手在Lua代码中绝对禁止使用Lua原生可能引起阻塞的I/O操作例如os.execute,io.popen, 或者同步调用一个非常慢的外部网络服务不使用cosocket API。这会完全阻塞住当前Worker进程的事件循环导致该Worker无法处理其他请求。所有网络I/O都必须使用OpenResty提供的cosocket API如ngx.socket.tcp,ngx.socket.udp它们是100%非阻塞的。善用缓存Lua模块级缓存使用require加载的模块会被缓存。可以将一些只读的配置数据或预计算的结果放在模块的顶层变量中。Worker内缓存使用lua-resty-lrucache缓存频繁访问、计算成本高、且数据量不大的数据如用户会话信息、配置规则。共享字典shared dict通过lua_shared_dict指令声明可以在所有Worker进程间共享数据。适合存储计数器、限流状态、简单的分布式锁等。但要注意它不是Redis性能有上限且存储的是字符串复杂结构需要序列化。子请求与内部调用的权衡ngx.location.capture可以发起一个内部请求到本Nginx的其他location用于模块化设计。但要注意它是一个阻塞调用虽然不阻塞操作系统线程但会阻塞当前Lua协程。过度使用或串行使用子请求会增加请求延迟。对于可以并行获取的资源应考虑使用ngx.thread.spawnOpenResty的轻量级线程来并发处理。正确管理外部连接对于Redis、MySQL等外部服务连接务必使用连接池set_keepalive避免为每个请求都创建和销毁连接这是高并发下的基本素养。同时要为每个连接操作设置合理的超时时间。6. 开发、调试与运维实践6.1 开发工具链与工作流代码编辑任何支持Lua的编辑器都可以如VSCode Lua插件。关键是利用好resty-cli进行快速的离线代码测试。单元测试使用Test::Nginx一个Perl模块或resty命令配合断言库来编写测试。对于复杂的业务逻辑尽量将核心功能抽离成纯Lua函数便于单独测试。配置管理与部署将Nginx配置文件和Lua代码都纳入版本控制系统如Git。可以使用Ansible、SaltStack等配置管理工具或容器化Docker进行部署。Docker镜像可以直接使用官方的openresty/openresty。6.2 日志与监控结构化日志不要只用ngx.log(ngx.ERR, “something wrong”)。建议输出结构化的JSON日志便于被ELKElasticsearch, Logstash, Kibana或类似日志系统采集和分析。local cjson require “cjson.safe” local log_data { time ngx.localtime(), uri ngx.var.uri, status ngx.status, upstream ngx.var.upstream_addr, request_time ngx.var.request_time, remote_ip ngx.var.remote_addr, trace_id ngx.var.http_x_trace_id or “-” } ngx.log(ngx.INFO, cjson.encode(log_data))指标监控可以通过log_by_lua阶段收集请求耗时、状态码、上游响应时间等指标然后推送到监控系统如Prometheus。社区有lua-resty-prometheus库可以方便地暴露Prometheus格式的指标。6.3 常见问题排查清单500 Internal Server Error错误日志显示attempt to call a nil value原因最常见的原因是Lua模块路径问题require失败了。或者调用了未正确导入的API。排查检查lua_package_path和lua_package_cpath配置确保它们包含了你的Lua文件或.so库所在的目录。使用resty -e ‘print(package.path)’检查路径。在代码开头加入ngx.log(ngx.ERR, “module path: “, package.path)辅助调试。性能突然下降CPU或内存飙升原因可能发生了阻塞操作Lua代码中有死循环共享字典被过度使用导致锁竞争或触发了LuaJIT的JIT编译瓶颈。排查使用ngx.worker.exiting()在长时间循环中检查退出信号。使用resty -j v -e ‘…’启用LuaJIT的JIT dump分析。监控共享字典的使用情况。使用系统工具如perf,strace分析Worker进程状态。内存缓慢增长内存泄漏原因Lua代码中创建了全局变量或闭包且其引用一直未释放模块设计不当导致数据在模块级变量中不断累积cosocket连接未正确关闭或放回连接池。排查避免使用全局变量使用local。确保所有cosocket连接在使用后都通过set_keepalive放回池中或调用close。使用lua-resty-core的table.new和table.clear来复用大表减少GC压力。可以定期重启Worker配置worker_shutdown_timeout作为一种防御性策略。配置重载reload后旧代码似乎还在运行原因Lua模块被缓存了。require在第一次加载模块后整个Worker进程生命周期内都会使用缓存的版本。解决对于需要热更新的代码不要使用require而是使用loadfile或dofile性能有损耗需谨慎。或者通过发送信号kill -HUP master_pid触发全部Worker平滑重启新的Worker会加载新的代码。更优雅的方式是设计无状态的应用将状态外置到Redis或数据库中。OpenResty的学习曲线初期可能有些陡峭因为它要求你同时理解Nginx的配置模型和Lua编程。但一旦你掌握了它你就会发现它为你打开了一扇新的大门让你能够以前所未有的效率和性能来处理Web流量和业务逻辑。从简单的动态路由到复杂的API聚合网关从边缘计算节点到全功能的Web应用OpenResty的潜力只受限于你的想象力。我个人的经验是从小处着手从一个具体的优化点比如用OpenResty实现一个统一的鉴权层开始实践逐步深入你会逐渐体会到这种“在流量入口编程”的魅力所在。

相关新闻

为什么92%的AI工具网站6个月内倒闭?——资深架构师拆解存活率提升300%的4层防御体系

为什么92%的AI工具网站6个月内倒闭?——资深架构师拆解存活率提升300%的4层防御体系

更多请点击: https://codechina.net 第一章:为什么92%的AI工具网站6个月内倒闭?——资深架构师拆解存活率提升300%的4层防御体系 AI工具创业潮中,大量产品在上线后迅速消亡。真实数据来自2023–2024年Crunchbase与AWS Serverless…

2026/10/9 13:46:55 阅读更多 →
可灵画幅比例设置全避坑手册:93%新手踩过的5个致命错误及3步矫正法

可灵画幅比例设置全避坑手册:93%新手踩过的5个致命错误及3步矫正法

更多请点击: https://intelliparadigm.com 第一章:可灵画幅比例设置的底层逻辑与认知重构 可灵(Kling)作为新一代AI视频生成引擎,其画幅比例并非仅是界面下拉菜单中的静态选项,而是深度耦合于模型推理路径…

2026/10/14 9:13:43 阅读更多 →
WorkBuddy-极简入门-基本概念+任务实例

WorkBuddy-极简入门-基本概念+任务实例

参考 https://workbuddy.homes/bluebook/基本概念方式本质适合的问题普通任务通用理解与执行一次性的清楚任务Skill特定工具能力需要稳定执行某个动作专家人设 方法论 工具链明确领域的单点专业问题专家团多位专家 协作流程需要拆解、并行、汇总的复杂项目任务 如何写任务说…

2026/10/12 18:08:07 阅读更多 →

最新新闻

iphone prores视频在windows用命令行一行转mp4

iphone prores视频在windows用命令行一行转mp4

背景情况和需求 iphone打开了prores录制了巨大的130g的一个4k原视频, 我不需要保留这么大的视频又希望能保留其视频内容, 我希望能压缩然后只需要正常视频即可不用这么详细的原视频. 限制条件: iphone存储爆满了, 没什么空间给我原地转换, 或用专业软件如剪映打开并转换; 我的电…

2026/10/14 19:41:51 阅读更多 →
AI幻觉八年未愈:从概率生成到RAG工程治理的实战指南

AI幻觉八年未愈:从概率生成到RAG工程治理的实战指南

1. 从“八年祭”说起:AI幻觉为什么值得反复拿出来讲“AI幻觉”这个词,这几年被说得太多,多到有点麻木。但如果你真的在一线做过模型落地,就会知道它从来不是一个学术名词,而是一个会实实在在让人半夜爬起来改代码、写道…

2026/10/14 19:41:51 阅读更多 →
客户发来 7 个 Excel 说“数据都在这了“:我清洗了三个晚上的完整实录(烂表变准的 5 个步骤)

客户发来 7 个 Excel 说“数据都在这了“:我清洗了三个晚上的完整实录(烂表变准的 5 个步骤)

前两天一个客户准备上系统,跟我说"数据我都整理好了,你导吧",然后甩过来 7 个 Excel 文件。我一个个点开,看到第三个的时候沉默了。 给大家看看里面是什么样的:合并单元格做的大表头;数字存成了文…

2026/10/14 19:41:51 阅读更多 →
MySQL max_allowed_packet参数引发的数据库故障排查与调优指南

MySQL max_allowed_packet参数引发的数据库故障排查与调优指南

1. 事故现场:一个参数让我半夜爬起来救火先交代一下背景。那天晚上我本来已经睡下了,手机突然连着震了七八下——值班群里有人刷屏:订单服务全线报错,支付回调大面积失败,用户侧反馈下单直接转圈超时。我爬起来打开电脑…

2026/10/14 19:41:51 阅读更多 →
MySQL max_allowed_packet参数引发应用崩溃:一场事故的完整复盘与预防

MySQL max_allowed_packet参数引发应用崩溃:一场事故的完整复盘与预防

1. 事故还原:从连接数与CPU都没问题说起凌晨两点多,某线上核心服务开始告警。我打开监控平台时心里已经预演了好几种可能:连接数被打满、慢查询堆积、磁盘快满。结果画面对不上——max_connections 还有一半余量,CPU 负载连 20% 都…

2026/10/14 19:41:51 阅读更多 →
iso8211lib解析S-57电子海图:从二进制格式到坐标提取指南

iso8211lib解析S-57电子海图:从二进制格式到坐标提取指南

简介:ISO8211lib是一套解析和生成ISO 8211标准数据文件的C库,主要面向GIS、地球科学、遥感与测绘领域的开发者和数据专业人员,解决不同系统间多元地理数据交换与集成的读取、写入和操作问题。ISO 8211标准定义了地质、气候、地形等数据的组织…

2026/10/14 19:40:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →