最近做了一个前后端拆散的商城我的项目来相熟开发的整个流程,最初心愿能有个正式的部署流程,于是试着把我的项目放在云服务器上,做了一下发现遇到了不少问题,借此记录一下整个部署的过程。
应用的技术栈如题目所说大体上是Vue+Spring boot,但还是要提一下具体的版本,因为在解决问题的过程中发现因为开发环境的不同会产生诸多影响,查找问题时如果没有版本作为前提常常会呈现很多不必要的误会,甚至是误操作,十分浪费时间。具体版本状况如下:
- Vue 2.6.11
- Vue-cli 4.5.0
- Spring boot 2.1.1
- MySQL 8.0.13 (尤其留神)
- Nginx
1 上传工具
部署的第一步要把文件上传至云服务器,并且后续还要在云服务器上进行操作,办法很多,我这里抉择了Xshell和Xftp这两个工具,均出自NETSARANG这家公司,须要留神的是在国内的官网上暗藏了收费家庭版的申请地址,能够通过间接拜访 Xshell、Xftp收费许可 进行下载,须要填写姓名和邮箱。
1.1 Xftp
首先在Xftp中新建连贯,填写主机地址和用户名明码,连贯胜利就能够看到左侧选项卡为本地的文件目录,右侧为云服务器的文件目录,只有从左侧或右侧将文件拖动到另一边就能够实现相应文件的上传和下载,下方传输选项卡会显示具体进度,图形化的界面相当直观,不做过多的阐明了。
对于Linux的目录标准我没有查到太多须要的信息,所以我这里是在根目录新建了一个名为 app 的文件夹来寄存网站利用,对于网站的打包咱们在下一节阐明,这里咱们把握如何上传文件就能够。
1.2 Xshell
Xshell的连贯建设办法与Xftp差不多,填写主机地址,连贯后再输出用户名明码,连贯后就能够在云服务器上进行操作了。
通过这两个工具与云服务器建立联系后咱们就能够开始着眼于网站利用本身的问题了。
2 前端
相对来说前端的部署没有遇到太多问题,所以咱们先从前端开始
2.1 Vue
因为我应用了Vue-cli,所以我的项目实现后通过执行命令 npm run build
程序就会主动打包到我的项目目录下的 dist 文件夹,打包后的目录构造如下:
之后通过Xftp将这个文件夹上传至云服务器上,之前我曾经新建了一个文件夹来寄存,因为咱们还可能有其余我的项目,并且后盾也须要一个文件夹,所以建设具体文件夹构造如下:
新建文件夹能够应用Xftp的图形界面疾速建设,也能够在Xshell中应用指令,看集体的爱好和习惯,如果须要常常应用Linux零碎,倡议应用指令多加练习。
在Windows端进行开发的时候,在控制台应用 npm run serve
指令就能够疾速启动一个本地网站,然而这样的网站只能在内网被拜访,必定是达不到咱们最后在外网拜访的目标,所以这里要借助反向代理服务器,我抉择的是被宽泛应用的Nginx。
2.2 Nginx
- 选定装置目录
cd /usr/local/src
- 在服务器上安装Nginx之前先装置若干依赖:
yum install gccyum install pcre-develyum install zlib zlib-develyum install openssl openssl-devel
这些依赖的作用能够参考这一篇 Linux上装置Nginx依赖环境和库、Nginx装置,Nginx服务命令,我没有逐个试过短少某个依赖会有什么问题,在装置Nginx之前就曾经装置好这些依赖了。
- 下载Nginx安装包并解压
能够从官网抉择须要的版本。
wget http://nginx.org/download/nginx-1.13.7.tar.gz #下载tar -xvf nginx-1.13.7.tar.gz #解压
- 执行配置并装置
cd nginx-1.13.7 #切换目录./configure #执行配置make && make install #编译装置(默认装置在/usr/local/nginx)
- 装置实现后查看版本无误启动
/usr/local/nginx/sbin/nginx -v #查看版本cd /usr/local/nginx/sbin #cd到nginx的装置地位的sbin目录下./nginx #启动nginx
这里能够先拜访一下服务器的外网IP试试,呈现 Welcome to nginx 就阐明曾经启动胜利了。
Nginx装置实现后批改配置文件以对应咱们的网站利用,批改文件的办法也能够抉择应用Xftp或者在Linux上用指令操作
location / { root /app/osd_mall/vue_app/dist; index index.html index.htm;}location /api { proxy_pass http://localhost:28019/api/v1;}
这里映射了两个地址,第一个就是网站前端局部的主体,应该没有太多的差别,次要的问题应该集中在第二个地址上,因为我做的是一个前后端拆散的我的项目,后端接口也是蕴含在我的项目里的,那么必然存在跨域问题,开发时应用了Vue的Proxy从前端解决,代码如下:
而后在axios里配置对应的名称即 api,这样就能够解决跨域的问题,但这只是本地开发时应用的办法,在Linux服务器上通过Nginx反向代理能够更平安地解决跨域问题,所以上图中的代码就不再须要了,打包前须要正文或者删除。
axios.defaults.baseURL = process.env.NODE_ENV == 'development' ? '/api' : '/api'
配置批改实现后测试配置文件,没有问题后重启Nginx服务
./nginx -t #测试配置文件./nginx -s reload #重启Nginx
这时曾经能够通过咱们的外网IP拜访前端页面了,然而因为还没有配置后端接口,所以根本是没有数据和图片的。不言而喻,上图中的本地地址 http://localhost:28019/api/v1 就是咱们的后端接口地址,那么咱们接下来就对后端的部署进行阐明。
3 后端
绝对于前端来说,后端遇到的问题堪称是层出不穷,两头有很多挫折,好在最初都解决了,其中有几个就是结尾强调的版本问题。
3.1 Java
首先要装置Java环境,从官网下载须要的版本,而后和之前一样,通过Xftp上传:
创立目录,解压:
mkdir /usr/javatar zvxf server-jre-8u271-linux-x64.tar.tar.gz -C /usr/java
为了能在全局应用java命令,配置环境变量:
# 批改环境配置文件vi /etc/profile# 编辑配置文件,在外面增加如下三行export JAVA_HOME=/usr/java/jdk1.8.0_271export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar# 使环境变量失效source /etc/profile# 验证是否配置胜利,查看java版本java -version
3.2 Spring boot
要将Spring boot我的项目打包部署有很多抉择,详情能够看这篇文章 java我的项目部署Linux服务器几种启动形式总结经验
我这里抉择的是应用jar包部署,通过Maven打包的步骤就不阐明了。再次通过Xftp将jar文件上传至服务器,我的截图里有一个dev版本的是保留了控制台日志的版本,失常只须要一个就能够。
3.3 Screen
下面介绍的文章里有提到java我的项目会运行在前台,当咱们的Xshell窗口敞开后,我的项目其实也是会敞开的,但如果让连入的机器也放弃开机也并不合理,所以应用nohub指令将jar程序始终挂载在后盾。这里再介绍另一种办法,那就是Screen工具。
Screen是一款由GNU打算开发的用于命令行终端切换的自由软件。用户能够通过该软件同时连贯多个本地或近程的命令行会话,并在其间自在切换。GNU Screen能够看作是窗口管理器的命令行界面版本。它提供了对立的治理多个会话的界面和相应的性能。
Screen在一些风行的发行版上曾经预装置了,你能够应用上面的命令查看是否曾经在你的服务器上安装了。
screen -v
如果没有能够通过自带的包管理器简略地装置。
yum -y install screen
screen -S yourname #创立一个名为yourname的sessionscreen -ls #列出以后所有的sessionscreen -r yourname #回到yourname这个sessionscreen -d yourname #近程detach某个sessionscreen -d -r yourname #完结以后session并回到yourname这个session
应用Screen就如同切换窗口个别,这样在服务器性能容许的状况下就能够同时挂载多个利用,同时也绝对方便管理。
3.4 MySQL
1. 装置
刚开始部署的时候,我简直疏忽了MySQL,之后也没想到这是最花工夫的局部,但如果遵循正确的步骤其实并不艰难。
大部分的工具咱们都能够通过包管理器yum来装置,上文的Screen正是如此,我本认为MySQL也是如此,不过查了一下发现最后的确如此,但自从MySQL被收买之后就存在版权问题了,所以CentOS7曾经不再反对MySQL,而是在外部集成了MariaDB,两者颇有渊源,后果就是文件会有抵触,所以还要先卸载MariaDB才行。
# 列出所有被装置的rpm packagerpm -qa | grep mariadb# 卸载(留神“版本号”依据以后零碎显示的版本信息的为准)rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64# 如果提醒依赖检测失败能够强制卸载rpm -e --nodeps mariadb-libs-5.5.37-1.el7_0.x86_64# 装置依赖yum install vim libaio net-tools
之后咱们要决定是通过repo源间接从服务器下载安装还是本人去官网下载一个再上传到服务器上,最后我是按一些教程的步骤间接从repo源下载,但因为抉择的版本不对,最初程序无奈正确建设连贯,重复尝试之后抉择从社区版官网下载须要的版本。
进入网站默认是最新版本,要找之前的版本点击Archives,在新的页面抉择对应的版本。而后是抉择操作系统,CentOS零碎就是Red Hat的社区发行版,内核是雷同的,或者用通用版本(Generic)也能够。
下载bundle包,解压出其中如图所示的五个文件上传至服务器,顺次装置mysql-community-common、mysql-community-libs、mysql-community-client、mysql-community-server、mysql-community-release。
# 顺次类推rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpm# 如果呈现“依赖检测失败”问题再前面增加 --force --nodeps强制装置rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpm --force --nodeps
当初常见的MySQL版本个别是5.7和8.0之后的若干小版本,依据应用版本的不同,后续的配置有很大的不同,我应用的版本是8.0.13,接下来也是以8.0版本为例。
2. 重置明码
在这一步遇到了诸如权限问题、版本不对、字段不同等状况,因为部署时齐全没想到有如此多的问题,没有留下截图,这里说一下整体的思路:首先要登录MySQL,装置实现后可能会有一个随机明码,记录下来,用这个明码登录进数据库,如果有权限问题就先给MySQL文件夹受权,登录之后通过数据表批改默认明码,指令如下:
# 登录,-p前面没有空格,间接输出明码,5.7版本明码默认为空,8.0应用随机明码mysql -u root -p明码# 切换数据库use mysql;# 批改明码(不能用123456这种简略的明码,须要大小写和数字,如果还是想用简略的明码,看下文)update user set password=password('123456') where user='root';# 退出exit;
设置实现后就能够用新密码登录了,如果设置有问题或者没有记录随机明码还有通过批改本地文件来重置明码的形式,这里就不介绍了。
如果只是集体开发,不想用太过简单的明码怎么办?能够通过批改明码规定来解决这一问题,同样的,5.7和8.0版本也存在区别:
# 5.7set global validate_password_policy=0;set global validate_password_length=1;# 8.0set global validate_password.policy=0;set global validate_password.length=1;# 查看明码验证变量SHOW VARIABLES LIKE 'validate_password%';
明码等级表
Policy | Tests Performed |
---|---|
0 or LOW | Length |
1 or MEDIUM | Length; numeric, lowercase/uppercase, and special characters |
2 or STRONG | Length; numeric, lowercase/uppercase, and special characters; dictionary file |
3. 近程连贯
每次要查数据库都要登录Linux就会很不不便,而且界面不敌对,如果咱们想用本地的Navicat拜访近程的数据库要怎么设置呢?
首先要敞开防火墙或者凋谢数据库的3306端口(最好还是凋谢端口),
# 查看防火墙状态systemctl status firewalld# 开启防火墙服务systemctl start firewalld# 凋谢指定端口firewall-cmd --zone=public --add-port=3306/tcp --permanent# 从新载入firewall-cmd --reload
如果应用的是云服务器,还要记得在平台上凋谢指定端口:
设置完防火墙之后依然不能近程登录,因为咱们没有受权用户,先查问一下用户表:
select user,host from user;
能够看到除了remote都是localhost,remote就是我新建的专门用于近程登录的用户,host代表的是该用户能够在哪个地址下登录,“%”代表所有地址都能够。5.7之前的版本能够通过受权间接隐式创立用户,8.0之后不能够了。间接批改root用户的host也是能够的,然而这样登录时会有些小区别,具体遗记了,这里我举荐新建一个用户。
/* 创立用户,这里的明码同样也受后面设置的明码等级限度 */CREATE USER '用户名'@'%' IDENTIFIED BY '明码';/* 受权 */grant all privileges on *.* to '用户名'@'%';
执行后应用Navicat近程登录如果报错 1251 client does not support authentication,阐明MySQL8与Navicat的加密形式不同,批改加密形式:
alter user 用户名 identified with mysql_native_password by '明码';
这样就能够从本地间接拜访近程的数据库了。
4.卸载MySQL
如果你在装置时可怜呈现问题,有各种各样的问题须要重装MySQL,那么能够依据这篇文章 Linux下彻底卸载mysql详解来卸载MySQL。
5.程序建设数据库连贯
到这里就是最初一步了,我在这里呈现问题后试了各种办法都没有胜利建设连贯,用户名明码都没有错的状况下可能须要查看以下几个方面:
- 数据库版本与程序的驱动版本是否统一
- 数据库连贯串是否正确
- 账号是否有拜访权限
援用的插件版本要与服务器上安装的数据库版本统一
5.7和8.0的连贯串有不少区别,8.0须要很多额定词条,这里留下我的连贯串
jdbc:mysql://localhost:3306/onesideddice_mall?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true
6.导入数据
这一步很简略了,有各种办法,这里记录一下导入服务器上的sql文件这种形式:
create database abc; /* 创立数据库 */use abc; /* 应用已创立的数据库 */set names utf8; /* 设置编码 */source /home/abc/abc.sql /* 导入备份数据库 */
3.5 Nginx图片服务器
在前端局部咱们曾经在Nginx中配置过后端接口了,为什么这里还要再提一次呢?其实实践上到这一步之前,就曾经实现网站的部署了,如果两头各种对接没有其余问题,网站曾经能够失常运行了,然而如果你的站点中有大量的图片,则不得不思考图片要以什么形式存储,相对路径如何设置等。在部署实现后在图片展现上我遇到了很多问题,其中比较显著的就是图片的相对路径转换问题,在察看了一些网站的后,我发现他们的图片通常独自寄存在图片服务器上,这样图片的门路绝对稳固又不便设置,于是我就想到用Nginx再配置一个图片服务器进去,尽可能地利用现有的服务器资源,当然也能够抉择七牛云这种专门的图片服务器,这样图片的拜访应该会更加稳固疾速。
- 配置Nginx
在Nginx的配置里增加一个新的Server,不便与咱们的网站利用辨别,配置如下:
server { listen 8000; server_name localhost; location / { root /app/osd_mall/images; autoindex on; }}
- root则是将images映射到/home/ftpadmin/hatlth/images/
- autoindex on便是关上浏览性能。
设置批改实现后记得测试并重载Nginx。
- 凋谢端口
和之前凋谢数据库端口雷同。
- 批改文件拜访权限
chown ftpadmin /app/osd_mall/imageschmod 777 -R /app/osd_mall/images
- 批改程序
依据本人的站点批改门路,因为应用了对立的图片服务器,当初能够设置一个配置项来专门治理图片地址了,绝对于之前要不便很多,本地环境也能够应用这个线上的图片服务器。
4 完结
到这里,根本的部署就实现了,实现了从本地Windows端到Linux服务端的转换,在解决问题的过程中没有想到有如此多的问题,记录的时候脱漏了很多细节,但次要的问题应该都得以解决,心愿能帮忙遇到问题的人,也不便本人日后回顾浏览。