java部署项目流程

java部署有几种方式,这里说一个比较简单的

方式一:Docker 容器化部署

Docker:将Java应用程序及其运行时环境打包成一个Docker镜像。Docker容器提供了隔离的运行环境,确保应用程序在不同环境中具有一致的行为。可以通过Docker Compose或Kubernetes等工具来管理和部署多个容器化应用。(后续会出教程)

方式二:云平台部署

  • PaaS (Platform as a Service):如Heroku、Google App Engine、AWS Elastic Beanstalk等云平台提供了Java应用的托管服务。开发者只需上传代码或WAR/JAR文件,平台会自动处理应用的部署、扩展和管理。

  • IaaS (Infrastructure as a Service):如AWS EC2、Azure VM、Google Compute Engine等云平台允许您创建虚拟机并在其上部署Java应用。您可以完全控制服务器的配置和环境设置。

  • Serverless:如AWS Lambda、Google Cloud Functions等无服务器计算平台允许您以函数的形式部署Java代码,按需执行并自动扩展。

这里为了方便使用宝塔进行部署

宝塔面板(BT Panel)是一款基于Web的Linux服务器管理工具,旨在简化Linux服务器的管理和部署过程。它提供了图形化的用户界面,宝塔面板支持多种操作系统,如CentOS、Ubuntu、Debian等,并且提供了丰富的功能来帮助用户部署和管理网站、数据库、邮件服务等。

涉及到具体的部署方式,前端要遵循 Next.is 服务端渲染的部署模式,基于 Node.is 运行;后端可以直接运行 jar 包。

也可使用docker进行部署,有空了会出过程

部署计划

前端:通过 Nginx 进行部署,访问地址为 http://{域名}。由于是 Node 服务,实际运行在 3000 端口。

后端:通过 Nginx 进行转发,访问地址为 http://{域名}/api 。实际运行在 8101 端口。JDK 建议选择 17 版本!

为什么要用 Nginx 转发?

前端和后端域名一致,保证不会出现跨域问题。

Nginx:服务器 80 端口,默认已安装,

数据库:服务器 3306 端口,默认已安装。

Redis:服务器 6379 端口,需要手动安装

做好规划后,我们需要在腾讯云控制台的防火墙中开通需要外网访问的服务端口:

添加自己需要开放的防火墙即可

环境准备

mysql,这里使用docker进行安装

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
  mysql

里面的账号密码可以自行设置

宝塔也可进行直接安装mysql,这里不做演示,redis使用宝塔进行演示

redis安装,搜索直接安装即可

要部署 Java 项目,必须安装 JDK。在宝塔面板中,可以通过下图的方式快速安装指定版本的 JDK。

建议多安装几个版本,比如 JDK8、11、17,需要用哪个版本的时候可以随时切换。

后端代码打包

修改 application-prod 生产环境配置,包括数据库、Redis 等,替换为上述安装依赖时指定的配置(如用户名、密码)

以下仅供参考,总之就是把数据库连接等配置改为线上地址 改之前可以手动进行连接测试

# 线上配置文件
server:
  port: 8101
spring:
  # 数据库配置
  # todo 需替换配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://你自己的服务器地址:3306/mianshiniu
    username: root
    password: 你自己的数据库密码
  # Redis 配置
  # todo 需替换配置
  redis:
    database: 1
    host: 你自己的服务器地址
    port: 6379
    timeout: 5000
    password: 你自己的数据库密码
  # Elasticsearch 配置
  # todo 需替换配置
  elasticsearch:
    uris: http://你自己的服务器地址:9200
#    username: root
#    password: 你自己的es密码
mybatis-plus:
  configuration:
    # 生产环境关闭日志
    log-impl: ''
#mybatis-plus:
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 接口文档配置
knife4j:
  basic:
    enable: true
    username: root
    password: 自己设置



sa-token:
  # token 名称(同时也是 cookie 名称)
  token-name: token
  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
  timeout: 2592000
  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  active-timeout: -1
  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
  is-concurrent: false
  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
  is-share: true
  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  token-style: uuid
  # 是否输出操作日志
  is-log: true

打包即可

打包成功后会得到一个jar包

上传jar包到服务器

上传完成后,运行jar包即可

启动成功后即可看到

如果失败了可查看项目运行日志

但是现在我们无法通过ip地址加接口文档地址访问到测试文档

这是因为我们的服务器防火墙没有放开 8101端口。这里我们故意不放开,因为在之前的部署规划中,后端需要通过 Nginx 进行转发,从而解决跨域问题。

nginx配置

新建一个php(只是使用Nginx进行代理转发,并不写代码)

如果访问的是后端接口(地址有 /api 前缀),则 Nginx 将请求转发到后端服务,对应配置代码如下:

location /api {
  proxy_pass  http://127.0.0.1:8101;
  proxy_set_header Host $proxy_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_buffering off;
  proxy_set_header Connection "";
}

添加代理规则

一定要注释掉下列配置!**否则访问接口文档时,静态资源的加载可能会出错:

服务器ip地址加/api/doc.html即可访问到接口文档

前端
环境准备

要选择稳定的版本进行安装

打包
  1. 线上的前端需要请求线上的后端接口,所以需要修改 libs/request.ts 文件中的请求地址为线上:

改为线上地址,因为Next.js在构建时需要调用后端接口,所以后端必须启动才能完成构建

  1. 修改 Nextjs 配置文件 next.config.mjs ,使用 standalone 模式部署,这样上传到服务器的时候可以不用上传 nodemodules 目录。

ignoreBuildErrors: true, 忽略构建时的语法错误

  1. 执行打包命令,注意node.js版本要大于18.18,否则报错

如果构建过程中出现其他错误,需要根据错误信息排查并处理。比如下面这个示例,显然是 TypeScript 类型错误:

找到 fileController 文件,加个 // @ts-ignore 就好了:

可能还会遇到其他因为类型的错误,这类错误不影响运行,但是会在 Next,js 打包时被检测,可以根据实际情况修改。或者直接在打包时忽略 TypeScript错误,参考官方文档:Configuration: TypeScript | Next.js

注意,如果后端接口没启动,也可能会导致打包错误!

打包成功后,看到下图信息,能够很直观地看到哪些页面用到了静态渲染和服务端渲染:

然后在 .next 日录下会生成 standalone 目录,该目录就是可以独立部署的前端包。但是必须按照如下模式组织目录,一定不能有错!

  • 1.将项目根目录下的 public 日录移动到.next/standalone 内
  • 2.将.next/static日录移动到.next/standalone/.next内

目录结构如下

3.上传服务器,只需要上传standalone下的文件即可,建议打成压缩包上传,解压即可

4.新建一个node项目

修改配置

可以查看启动时的项目日志,快速定位问题

5 nginx转发

当用户访问除了后端之外的任何地址时,都找到前端的node服务 http://127.0.0.1:3000;,从而访问到页面

location / {
  proxy_pass  http://127.0.0.1:3000;
  proxy_set_header Host $proxy_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_buffering off;
  proxy_set_header Connection "";
}

完整的nginx代理如下

访问即可 ip或域名即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值