Java从入门到工作5 - 服务器部署

我的个人网站技术结构如下, 部署效果演示地址为: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及代理

  1. 将用户端和 Admin 端的 dist 文件夹上传到服务器,例如:

    • 用户端:/var/www/user

    • Admin 端:/var/www/admin

  2. 编辑 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、访问前端:

用户端:http://39.107.193.226

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.jstest.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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun_qqq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值