API项目部署上线
配置交换空间
如果你跟我一样云服务器的内存很小,但是又没钱升级。可以配置一下交换空间
我后来还是新购了2c4g的服务器。API项目比较吃内存,纯净的2c2g部署勉勉强强,如果还部署了其他项目的话可能就部署不了API项目了
在Linux中,配置交换空间(Swap Space)是为了扩展系统的虚拟内存而设置的一块磁盘空间。交换空间允许操作系统将内存中不常用的数据移动到硬盘上,以释放内存供其他需要更紧急的任务使用。
配置交换空间的目的是为了解决内存不足的问题。当系统内存不足时,操作系统会将部分内存中的数据移到交换空间中,这样可以腾出内存空间供其他程序使用。交换空间的大小通常是物理内存大小的两倍或更多,但并不是越大越好,过大的交换空间可能会影响系统性能。
在CentOS 7系统上配置4G的交换空间,您可以按照以下步骤进行操作:
- 打开终端或登录到CentOS 7系统的命令行界面。
-
确保您具有root用户权限,或者以root用户身份执行以下命令。如果您不是root用户,请使用sudo命令来执行以下命令。
-
创建一个4G大小的交换文件。可以使用以下命令创建一个名为swapfile的4G交换文件:
sudo fallocate -l 4G /swapfile
- 设置交换文件的权限,只允许root用户进行读写操作。执行以下命令:
sudo chmod 600 /swapfile
- 使用mkswap命令将交换文件格式化为交换分区。执行以下命令:
sudo mkswap /swapfile
- 启用交换文件,使用swapon命令。执行以下命令:
sudo swapon /swapfile
- 确认交换空间已成功启用。执行以下命令:
sudo swapon --show
如果成功配置,将显示交换分区的相关信息。
-
更新系统的
/etc/fstab
文件,以便在启动时自动启用交换分区:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
前端部署
修改url
修改src/requestConfig.ts
文件的baseURL
地址为真实的地址
baseURL: 'http://后端公网ip地址:7529',
静态化设置
在config/config.ts
文件(最后一行)中添加
exportStatic: {},
打包前端项目
运行build把前端项目打包
build命令运行完之后,根目录下会多了一个dist
文件夹
在前端开发中,我们通常会使用构建工具(如Webpack、Parcel等)将源代码转换为可在浏览器中运行的静态文件。这个过程包括了代码的打包、压缩、转译等操作,最终生成的静态文件就是放置在
dist
文件夹中。
打包好后,可以通过serve来本地运行一下这个项目
如果没有安装的,需要安装serve
serve
可以启动一个本地服务器,用于提供前端应用程序的静态文件。它可以监听指定的端口,并将静态文件提供给浏览器进行访问。这样可以在本地进行开发,并实时查看应用程序的效果。
以管理员身份运行cmd,输入npm i -g serve
,回车。等待安装完成
在VS中,右键dist文件夹 –>复制路径
。
然后在终端中,进入这个文件夹里。比如我刚刚复制的路径是D:\api-platform\yuapi-frontend-master\dist
那么就在终端中输入命令cd D:\api-platform\yuapi-frontend-master\dist
然后输入serve
,就可以在本地运行这个项目了。
serve相当于在本地启动了一个web服务器,类似于nginx。可以在本地把网页文件(dist文件夹)放到服务器上启动起来,让我们可以访问
我们访问NetWork的链接:http://xxx.xxx.xxx.xxx:3000
。可以看到能够成功访问前端服务。
宝塔创建前端站点
- 添加一个PHP站点
-
只填域名,其他默认就行。填好域名项后点击提交
没有域名的可以先填ip
-
删除根目录下的内容
宝塔面板左侧栏找到
文件
,然后进入刚刚创建的文件夹(刚才新建站点的根目录)把这几个原始生成的内容全部删掉
点击删除后,
.user.ini
文件还是在,我就保留了也就是说,我只删除了除
.user.ini
文件外的其他3个文件 -
把
dist文件夹
里的内容拖到根目录下 -
测试访问域名
访问前端域名,可以成功访问到前端项目
-
配置nginx
一定要配置,否着前端不能正常访问到后端
宝塔面板左侧栏点击
网站
,点击刚刚新建的站点,点击配置文件
在配置文件中加入下面配置后,点击
保存
#访问api后端相关配置 location / { # 用于配合 browserHistory使用 try_files $uri $uri/index.html /index.html; } location /api { rewrite ^/api/(.*) /$1 break; # 后台服务地址 proxy_pass http://后端ip地址/api; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; }
至此,前端项目上线完毕~
后端部署
开放端口
首先宝塔面板和云服务器都要开放下面几个端口:
宝塔面板、云服务器都要开放
8848(Nacos)、9848(Nacos1)、9849(Nacos2)、3306(MySQL)、7529(backend)、8090(gateway)、8123(interface)
安装Java环境
在宝塔面板中,网站 --> Java项目 --> 安装Tomcat
因为我的服务器还没有Java环境,所以要安装Tomcat。
如果已经有Java环境的话就不用重复安装了
安装Tomcat9
。等待安装完成
因为springboot2.7内置的是tomcat9
移植数据库
- 在宝塔面板中新建一个数据库(自己用Navicat新建也行)
-
如果想要在Navicat中访问到这个数据库,就要修改一下数据库的权限
在对应的数据库中,点击
权限
,把访问权限更改为所有人
。 -
然后把这4个表复制到新的数据库
下载安装Nacos
我在宝塔软件商店中没有找到Nacos,所以手动下载了安装包放在服务器里
注意服务器安装的Nacos版本要与之前写代码时候启动的Nacos版本保持一致
我上传到了(/user/local)路径里
- 进入该路径
cd /usr/local
- 输入解压命令
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”文件解压缩,并还原其中的文件和目录结构。解压后的文件将会被放置在当前目录下
解压完成后可以把压缩包删除掉(小小的服务器真是寸土寸金)
-
减小nacos启动时占用的内存大小
因为我的服务器内存很小,所以要进行这一步。如果你内存比较大的话也可以直接启动Nacos
解压完成后,在当前目录下会多出来一个
Nacos
文件夹。输入下面命令进入bin目录
cd /usr/local/nacos/bin
里面有一个
startup.sh
文件,把
startup.sh
文件里的:JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn128m"
修改为:
JAVA_OPT="${JAVA_OPT} -Xms64m -Xmx64m -Xmn16m"
在这个命令中,
-Xms64m
表示设置Java堆的初始大小为64MB,-Xmx64m
表示设置Java堆的最大大小为64MB,-Xmn16m
表示设置新生代的大小为16MB。然后保存退出。
因为我是用的FinalShell远程连接的服务器,所以可以直接双击打开文件修改
也可以用
xvim startup.sh
命令修改 - 启动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”的进程,并将其强制终止。
- 解决报错
我在启动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的路径可以在宝塔面板
网站 --> Java项目 --> 添加Java项目
里看到jdk的路径位置比如我这里的路径就是:
/usr/local/btjdk/jdk8
浏览器访问:http://服务器外网地址:8848/nacos/
。查看Nacos是否启动成功
能访问到就是启动成功了~
部署Bakcend项目
记得要先开启Nacos
- 修改cilent-sdk项目
修改网关IP为服务器IP
修改完成后,重新执行maven的
install
函数重新打包 -
backend项目中,刷新一下maven。复制一个
application.yml
文件改名为application-prod.yml
application.yml
是主要的配置文件,用于开发和测试环境的配置,而application-prod.yml
是生产环境的配置文件,用于生产环境特定的配置。application.yml
是默认配置,而上线时,application-prod.yml
中的配置会覆盖掉application.yml
的配置。有什么需要修改的配置,可以不用修改
application.yml
文件,而是直接在application-prod.yml
文件中添加需要修改的配置 - 修改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
-
执行maven的
package
函数命令打包生成的jar包在backend项目的
\target
文件夹里 -
宝塔面板上传jar包到服务器
在宝塔面板的
文件
项中,在创建3个对应的文件夹,把刚刚的jar包上传到backend文件夹中 -
添加Java项目
网站 --> Java项目 --> 添加Java项目
主要是两项
项目jar路径:选择刚刚上传的jar包
项目端口:要填真实的backend项目端口
其他可以报保持默认。点击
提交
部署gateway项目
-
配置
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
- 修改
CustomGlobalFilter
文件的模拟接口地址为服务器IPprivate static final String INTERFACE_HOST = "http://公网IP:8123";
-
添加Java项目
修改完成后,执行maven的
package
函数命令打包把jar包上传到gateway文件夹中
添加Java项目,选好jar包填好真实的端口号。点击提交
部署Interface项目
-
自己看看配置文件有没有需要修改的,我的没有,就直接打包了
-
添加Java项目
执行maven的
package
函数命令打包把jar包上传到interface文件夹中
添加Java项目,选好jar包填好真实的端口号。点击提交
测试项目
注意项目的启动顺序是:先启动Nacos –> 启动backend–> 启动gateway(一定要backend启动成功后)–> 启动interface
- 登录Nacos管理页面看看服务有没有注册上
下面的页面已经成功注册上了
-
打开我们的网站,测试是否能成功调用
这里看到接口可以成功调用!而且请求地址也对的上。
踩坑合集
-
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
- 云服务器Nacos启动失败
问题一:服务器的内存太小了(2c2g)
其实就是我服务器的内存太小了(2c2g),而且还运行着一个博客。即使侥幸Nacos启动成功了,后面启动3个项目的时候也会启动失败。本以为配置好虚拟交换空间后还可以勉强跑起来,没想到连启动Nacos都这么吃力。然后我购买了腾讯云的2c4g的服务器,花了200多大洋心疼了一个星期!!!
问题二:端口问题
购买了新服务器之后,我发现Nacos还是没有正常启动。搜集资料后发现还需开通两个端口:9848、9849
云服务器除了要宝塔面板和云服务器都要开放8848端口,还需开通两个端口:9848、9849
具体内容可以查看Nacos的官方文档
偏移量:
当nacos客户端升级为2.1版本后,新增了gRPC的通信方式,新增了两个偏移量端口(9848,9849)在原端口(8848)基础上面偏移量1000和1001。 原端口:8848 ——> 服务使用 偏移量端口1:9848 ——> 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 便宜连端口2:9849 ——> 服务端gRPC请求服务端端口,用于服务间同步等
客户端具有相同的偏移逻辑。用户按照1.X的使用方式配置主端口(默认8848),并通过相同的offset计算出对应的gRPC端口(默认9848)。
因此,如果客户端和服务器之间存在端口转发或防火墙,则需要对端口转发配置和防火墙配置进行相应调整。
- 项目部署成功了,但是调用接口的时候返回的是403
可能一:这个坑我在第7期的时候也踩过,是入参的url跟数据库的url不一致导致的。
因为我们上线了云服务器,所以数据库中的
localhost
要改成公网IP
。而我在改动的时候,端口号忘记加上了入参url:http://公网IP:8123/api/name/user/
数据库url:http://公网IP/api/name/user/
两者url对不上,所以gateway没有办法转到正确的接口地址。
把数据库中的地址修改正确,就可以正常访问了!
可能二:在gateway项目中设置了白名单
我发现在本地部署没有问题,在云服务上部署就报403,而且数据库中url地址也没错
我通过java -jar启动,查看日志发现了是gateway中的白名单问题
在gateway的CustomGlobalFilter
文件中,有一个变量IP_WHITE_LIST
这是下面filter方法
访问控制 – 黑白名单的时候用到的ip列表
我发现在云服务器中部署的时候,入参sourceAddress
并不是127.0.0.1
,而是这个:
所以我猜想是不是白名单的问题。
于是我注释掉访问控制 - 黑白名单
这段代码。果然程序能正常访问。返回正确的参数
- 域名的问题
而使用域名访问的话,如果使用的是域名访问,而配置文件中写的是公网IP的话,那么就会出现一些问题。比如前端记不住登录态之类的。
个人建议,如果是要用域名访问的,把本文所有配置文件中用到的
公网IP
全部换成域名
。记得数据库中的url也要改成域名哦
如:xxx.xxx.xxx.xxx 换成 pidanxia.ink如:xxx.xxx.xxx.xxx:8848 换成:pidanxia.ink:8848
API项目收官
恭喜你~API项目从开发到上线已经全部完成!正式收官!
我有很多很多话想说,想对你说,想对我自己说。想对那个站在阳光下,眼睛里有梦想但口袋里没有口粮的自己说~
但是不知道如何通过文字表达出来,这部分内容先空着,日后会补充上去!
赞!另外,application-prod.yml不生效,是因为启动的时候需要加上–spring.profiles.active=prod参数才生效~
原来是这样!谢谢你呀~
您好 , 前端部署的宝塔创建前端站点的6中的配置文件显示不正确,出现了 ReferenceError: katex is not defined 等信息
这个报错信息看起来不像是配置nginx的问题,ReferenceError引用错误,像是前端没有引入KaTeX库