完整教程:应用部署(后端)

news/2025/10/13 9:11:07/文章来源:https://www.cnblogs.com/yxysuanfa/p/19137689

在项目中,将AI生成的应用存储在本地目录中,手动双击打开HTML来查看网站生成效果。我们想将其平台化,就要将应用部署到。

部署方案

考虑到成本原因,我们这里选择把本地生成的文件同步到一个Web服务器的不同目录上。用户通过URL访问应用(如https://code-ai.cn/app1/)。

方案一:使用serve工具

这是最简单的方案,通过Node.js的serve包可以快速启动一个Web服务器,为指定目录提供Web访问服务。(前提是本地下载的有Node.js)

1.先安装serve工具:

npm i -g serve

2.在要部署的本地文件目录内运行serve或npx serve,就能查看到目录内的网站。

访问对应的路径,直接就能访问到对应的网站。

使用时,需要提前在服务器上启动serve服务器,就能为特定的部署目录提供web服务,然后部署时将代码文件移动到该目录下即可。

这种方式的优点是配置简单,缺点是依赖Node.js环境,且性能较低。

3.我们也可以让serve服务器跟随Spring Boot 项目启动或关闭:

3.1 使用命令行运行serve

@Service
public class ServeDeployService {private static final String CODE_BASE_DIR = "/tmp/deploy";private static final int SERVE_PORT = 3000;private static Process serveProcess;/*** 启动 Serve 服务*/public void startServeService() {try {if (serveProcess == null || !serveProcess.isAlive()) {ProcessBuilder pb = new ProcessBuilder("npx", "serve", CODE_BASE_DIR, "-p", String.valueOf(SERVE_PORT));pb.redirectErrorStream(true);serveProcess = pb.start();System.out.println("Serve service started on port " + SERVE_PORT);}} catch (Exception e) {throw new RuntimeException("Failed to start serve service", e);}}/*** 关闭 Serve 服务*/public void stopServeService() {if (serveProcess != null && serveProcess.isAlive()) {serveProcess.destroy();try {serveProcess.waitFor(5, TimeUnit.SECONDS);System.out.println("Serve service stopped");} catch (InterruptedException e) {serveProcess.destroyForcibly();System.out.println("Serve service force stopped");}}}
}

3.2 控制serve进程的生命周期:

@Component
public class ServeLifecycleManager {@Autowiredprivate ServeDeployService serveDeployService;/*** Spring Boot 启动完成后启动 Serve 服务*/@EventListener(ApplicationReadyEvent.class)public void onApplicationReady() {serveDeployService.startServeService();}/*** Spring Boot 关闭时停止 Serve 服务*/@PreDestroypublic void onApplicationShutdown() {System.out.println("Shutting down Serve service...");serveDeployService.stopServeService();}
}

方案二:通过Spring Boot 接口

在后端中实现一个静态资源服务接口,输入部署路径,返回相应的文件。

@RestController
@RequestMapping("/static")
public class StaticResourceController {// 应用生成根目录(用于浏览)private static final String PREVIEW_ROOT_DIR = System.getProperty("user.dir") + "/tmp/code_output";/*** 提供静态资源访问,支持目录重定向* 访问格式:http://localhost:8081/api/static/{deployKey}[/{fileName}]*/@GetMapping("/{deployKey}/**")public ResponseEntity serveStaticResource(@PathVariable String deployKey,HttpServletRequest request) {try {// 获取资源路径String resourcePath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);resourcePath = resourcePath.substring(("/static/" + deployKey).length());// 如果是目录访问(不带斜杠),重定向到带斜杠的URLif (resourcePath.isEmpty()) {HttpHeaders headers = new HttpHeaders();headers.add("Location", request.getRequestURI() + "/");return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);}// 默认返回 index.htmlif (resourcePath.equals("/")) {resourcePath = "/index.html";}// 构建文件路径String filePath = PREVIEW_ROOT_DIR + "/" + deployKey + resourcePath;File file = new File(filePath);// 检查文件是否存在if (!file.exists()) {return ResponseEntity.notFound().build();}// 返回文件资源Resource resource = new FileSystemResource(file);return ResponseEntity.ok().header("Content-Type", getContentTypeWithCharset(filePath)).body(resource);} catch (Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}}/*** 根据文件扩展名返回带字符编码的 Content-Type*/private String getContentTypeWithCharset(String filePath) {if (filePath.endsWith(".html")) return "text/html; charset=UTF-8";if (filePath.endsWith(".css")) return "text/css; charset=UTF-8";if (filePath.endsWith(".js")) return "application/javascript; charset=UTF-8";if (filePath.endsWith(".png")) return "image/png";if (filePath.endsWith(".jpg")) return "image/jpeg";return "application/octet-stream";}
}

这种方案的优点是无需额外进程,非常方便;缺点是功能相对简单,性能也不如专业的Web服务器。

方案三:使用 Nginx 映射

Nginx是专业的Web服务器,性能优异,功能丰富,因此这是最推荐的生产环境方案。

Nginx 映射的核心目标是:让用户无需记忆 “端口 + 复杂路径”,仅通过 “域名 + 简短路径”(如https://你的域名/my-app/),即可同时访问前端页面和调用后端接口,且隐藏后端服务细节

1. 到nginx官网下载Nginx:nginx: download

下载好以后,找到Nginx配置文件nginx.conf,Windows系统直接到安装目录下找。

2. 修改Nginx配置,http块中添加serve块,配置root为项目部署根目录

# 静态资源服务器 - 80 端口
server {listen       80;server_name  localhost;charset      utf-8;charset_types text/css application/javascript text/plain text/xml application/json;# 项目部署根目录root         /Users/yupi/Code/ai-code/tmp/code_deploy;# 处理所有请求location ~ ^/([^/]+)/(.*)$ {try_files /$1/$2 /$1/index.html =404;}
}

3. 重载配置

启动Nginx,或者输入命令来重载配置:

nginx -s reload

然后访问80端口,就能看到网站了。

这种方案最佳,最适合生产环境,缺点是需要额外引入Nginx组件。

方案四:COS对象存储

还可以通过COS对象存储的静态网站访问能力,同时实现存储和访问;缺点是需要自定义域名。

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

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

相关文章

C# 定时任务 Quartz.NET 的使用

C# 定时任务 Quartz.NET 的使用一、定时任务的介绍 相信我们在生活中,大部分都会使用到定时任务去执行自定义的业务逻辑,如:每天早上8点钟发送一份汇总好的财经报告到指定人的邮箱;或者每周一5点30分钟自动执行下载…

2025.10.13——1橙

普及- P9752 [CSP-S 2023] 密码锁 虽然只是小模拟,但确实是真题,有点感觉。

WPF 通过RawInput获取系统全局触摸事件

WPF 通过RawInput获取系统全局触摸事件在做大屏或者平板的业务,或多或少会有监听触摸事件的需求。在WPF 上,监听自身应用的触摸事件是很简单的,可以监听 Windows的 Stylus、Touch、甚至是 Mouse的事件来实现业务逻辑…

基于高频电流探头的电磁兼容(EMI/EMC)测试与诊断技术方案

电磁兼容性(EMI/EMC)测试是确保电子设备在复杂电磁环境中可靠运行的重要环节。高频电流探头采用非侵入式测量方式,能够精准地捕捉电缆上的噪声电流,为诊断和解决电磁干扰问题提供可靠的数据支持。本文详细介绍了高…

Spring 事务、循环依赖连环问

Spring 事务 详情请查看:Spring 事务 Spring 事务实现方式有哪些? 事务就是一系列的操作原子执行。Spring事务机制主要包括声明式事务和编程式事务。编程式事务:通过编程的方式管理事务,这种方式带来了很大的灵活性…

20232327 2025-2026-1 《网络与系统攻防技术》实验一实验报告

20232327 2025-2026-1 《网络与系统攻防技术》实验一实验报告 1.实验内容 在本周的课程学习了缓冲区溢出和shellcode攻击的内容,以下是一些基本概念和解释:缓冲区:连续的一段存储空间; 缓冲区溢出攻击BOF(Buffer …

完整教程:OSPF LSA/ 路由种类

完整教程:OSPF LSA/ 路由种类2025-10-13 08:46 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

单挑市面上所有监控设备模拟器/可能是最好用的监控模拟器/支持onvif和28181协议/虚拟监控/桌面转监控/任意源转监控设备

一、前言说明 自从发布了这个监控设备模拟器,本意其实是卖代码,可是受欢迎程度不是程序员开发者,而是一堆非开发人员,没想到这个一个毫不起眼的需求,在外行人看来是真切实际的需求,比如一些收银台,需要把收银软…

在Java 11中,如何处理被弃用的类或接口?

在Java 11中处理被弃用的类或接口时,核心原则是使用官方推荐的替代方案,避免依赖过时API以确保代码的兼容性和可维护性。以下是具体处理方式和示例: 1. 替换内部API类(sun.* 或 com.sun.* 包下的类) 这些类属于JD…

chmod只修改文件或者只修改目录权限

chmod和chmod -R目录常用于修改文件,文件夹权限。加上-R参数会迭代的修改子目录和文件的权限。如果只想修改文件的权限,文件夹的权限不受影响。则可以使用下面的方法:chmod 750 `find /a /b -type f`会修改文件夹/a…

每周资讯 | 腾讯《三角洲行动》周年庆登双榜TOP1;腾讯首款生活模拟游戏《粒粒的小人国》曝光 - 教程

每周资讯 | 腾讯《三角洲行动》周年庆登双榜TOP1;腾讯首款生活模拟游戏《粒粒的小人国》曝光 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

.NET 自动依赖注入神器

在 .NET Core/Web 项目中,手动写一堆 services.AddScoped<...>、AddSingleton<...> 是否让你头大?今天给大家介绍一个神器——Injectio,帮你自动扫描并注册服务,减少重复代码,让你的依赖注入(DI)更…

NetDreamCTF WP - 指南

NetDreamCTF WP - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

[1134] Connecting to Land Insight SFTP and GIS Servers

[1134] Connecting to Land Insight SFTP and GIS ServersHi Sir Bing,Greetings!Please be informed of your user credentials to servers. Also attached is the Work Instruction and PPK to connect to servers f…

VLA技术论文阅读 - 详解

VLA技术论文阅读 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

深入解析:246-基于Django的美食菜谱数据分析推荐系统

深入解析:246-基于Django的美食菜谱数据分析推荐系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

PhotoShop网页版在线为图片加文字,制作个性海报教程

生活中,我们总有需要给图片加文字、或是亲手做一张个性海报的时候。你是不是也觉得用专业Photoshop太复杂?别担心,现在只要打开浏览器,进入在线修图平台,零基础也能快速上手,轻松做出创意十足的作品! 一、为什么…

实用指南:构建神经网络的两大核心工具

实用指南:构建神经网络的两大核心工具pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

简单高效的SQL注入测试方法:Break Repair技巧详解

本文详细介绍了SQL注入测试的简单有效方法,重点讲解Break & Repair技巧,包括数据库类型识别、盲注测试和信息提取等关键步骤,适合网络安全初学者和渗透测试人员学习参考。Break & Repair:我是如何以最简单…

实用指南:Qt 界面优化 --- QSS

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …