API项目部署上线

API项目部署上线

配置交换空间

如果你跟我一样云服务器的内存很小,但是又没钱升级。可以配置一下交换空间

我后来还是新购了2c4g的服务器。API项目比较吃内存,纯净的2c2g部署勉勉强强,如果还部署了其他项目的话可能就部署不了API项目了

在Linux中,配置交换空间(Swap Space)是为了扩展系统的虚拟内存而设置的一块磁盘空间。交换空间允许操作系统将内存中不常用的数据移动到硬盘上,以释放内存供其他需要更紧急的任务使用。

配置交换空间的目的是为了解决内存不足的问题。当系统内存不足时,操作系统会将部分内存中的数据移到交换空间中,这样可以腾出内存空间供其他程序使用。交换空间的大小通常是物理内存大小的两倍或更多,但并不是越大越好,过大的交换空间可能会影响系统性能。

在CentOS 7系统上配置4G的交换空间,您可以按照以下步骤进行操作:

  1. 打开终端或登录到CentOS 7系统的命令行界面。

  2. 确保您具有root用户权限,或者以root用户身份执行以下命令。如果您不是root用户,请使用sudo命令来执行以下命令。

  3. 创建一个4G大小的交换文件。可以使用以下命令创建一个名为swapfile的4G交换文件:

    sudo fallocate -l 4G /swapfile
    
  4. 设置交换文件的权限,只允许root用户进行读写操作。执行以下命令:
    sudo chmod 600 /swapfile
    
  5. 使用mkswap命令将交换文件格式化为交换分区。执行以下命令:
    sudo mkswap /swapfile
    
  6. 启用交换文件,使用swapon命令。执行以下命令:
    sudo swapon /swapfile
    
  7. 确认交换空间已成功启用。执行以下命令:
    sudo swapon --show
    

    如果成功配置,将显示交换分区的相关信息。

  8. 更新系统的/etc/fstab文件,以便在启动时自动启用交换分区:

    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    

image-20230916012602014


前端部署

修改url

修改src/requestConfig.ts文件的baseURL地址为真实的地址

baseURL: 'http://后端公网ip地址:7529',

image-20230916004928193


静态化设置

config/config.ts文件(最后一行)中添加

exportStatic: {},

image-20230916000346088


打包前端项目

运行build把前端项目打包

build命令运行完之后,根目录下会多了一个dist文件夹

在前端开发中,我们通常会使用构建工具(如Webpack、Parcel等)将源代码转换为可在浏览器中运行的静态文件。这个过程包括了代码的打包、压缩、转译等操作,最终生成的静态文件就是放置在 dist 文件夹中。

image-20230916005455660
image-20230916005526092

打包好后,可以通过serve来本地运行一下这个项目

如果没有安装的,需要安装serve

serve 可以启动一个本地服务器,用于提供前端应用程序的静态文件。它可以监听指定的端口,并将静态文件提供给浏览器进行访问。这样可以在本地进行开发,并实时查看应用程序的效果。

以管理员身份运行cmd,输入npm i -g serve,回车。等待安装完成

b02e4f1d504820cd75df2a3a5c102a4


在VS中,右键dist文件夹 –>复制路径

image-20230916010105105

然后在终端中,进入这个文件夹里。比如我刚刚复制的路径是D:\api-platform\yuapi-frontend-master\dist

那么就在终端中输入命令cd D:\api-platform\yuapi-frontend-master\dist

image-20230916010234534

然后输入serve,就可以在本地运行这个项目了。

image-20230916010341268

serve相当于在本地启动了一个web服务器,类似于nginx。可以在本地把网页文件(dist文件夹)放到服务器上启动起来,让我们可以访问

我们访问NetWork的链接:http://xxx.xxx.xxx.xxx:3000。可以看到能够成功访问前端服务。

image-20230916010819366


宝塔创建前端站点

  1. 添加一个PHP站点

    image-20230916013840179

  2. 只填域名,其他默认就行。填好域名项后点击提交

    没有域名的可以先填ip

    image-20230916014237857

  3. 删除根目录下的内容

    宝塔面板左侧栏找到文件,然后进入刚刚创建的文件夹(刚才新建站点的根目录)

    把这几个原始生成的内容全部删掉

    点击删除后,.user.ini文件还是在,我就保留了

    也就是说,我只删除了除.user.ini文件外的其他3个文件

    image-20230916014600940

  4. dist文件夹里的内容拖到根目录下

    image-20230916015159867

  5. 测试访问域名

    访问前端域名,可以成功访问到前端项目

    image-20230916015736940

  6. 配置nginx

    一定要配置,否着前端不能正常访问到后端

    宝塔面板左侧栏点击网站,点击刚刚新建的站点,点击配置文件

    image-20230916020025411

    在配置文件中加入下面配置后,点击保存

       #访问api后端相关配置
       location / {
       # 用于配合 browserHistory使用
       try_files uriuri/index.html /index.html;
       }
       location /api {
         rewrite ^/api/(.*) /1 break;
         # 后台服务地址
         proxy_pass http://后端ip地址/api;
         proxy_set_header   X-Forwarded-Protoscheme;
         proxy_set_header   Host              http_host;
         proxy_set_header   X-Real-IPremote_addr;
       }
    

    image-20230916020415446

至此,前端项目上线完毕~


后端部署

开放端口

首先宝塔面板和云服务器都要开放下面几个端口:

宝塔面板、云服务器都要开放

8848(Nacos)、9848(Nacos1)、9849(Nacos2)、3306(MySQL)、7529(backend)、8090(gateway)、8123(interface)

image-20230916151529144


安装Java环境

在宝塔面板中,网站 --> Java项目 --> 安装Tomcat

因为我的服务器还没有Java环境,所以要安装Tomcat。

如果已经有Java环境的话就不用重复安装了

image-20230916152352482

安装Tomcat9。等待安装完成

因为springboot2.7内置的是tomcat9

image-20230916152439018

移植数据库

  1. 在宝塔面板中新建一个数据库(自己用Navicat新建也行)

    image-20230916144743766

  2. 如果想要在Navicat中访问到这个数据库,就要修改一下数据库的权限

    在对应的数据库中,点击权限,把访问权限更改为所有人

    image-20230916151857472

  3. 然后把这4个表复制到新的数据库

    image-20230916150601162


下载安装Nacos

我在宝塔软件商店中没有找到Nacos,所以手动下载了安装包放在服务器里

注意服务器安装的Nacos版本要与之前写代码时候启动的Nacos版本保持一致

我上传到了(/user/local)路径里

  1. 进入该路径
    cd /usr/local
    
  2. 输入解压命令
    tar -zxvf nacos-server-2.2.3.tar.gz
    
    • tar: 是一个用于打包和解包文件的命令。
    • -zxvf: 是tar命令的选项和参数。其中,-z表示使用gzip解压缩,-x表示解包,-v表示显示详细的处理信息,-f表示后面紧跟着要解包的文件名。
    • nacos-server-2.2.3.tar.gz: 是要解压缩的文件名。

    执行这个命令将会将”nacos-server-2.2.3.tar.gz”文件解压缩,并还原其中的文件和目录结构。解压后的文件将会被放置在当前目录下

    image-20230916154201504

    解压完成后可以把压缩包删除掉(小小的服务器真是寸土寸金)

  3. 减小nacos启动时占用的内存大小

    因为我的服务器内存很小,所以要进行这一步。如果你内存比较大的话也可以直接启动Nacos

    解压完成后,在当前目录下会多出来一个Nacos文件夹。

    输入下面命令进入bin目录

    cd /usr/local/nacos/bin
    

    里面有一个startup.sh文件,

    image-20230916154441754

    startup.sh文件里的:

    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn128m"
    

    修改为:

    JAVA_OPT="${JAVA_OPT} -Xms64m -Xmx64m -Xmn16m"
    

    在这个命令中,-Xms64m表示设置Java堆的初始大小为64MB,-Xmx64m表示设置Java堆的最大大小为64MB,-Xmn16m表示设置新生代的大小为16MB。

    image-20230916154641200

    然后保存退出。

    因为我是用的FinalShell远程连接的服务器,所以可以直接双击打开文件修改

    也可以用xvim startup.sh命令修改

  4. 启动Nacos

    在bin目录下,执行下面命令单机启动Nacos

    sh startup.sh -m standalone
    

    如果需要关闭Nacos

    方法一:可以在bin目录下执行这条命令:sh shutdown.sh

    方法二:直接输入这条命令ps -ef | grep nacos | grep -v grep | awk '{print $2}' | xargs kill -9

    • ps -ef: 这个命令用于列出当前系统中所有正在运行的进程。
    • grep nacos: 在进程列表中过滤出包含关键词”nacos”的行。
    • grep -v grep: 过滤掉包含关键词”grep”的行,避免将grep命令本身也匹配进来。
    • awk '{print $2}': 使用awk命令提取每行的第二个字段,即进程ID。
    • xargs kill -9: 将之前提取的进程ID作为参数传递给kill命令,并使用信号9(SIGKILL)强制终止这些进程。

    综合起来,这个命令的目的是找到所有名为”nacos”的进程,并将其强制终止。

  5. 解决报错

    我在启动Nacos的时候出现了一个报错

    [root@pidanxiaali bin]# sh startup.sh -m standalone
    which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
    readlink: 缺少操作数
    Try 'readlink --help' for more information.
    dirname: 缺少操作数
    Try 'dirname --help' for more information.
    ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!
    

    上网查了一下应该是启动脚本里面没有配置java变量

    解决方法:

    startup.sh文件开头加上jdk的路径

    image-20230916162103265

    可以在宝塔面板网站 --> Java项目 --> 添加Java项目里看到jdk的路径位置

    比如我这里的路径就是:/usr/local/btjdk/jdk8

    image-20230916162003139

浏览器访问:http://服务器外网地址:8848/nacos/。查看Nacos是否启动成功

能访问到就是启动成功了~

image-20230916162431650

部署Bakcend项目

记得要先开启Nacos

  1. 修改cilent-sdk项目

    修改网关IP为服务器IP

    image-20230916164844930

    修改完成后,重新执行maven的install函数重新打包

  2. backend项目中,刷新一下maven。复制一个application.yml文件改名为application-prod.yml

    application.yml 是主要的配置文件,用于开发和测试环境的配置,而 application-prod.yml 是生产环境的配置文件,用于生产环境特定的配置。

    application.yml是默认配置,而上线时,application-prod.yml中的配置会覆盖掉application.yml的配置。

    有什么需要修改的配置,可以不用修改application.yml文件,而是直接在application-prod.yml文件中添加需要修改的配置

  3. 修改dubbo配置host地址,数据库的url、用户名和密码
    spring:
     datasource:
       driver-class-name: com.mysql.cj.jdbc.Driver
       url: jdbc:mysql://公网IP:3306/pidanapi
       username: 数据库用户名
       password: 数据库秘密
    
    dubbo:
     application:
       name: dubbo-springboot-demo-provider
     protocol:
       name: dubbo
       port: -1
     registry:
       id: nacos-registry
       address: nacos://公网IP:8848
     config-center:
       timeout: 40000
    

    image-20230916163847730

  4. 执行maven的package函数命令打包

    生成的jar包在backend项目的\target文件夹里

    image-20230916165356985

  5. 宝塔面板上传jar包到服务器

    在宝塔面板的文件项中,在创建3个对应的文件夹,把刚刚的jar包上传到backend文件夹中

    image-20230916165525293

  6. 添加Java项目

    网站 --> Java项目 --> 添加Java项目

    主要是两项

    项目jar路径:选择刚刚上传的jar包

    项目端口:要填真实的backend项目端口

    其他可以报保持默认。点击提交

    image-20230916170118397


部署gateway项目

  1. 配置application-prod.yml

    跟backend项目一样,复制一个application.yml文件改名为application-prod.yml

    添加内容:

    dubbo:
     application:
       name: dubbo-api-platform-backend-provider
     protocol:
       name: dubbo
       port: -1
     registry:
       id: nacos-registry
       address: nacos://公网IP:8848
    
  2. 修改CustomGlobalFilter文件的模拟接口地址为服务器IP
    private static final String INTERFACE_HOST = "http://公网IP:8123";
    

    image-20230916170718572

  3. 添加Java项目

    修改完成后,执行maven的package函数命令打包

    把jar包上传到gateway文件夹中

    添加Java项目,选好jar包填好真实的端口号。点击提交

    image-20230916171125330

部署Interface项目

  1. 自己看看配置文件有没有需要修改的,我的没有,就直接打包了

  2. 添加Java项目

    执行maven的package函数命令打包

    把jar包上传到interface文件夹中

    添加Java项目,选好jar包填好真实的端口号。点击提交

    image-20230916171430336

测试项目

注意项目的启动顺序是:先启动Nacos –> 启动backend–> 启动gateway(一定要backend启动成功后)–> 启动interface

  1. 登录Nacos管理页面看看服务有没有注册上

    下面的页面已经成功注册上了

    image-20230916171613006

  2. 打开我们的网站,测试是否能成功调用

    这里看到接口可以成功调用!而且请求地址也对的上。

    image-20230926064132466

    image-20230926063814494


踩坑合集

  1. application-prod.yml文件不生效

    这个问题我之前做毕设的时候也出现过。我明明有application-prod.yml文件,但是文件内容却没有生效,上线后运行的却是application.yml文件。这个问题我暂时还没找到什么原因,但是我可以通过修改application.yml文件来修改配置,只不过会有点麻烦。不知道大家有没有跟我一样的情况,如果有相同情况的话,可以参考下面我的application.yml文件,给大家参考:

    backend项目的application.yml:(我在云服务器中没有使用redis来缓存session,所以我注释掉了)

    spring:
     application:
       name: pidanxiaapi-backend
     # DataSource Config
     datasource:
       driver-class-name: com.mysql.cj.jdbc.Driver
       url: jdbc:mysql://公网IP:3306/pidanapi
       username: 数据库登陆名字
       password: 数据库登录密码
    
     mvc:
       pathmatch:
         matching-strategy: ANT_PATH_MATCHER
     # session 失效时间(分钟)
     session:
       timeout: 86400
       store-type: none
     # redis 配置
    #  redis:
    #    port: 6379
    #    host: 公网IP
    #    database: 0
    #server:
    #  port: 7529
    #  servlet:
    #    context-path: /api
    server:
     address: 0.0.0.0
     port: 7529
     servlet:
       context-path: /api
       # cookie 30 天过期
       session:
         cookie:
           max-age: 2592000
           domain: 公网IP
    
    mybatis-plus:
     configuration:
       map-underscore-to-camel-case: false
       log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     global-config:
       db-config:
         logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
         logic-delete-value: 1 # 逻辑已删除值(默认为 1)
         logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    pidanapi:
     client:
       access-key: pidanxia
       secret-key: abcdefgh
    dubbo:
     application:
       name: dubbo-springboot-demo-provider
     protocol:
       name: dubbo
       port: -1
     registry:
       id: nacos-registry
       address: nacos://公网IP:8848
     config-center:
       timeout: 40000
    

    gateway项目的application.yml:

    server:
     port: 8090
    spring:
     cloud:
       gateway:
         default-filters:
           - AddResponseHeader=source, pidanxia
         routes:
           - id: api_route
             uri: http://公网IP:8123
             predicates:
             - Path=/api/**
    
    logging:
     level:
       org:
         springframework:
           cloud:
             gateway: trace
    
    dubbo:
     application:
       name: dubbo-springboot-demo-consumer
       qos-enable: true
       qos-accept-foreign-ip: false
     protocol:
       name: dubbo
       port: -1
     registry:
       id: nacos-registry
       address: nacos://公网IP:8848
     config-center:
       timeout: 40000
    
  2. 云服务器Nacos启动失败

    问题一:服务器的内存太小了(2c2g)

    其实就是我服务器的内存太小了(2c2g),而且还运行着一个博客。即使侥幸Nacos启动成功了,后面启动3个项目的时候也会启动失败。本以为配置好虚拟交换空间后还可以勉强跑起来,没想到连启动Nacos都这么吃力。然后我购买了腾讯云的2c4g的服务器,花了200多大洋心疼了一个星期!!!

    问题二:端口问题

    购买了新服务器之后,我发现Nacos还是没有正常启动。搜集资料后发现还需开通两个端口:9848、9849

    云服务器除了要宝塔面板和云服务器都要开放8848端口,还需开通两个端口:9848、9849

    具体内容可以查看Nacos的官方文档

    image-20230926073109222

    偏移量:

    当nacos客户端升级为2.1版本后,新增了gRPC的通信方式,新增了两个偏移量端口(9848,9849)在原端口(8848)基础上面偏移量1000和1001。
    原端口:8848 ——> 服务使用
    偏移量端口1:9848 ——> 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
    便宜连端口2:9849 ——> 服务端gRPC请求服务端端口,用于服务间同步等
    

    客户端具有相同的偏移逻辑。用户按照1.X的使用方式配置主端口(默认8848),并通过相同的offset计算出对应的gRPC端口(默认9848)。

    因此,如果客户端和服务器之间存在端口转发或防火墙,则需要对端口转发配置和防火墙配置进行相应调整。

  3. 项目部署成功了,但是调用接口的时候返回的是403

    可能一:这个坑我在第7期的时候也踩过,是入参的url跟数据库的url不一致导致的。

    因为我们上线了云服务器,所以数据库中的localhost要改成公网IP。而我在改动的时候,端口号忘记加上了

    入参url:http://公网IP:8123/api/name/user/

    数据库url:http://公网IP/api/name/user/

    两者url对不上,所以gateway没有办法转到正确的接口地址。

    把数据库中的地址修改正确,就可以正常访问了!

    image-20230926071135964


可能二:在gateway项目中设置了白名单

我发现在本地部署没有问题,在云服务上部署就报403,而且数据库中url地址也没错

我通过java -jar启动,查看日志发现了是gateway中的白名单问题

在gateway的CustomGlobalFilter文件中,有一个变量IP_WHITE_LIST

这是下面filter方法访问控制 – 黑白名单的时候用到的ip列表

image-20231008153935711

我发现在云服务器中部署的时候,入参sourceAddress并不是127.0.0.1,而是这个:

image-20231008154108567

所以我猜想是不是白名单的问题。

于是我注释掉访问控制 - 黑白名单这段代码。果然程序能正常访问。返回正确的参数

image-20231008154251040

  1. 域名的问题

    而使用域名访问的话,如果使用的是域名访问,而配置文件中写的是公网IP的话,那么就会出现一些问题。比如前端记不住登录态之类的。

    个人建议,如果是要用域名访问的,把本文所有配置文件中用到的公网IP全部换成域名

    记得数据库中的url也要改成域名哦
    如:xxx.xxx.xxx.xxx 换成 pidanxia.ink

    如:xxx.xxx.xxx.xxx:8848 换成:pidanxia.ink:8848

API项目收官

恭喜你~API项目从开发到上线已经全部完成!正式收官!

我有很多很多话想说,想对你说,想对我自己说。想对那个站在阳光下,眼睛里有梦想但口袋里没有口粮的自己说~

但是不知道如何通过文字表达出来,这部分内容先空着,日后会补充上去!

创作不易!转载请注明作者及文章链接或作者博客链接——
- 作者:pidanxia
- 链接:https://pidanxia.ink
(链接可为:**文章链接**或者**作者博客链接**)

评论

  1. 斜阳
    1 月前
    2024-7-29 0:18:47

    赞!另外,application-prod.yml不生效,是因为启动的时候需要加上–spring.profiles.active=prod参数才生效~

    • 博主
      斜阳
      1 月前
      2024-7-30 9:13:36

      原来是这样!谢谢你呀~

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇