腾讯云部署博客
2024 年 11 月 01 日 • 关于本站
关于本网站博客的部署相关记录。

腾讯云官网买一台服务器

我购买的配置是

CPU-2核 内存-4GB 带宽-6Mbps 硬盘-70GB 流量包-600GBGB/月

系统镜像 OpenCloudOS 9

登录云服务器

shell
复制代码
ssh [账号]@[ip]

安装环境

Nginx

在OpenCloudOS 9上安装Nginx,可以通过包管理器dnf来进行。以下是安装Nginx的步骤:

  1. 执行以下命令以更新软件包索引:
plain
复制代码
sudo dnf makecache
  1. 安装Nginx:
plain
复制代码
sudo dnf install nginx

安装完毕后就已经默认启动了,这时候浏览器输入公网ip就可以看到nginx默认页面,记得去控制台的防火墙里把80端口打开!!

  1. (可选)启动Nginx服务:
shell
复制代码
sudo systemctl start nginx
  1. (可选)设置Nginx开机自启:
shell
复制代码
sudo systemctl enable nginx
  1. (可选)检查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日还可用,请大家灵活安装

配置环境变量

  1. 编辑配置
bash
复制代码
vim ~/.bashrc
  1. 追加写入以下文本
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"

  1. 使用命令,使环境变量生效
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

  1. 启动mysql
bash
复制代码
service mysqld start
  1. 通过root用户登录mysql,当前版本默认无密码
bash
复制代码
mysql -uroot -p

  1. 创建一个可以远程访问的用户
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;-刷新

  1. (可选)删除无密码的本地用户
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密钥

  1. 通过命令 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]-----+
  • 中间通过三次回车键确定
  1. 查看生成的 SSH 公钥和私钥:
bash
复制代码
ls ~/.ssh/

输出:

bash
复制代码
id_ed25519 id_ed25519.pub
  • 私钥文件 id_ed25519
  • 公钥文件 id_ed25519.pub
  1. 读取公钥文件 ~/.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.crtblog.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
上一篇
开发
解决Nuxt3切换暗色模式下闪屏问题
OpenCloudOS 9环境搭建Zerotier行星服务器

留言 (0)

昵称(必填)
邮箱(必填)
网址(选填)