腾讯云官网买一台服务器
我购买的配置是
CPU-2核 内存-4GB 带宽-6Mbps 硬盘-70GB 流量包-600GBGB/月
系统镜像 OpenCloudOS 9
登录云服务器
shell复制代码ssh [账号]@[ip]
安装环境
Nginx
在OpenCloudOS 9上安装Nginx,可以通过包管理器dnf
来进行。以下是安装Nginx的步骤:
- 执行以下命令以更新软件包索引:
plain
复制代码
sudo dnf makecache
- 安装Nginx:
plain
复制代码
sudo dnf install nginx
安装完毕后就已经默认启动了,这时候浏览器输入公网ip就可以看到nginx默认页面,记得去控制台的防火墙里把80端口打开!!
- (可选)启动Nginx服务:
shell复制代码sudo systemctl start nginx
- (可选)设置Nginx开机自启:
shell复制代码sudo systemctl enable nginx
- (可选)检查Nginx服务状态:
shell复制代码sudo systemctl status nginx
NVM
这是node的管理工具,后面方便管理node版本
下载软件
shell复制代码wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz mkdir ~/.nvm tar zxvf v0.39.1.tar.gz -C ~/.nvm/
这个命令可能有实效性目前2024年11月1日还可用,请大家灵活安装
配置环境变量
- 编辑配置
bash复制代码vim ~/.bashrc
- 追加写入以下文本
bash
复制代码
export NVM_DIR="$HOME/.nvm/nvm-0.39.1"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
- 使用命令,使环境变量生效
plain
复制代码
source ~/.bashrc
安装Node21
nvm快速安装
bash复制代码nvm install 21
查看安装版本
shell复制代码node -v npm -v
设置镜像
npm设置淘宝镜像
bash
复制代码
npm config set registry https://registry.npmmirror.com
查看是否设置成功
bash复制代码npm config get registry
安装PM2
这个是用来后台运行Nuxt3的
命令行输入以下命令安装
bash复制代码npm i pm2 -g
安装OpenJDK21
安装后端SpringBoot运行环境
命令行输入以下命令安装,注意要安装JDK,不要只安装JRE运行环境
shell复制代码dnf install java-21-openjdk-devel
Maven 需要 JDK 来编译 Java 代码,因为 JDK 包含了编译器(javac)
安装Maven
下载
wget下载(可选)
bash复制代码wget -P /root/ https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
curl下载(可选)
bash复制代码curl -o /root/apache-maven-3.6.3-bin.tar.gz https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
安装
指定解压到哪个目录
bash复制代码tar -xzvf apache-maven-3.6.3-bin.tar.gz -C /root
vim /etc/profile
bash
复制代码
export MAVEN_HOME=/root/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
重新加载
bash
复制代码
source /etc/profile
成功显示
bash
复制代码
mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /root/apache-maven-3.6.3
Java version: 1.8.0_422, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.422.b05-2.oc8.x86_64/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "5.4.119-20.0009.32", arch: "amd64", family: "unix"
修改镜像配置
vim /root/apache-maven-3.6.3/conf/settings.xml
xml
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
安装MySQL数据库
安装流程
命令行输入以下命令安装
bash复制代码dnf install -y mysql-server
当前该命令安装版本为8.0.36
- 启动mysql
bash复制代码service mysqld start
- 通过root用户登录mysql,当前版本默认无密码
bash复制代码mysql -uroot -p
- 创建一个可以远程访问的用户
bash
复制代码
create user 'username'@'%' identified by 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;
create user
- 创建一个用户
identified by
- 设置密码
'username'@'%'
-[用户名]@[能够访问的ip],'%'代表任意ip都可访问
GRANT ALL PRIVILEGES ON *.*
-赋予对应用户的所有数据库权限
ALTER USER
-修改用户
IDENTIFIED WITH mysql_native_password
- 修改认证模式,这种模式常用第三方数据库连接工具才能远程连接
flush privileges;
-刷新
- (可选)删除无密码的本地用户
bash
复制代码
Drop user 'root'@'localhost';
基本查看命令
查看当前mysql有哪些用户
sql
复制代码
use mysql;
select User,authentication_string,Host from user;
配置文件路径
shell复制代码datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysql/mysqld.log pid-file=/run/mysqld/mysqld.pid
安装git
命令行输入以下命令安装
bash复制代码dnf install -y git
bash复制代码[root@VM-4-7-opencloudos ~]# git -v git version 2.43.5
生成远端ssh密钥
- 通过命令
ssh-keygen
生成 SSH Key:
bash
复制代码
ssh-keygen -t ed25519 -C "Git SSH Key"
-t
key 类型-C
注释
输出,如:
bash
复制代码
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/git/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/git/.ssh/id_ed25519
Your public key has been saved in /home/git/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:ohDd0OK5WG2dx4gST/j35HjvlJlGHvihyY+Msl6IC8I Gitee SSH Key
The key's randomart image is:
+--[ED25519 256]--+
| .o |
| .+oo |
| ...O.o + |
| .= * = +. |
| .o +..S*. + |
|. ...o o..+* * |
|.E. o . ..+.O |
| . . ... o =. |
| ..oo. o.o |
+----[SHA256]-----+
- 中间通过三次回车键确定
- 查看生成的 SSH 公钥和私钥:
bash
复制代码
ls ~/.ssh/
输出:
bash复制代码id_ed25519 id_ed25519.pub
- 私钥文件
id_ed25519
- 公钥文件
id_ed25519.pub
- 读取公钥文件
~/.ssh/id_ed25519.pub
bash
复制代码
cat ~/.ssh/id_ed25519.pub
输出,如:
bash复制代码ssh-ed25519 AAAA***5B Git SSH Key
复制终端输出的公钥粘贴到远端的git仓库
部署
Nginx配置
证书安装
从腾讯云申请免费证书,在弹出的 “证书下载” 窗口中,服务器类型选择 Nginx,并下载到服务器中
文件夹名称:
blog.hongsw.cn_nginx
文件夹内容:
blog.hongsw.cn_bundle.crt
证书文件
blog.hongsw.cn_bundle.pem
证书文件
blog.hongsw.cn.key
私钥文件
blog.hongsw.cn.csr
CSR 文件
将 blog.hongsw.cn_bundle.crt
、blog.hongsw.cn.key
文件复制到服务器/etc/nginx/
目录下
配置文件路径
bash复制代码vim /etc/nginx/nginx.conf
修改成以下内容
nginx
复制代码
# 设置 Nginx 进程运行用户
user nginx;
# 根据系统 CPU 核数自动设置 worker 进程数量
worker_processes auto;
# 指定错误日志文件位置
error_log /var/log/nginx/error.log;
# 设置 Nginx 进程的 PID 文件位置
pid /run/nginx.pid;
# 引入模块配置文件
include /usr/share/nginx/modules/*.conf;
events {
# 设置每个 worker 进程的最大连接数
worker_connections 1024;
}
http {
# 配置访问日志格式,包含客户端 IP、时间、请求方法、状态码等信息
log_format main '[$time_iso8601] "$request" $status '
'"$scheme://$upstream_addr$request_uri"';
# 设置访问日志存储位置和格式
access_log /var/log/nginx/access.log main;
# 启用 sendfile,用于提高文件传输效率
sendfile on;
# 优化 TCP 数据传输,将数据包合并后发送,适用于较大文件传输
tcp_nopush on;
# 禁用 Nagle 算法,用于低延迟连接
tcp_nodelay on;
# 设置长连接的超时时间(秒)
keepalive_timeout 65;
# 设置 MIME 类型的哈希表大小,提高处理速度
types_hash_max_size 2048;
# 引入 MIME 类型配置文件,用于定义文件扩展名和内容类型的映射
include /etc/nginx/mime.types;
# 设置默认内容类型
default_type application/octet-stream;
# 隐藏 Nginx 版本信息,增强安全性
server_tokens off;
# 引入其他 server 块配置文件
include /etc/nginx/conf.d/*.conf;
server {
# 配置监听端口(80)和默认 server
listen 80;
#请填写绑定证书的域名
server_name blog.hongsw.cn;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name blog.hongsw.cn;
#请填写证书文件的相对路径或绝对路径
ssl_certificate blog.hongsw.cn_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key blog.hongsw.cn.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 根路径配置,将所有请求代理到本地的 3000 端口服务
location / {
# 设置反向代理的目标地址
proxy_pass http://localhost:3000;
# 设置代理头部信息,保持请求源服务器名称
proxy_set_header Host $host;
# 保持客户端真实 IP 地址
proxy_set_header X-Real-IP $remote_addr;
# 记录代理链中的客户端 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 保持原请求协议
proxy_set_header X-Forwarded-Proto $scheme;
}
# 配置 /api 路径代理到本地后端服务
location /api/ {
proxy_pass http://localhost:8000/;
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;
}
location /images/ {
# 本地目录路径
alias /var/web/images/;
# 开启自动索引(可选)
autoindex off;
# 设置过期时间
expires 30d;
# 禁用访问日志(可选,对大量小图片请求有帮助)
access_log off;
}
}
}
前端Nuxt3
拉取代码
使用git clone
命令拉取github代码到本地
构建代码
通过命令构建项目
nginx
复制代码
cd /root/nuxt3-blog #进入项目目录
npm install #安装node依赖
npm run build # 构建项目
在目录下查看是否有.output的目录,验证是否构建成功
bash
复制代码
ls -a /root/nuxt3-blog
运行程序
编写运行脚本
vim /root/ecosystem.config.cjs
javascript
复制代码
module.exports = {
apps: [
{
name: 'NuxtAppName',
port: '3000',
exec_mode: 'cluster',
instances: '1',
script: './.output/server/index.mjs'
}
]
}
启动运行
bash复制代码pm2 start /root/ecosystem.config.cjs
至此前端代码部署完毕
后端SpringBoot
拉取代码
使用git clone [url]
从远端仓库来取代码到服务器上
构建项目
使用maven构建项目
bash
复制代码
cd /root/nuxt3-blog-server
mvn clean package -Dmaven.test.skip=true
FQA:
plain
复制代码
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
这个错误表明 Maven 无法找到编译器来编译你的项目代码。这通常是因为你的环境中安装的是 Java 运行环境(JRE),而不是 Java 开发工具包(JDK)。Maven 需要 JDK 来编译 Java 代码,因为 JDK 包含了编译器(javac)。
运行程序
java
复制代码
java -jar /root/nuxt3-blog-server/target/nuxt3-blog-server.jar > /dev/null 2>&1 &
你提供的命令是用于在 Linux 系统中后台运行一个 Java 应用程序的常用方法。下面是命令的详细解释:
bash复制代码java -jar /root/nuxt3-blog-server/target/nuxt3-blog-server.jar > /dev/null 2>&1 &
java -jar
:这是启动一个打包为 JAR 文件的 Java 应用程序的命令。-jar
参数后面跟着 JAR 文件的路径。/root/nuxt3-blog-server/target/nuxt3-blog-server.jar
:这是 JAR 文件的路径。确保这个路径是正确的,并且该路径下的 JAR 文件确实存在。> /dev/null
:这部分将标准输出(stdout)重定向到/dev/null
,这意味着程序的任何正常输出(例如打印到控制台的信息)都会被丢弃,不会显示在终端上。2>&1
:这部分将标准错误(stderr)重定向到标准输出(stdout)。由于标准输出已经被重定向到/dev/null
,因此标准错误也会被丢弃。&
:这个符号将命令放到后台执行,这样命令就会在后台运行,而不会阻塞当前的终端会话。
综上所述,这个命令会启动 nuxt3-blog-server.jar
应用程序,并且不会在终端上显示任何输出或错误信息。如果你需要查看应用程序的输出或错误,你应该去掉重定向部分(> /dev/null 2>&1
),或者将它们重定向到文件中以便后续查看。
如果你想要应用程序在后台运行,并且能够查看输出和错误,可以这样做:
bash复制代码java -jar /root/nuxt3-blog-server/target/nuxt3-blog-server.jar > /path/to/logfile.log 2>&1 &
将 /path/to/logfile.log
替换为你想要保存日志的实际文件路径。这样,应用程序的输出和错误都会被写入到指定的日志文件中。
一键更新部署脚本
这是让deepseek
帮我生成的一键更新部署脚本,每次本地开发完以后都要手动再服务器上拉取代码然后重新启动,有点费事费力,直接用脚本搞定。
bash
复制代码
#!/bin/bash
### ========= 配置区域(仅修改这一块) ========= ###
# 后端配置
BACKEND_PROJECT_DIR="/root/nuxt3-blog-server"
BACKEND_GIT_BRANCH="release"
BACKEND_APP_NAME="nuxt3-blog-server"
MAVEN_OPTS="-DskipTests=true"
JVM_OPTS="-Dfile.encoding=UTF-8"
SPRING_CONFIG="/root/application.yml"
# 前端配置
FRONTEND_PROJECT_DIR="/root/nuxt3-blog"
FRONTEND_GIT_BRANCH="release"
FRONTEND_APP_NAME="nuxt3-blog"
FRONTEND_PORT=3000
# 通用配置
LOG_DIR="/root/logs"
PM2_CONFIG="/root/ecosystem.config.cjs"
### ========= 脚本逻辑部分 ========= ###
# 创建日志目录
mkdir -p "$LOG_DIR" || { echo "❌ 无法创建日志目录 $LOG_DIR"; exit 1; }
# 显示菜单
echo "请选择要部署的项目:"
echo "1. 部署后端 ($BACKEND_APP_NAME)"
echo "2. 部署前端 ($FRONTEND_APP_NAME)"
echo "3. 部署全部(先后端,再前端)"
read -p "请输入数字 (1/2/3): " choice
# ===== 后端部署函数 =====
deploy_backend() {
echo -e "\n=== 🚀 开始部署后端 ==="
cd "$BACKEND_PROJECT_DIR" || { echo "❌ 无法进入目录 $BACKEND_PROJECT_DIR"; exit 1; }
echo "➤ 拉取代码分支 [$BACKEND_GIT_BRANCH]..."
git fetch origin || exit 1
git checkout "$BACKEND_GIT_BRANCH" || exit 1
git pull origin "$BACKEND_GIT_BRANCH" || exit 1
echo "➤ 构建 Maven 项目..."
mvn clean package $MAVEN_OPTS || exit 1
JAR_FILE=$(find target -maxdepth 1 -name '*.jar' | head -n 1)
[ -z "$JAR_FILE" ] && { echo "❌ 未找到 JAR 文件"; exit 1; }
pm2 delete "$BACKEND_APP_NAME" >/dev/null 2>&1 || true
cat > "$PM2_CONFIG" <<EOF
module.exports = {
apps: [{
name: "$BACKEND_APP_NAME",
script: "java",
args: "$JVM_OPTS -jar $BACKEND_PROJECT_DIR/$JAR_FILE",
interpreter: "none",
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: "1G",
min_uptime: "60s",
max_restarts: 10,
log_date_format: "YYYY-MM-DD HH:mm:ss Z",
error_file: "$LOG_DIR/${BACKEND_APP_NAME}-error.log",
out_file: "$LOG_DIR/${BACKEND_APP_NAME}-out.log",
pid_file: "$LOG_DIR/${BACKEND_APP_NAME}.pid",
merge_logs: true,
env: {
SPRING_CONFIG_LOCATION: "file:$SPRING_CONFIG"
}
}]
}
EOF
pm2 start "$PM2_CONFIG" || exit 1
pm2 save --force
echo "✅ 后端部署完成"
}
# ===== 前端部署函数 =====
deploy_frontend() {
echo -e "\n=== 🌐 开始部署前端 ==="
cd "$FRONTEND_PROJECT_DIR" || { echo "❌ 无法进入目录 $FRONTEND_PROJECT_DIR"; exit 1; }
echo "➤ 拉取代码分支 [$FRONTEND_GIT_BRANCH]..."
git fetch origin || exit 1
git checkout "$FRONTEND_GIT_BRANCH" || exit 1
git pull origin "$FRONTEND_GIT_BRANCH" || exit 1
echo "➤ 安装依赖..."
npm install || exit 1
echo "➤ 构建 Nuxt3 项目..."
npm run build || exit 1
pm2 delete "$FRONTEND_APP_NAME" >/dev/null 2>&1 || true
cat > "$PM2_CONFIG" <<EOF
module.exports = {
apps: [{
name: "$FRONTEND_APP_NAME",
port: "$FRONTEND_PORT",
script: "$FRONTEND_PROJECT_DIR/.output/server/index.mjs",
instances: 1,
exec_mode: "cluster",
log_date_format: "YYYY-MM-DD HH:mm:ss Z",
error_file: "$LOG_DIR/${FRONTEND_APP_NAME}-error.log",
out_file: "$LOG_DIR/${FRONTEND_APP_NAME}-out.log",
pid_file: "$LOG_DIR/${FRONTEND_APP_NAME}.pid",
merge_logs: true,
env: {}
}]
}
EOF
pm2 start "$PM2_CONFIG" || exit 1
pm2 save --force
echo "✅ 前端部署完成"
}
# ===== 选择执行 =====
case "$choice" in
1)
deploy_backend
;;
2)
deploy_frontend
;;
3)
deploy_backend
deploy_frontend
;;
*)
echo "❌ 无效输入,请输入 1、2 或 3"
exit 1
;;
esac
# 展示当前状态
echo -e "\n📦 当前 PM2 应用状态:"
pm2 ls
留言 (0)