我的个人网站技术结构如下, 部署效果演示地址为:Coding Life
- 前端:Vue2全家桶、ElementUI
- 后端:SpringBoot
- 数据库:MySQL
- 服务器:Linux
下面整理的是网站部署过程中需要的各个步骤及常见问题。
一:数据库部署
1、MySQL准备
首先下载安装MySQL,可参考:Linux Centos内网环境中安装mysql5.7详细安装过程-优快云博客
修改初始密码,开放host,并确保开放3306端口。 .
2、数据同步
一般新项目上线时需要将【测试/本地环境的数据库】同步到【服务器上的数据库】。
最好保证两个环境的数据库【版本】一致,【编码方式】、【排序方式】也一致。一致好处理,不一致也有办法。
2.1、同步数据的方法
在Navicat上连接上【本地】和【服务器上】的数据库,在本地数据库【右键】转储为SQL文件,然后在服务器数据库【右键】运行SQL文件。直接就表结构带数据全部同步过来了。
2.2、解决同步失败问题
同步失败一般都是两个数据库的【编码方式】和【排序方式】不同导致的,可以编辑本地数据库导出来的SQL文件。通过修改SQL文件,将两个数据库的编码方式统一了。
比如我本地服务器是utf8mb3字符集,utf8mb3_general_ci排序规则。服务器的数据库是utf8字符集,utf8_general_ci排序规则。可以将SQL文件中,所有utf8mb3替换为utf8,utf8mb3_general_ci替换为tf8_general_ci,再次导入即可。
二:服务端部署(Java)
1、JDK安装
CentOS/RedHat安装 OpenJDK 8:
sudo yum install java-1.8.0-openjdk-devel
验证安装:
java -version
2、打包Java项目
mvn clean package
如上为打包命令,如果打包过程中异常,可以将pom文件、generatorConfig、application文件全部内容发给DeepSeek让它教你错在哪,怎么改。
3、服务器上配置
假如你的项目叫:CodingLife,将打包文件重命名为CodingLife.jar
3.1、上传 JAR 文件到 /opt/CodingLife/CodingLife.jar
。
确保jar包可读,有正确的权限:
chmod 755 /opt/CodingLife/CodingLife.jar
3.2、确保日志目录 /var/log/CodingLife/
存在,并且有正确的权限:
sudo mkdir -p /var/log/CodingLife sudo chown root:root /var/log/CodingLife sudo chmod 755 /var/log/CodingLife
3.3、将服务文件放到正确的位置
创建服务文件 /etc/systemd/system/CodingLife.service
,确保文件内容正确无误。
[Unit]
Description=CodingLife Java Application
After=syslog.target network.target
[Service]
User=root
ExecStart=/usr/bin/java -jar /opt/CodingLife/CodingLife.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
StandardOutput=file:/var/log/CodingLife/CodingLife.log
StandardError=file:/var/log/CodingLife/CodingLife-error.log
[Install]
WantedBy=multi-user.target
3.4、 重新加载 systemd 配置
在修改或创建新的服务文件后,需要重新加载 systemd
配置:
sudo systemctl daemon-reload
3.5、 启动服务
使用以下命令启动服务:
sudo systemctl start CodingLife
3.6、 检查服务状态
sudo systemctl status CodingLife
如果服务启动失败,可以通过以下命令查看详细的错误信息:
journalctl -u CodingLife
3.7、 设置开机自启
如果希望服务在服务器重启后自动启动,可以启用开机自启:
sudo systemctl enable CodingLife
3.8、 查看日志
-
标准输出日志会写入
/var/log/CodingLife/CodingLife.log
。 -
错误日志会写入
/var/log/CodingLife/CodingLife-error.log
。
3.9、 停止或重启服务
如果需要停止服务,可以使用以下命令:
sudo systemctl stop CodingLife
如果需要重启服务,可以使用以下命令:
sudo systemctl restart CodingLife
3.10、开放端口
云服务器别忘了开8080端口的安全组
三:前端部署
1、准备Nginx环境
1、安装Nginx
在CentOS/RHEL上安装 Nginx:
sudo yum install nginx
2、配置 Nginx及代理
-
将用户端和 Admin 端的
dist
文件夹上传到服务器,例如:-
用户端:
/var/www/user
-
Admin 端:
/var/www/admin
-
-
编辑 Nginx 配置文件(通常位于
/etc/nginx/nginx.conf
或/etc/nginx/sites-available/default
):server { listen 80; server_name 39.107.193.226; # 用户端 location / { root /var/www/user; index index.html; try_files $uri $uri/ /index.html; } # Admin 端 location /admin { alias /var/www/admin; index index.html; try_files $uri $uri/ /admin/index.html; } # 代理服务 location /api { proxy_pass http://localhost:8080/; # 千万别忘了最后的/ proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 跨域配置 add_header 'Access-Control-Allow-Origin' 'http://39.107.193.226'; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type'; add_header 'Access-Control-Allow-Credentials' 'true'; if ($request_method = 'OPTIONS') { return 204; } } }
3、重启 Nginx:
sudo systemctl restart nginx
4、springboot配置跨域
在config文件夹下新建CorsConfig
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://39.107.193.226")
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
.allowedHeaders("*") // 有这句上面的allowedOrigins必须精确到某个ip
.allowCredentials(true) // 允许携带凭证(如 Cookie)
.maxAge(3600); // 预检请求的缓存时间
}
}
5、访问前端:
Admin 端:http://39.107.193.226/admin
四:上传图片存储
1、预期的文件夹为空
当图片上传成功,代码无报错信息。但预期的文件夹中总是空白 ,从如下方向定位问题
- 1、考虑了目标文件夹的权限
- 2、打印存入图片的绝对路径
2、图片路径配置
因本地与生产环境需要配置不同的图片路径,具体可移步第6章。
五:常用工具
因为服务器操作系统很多是Linux的,如果对Linux命令不熟悉导致操作服务器效率很低,不过有一些工具能缓解这个问题。分享我用的工具给大家
1、WinScp
支持文件操作,如复制、移动、更名文件或文件夹等.让我们跟windows一样操作文件
2、FTPS 编辑器传输工具
前端代码打包后,通过VsCode的FTPS插件一键上传服务器。
JAVA代码写完,IJ也有类似的工具如下
六:测试/生产环境配置
系统上线后,就得面临测试和生产两套环境的隔离与配置。
1、Java代码
后端代码两套配置,主要涉及数据库连接的相关信息,图片的保存位置等。
SpringBoot项目可以创建3个配置文件,将两个环境的配置参数分开存储。文件名称和内容如下
- application.properties
- application-dev.properties
- application-prod.properties
# application-dev.properties文件内容
# MySQL Database
spring.datasource.url=jdbc:mysql://localhost:3306/sunqblog?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=1qaz!QAZ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
# 图片保存的路径
file.upload-dir=./uploads
如上的三个文件,application.properties是主配置文件。主配置文件有个激活的概念,激活dev或者prod后SpringBoot就会加载指定的文件。通过在主配置文件中,active属性来激活。
spring.profiles.active=prod
如上配置后,SpringBoot默认就会加载 application-prod.properties,打包时自动完成生产环境的配置。
可以在IJ的Run Configurations的Active profiles中写入dev,这样本地运行服务器时就会执行application-dev.properties,完成了本地环境的配置。
2、前端代码
前端在拼接图片地址的域名时,需要区分本地和生产环境。对于前端的配置,因为Vue Cli版本不同,代码结构不同,导致配置文件存放位置也不同。如下以Vue Cli 2.0为例
Vue的配置文件为prod.env.js与test.env.js,Vue Cli 2.0的文档结构下,这两个文件在config文件夹下。举例,prod.env.js文档内具体内容如下:
module.exports = {
NODE_ENV: '"production"',
VUE_APP_API_BASE_URL: '"http://39.107.193.226"'
}
通过如上配置后,npm run dev 和npm run build就是加载不同的配置了。在Vue组件中就可以动态的使用VUE_APP_API_BASE_URL了
That.articleCover = process.env.VUE_APP_API_BASE_URL + response.data.data;