问题
在服务器部署上gin+vue前后端分离项目:
- 配置好环境,包括docker、redis、mysql、nginx
- 打包后端,上传服务器,部署
- 部署前端
- 运行
下面的内容不全是按照这个顺序进行的,主要记录了我在部署过程中遇到的问题,可以根据目录查找。
✌️希望可以帮到你
服务器
腾讯云服务器root用户创建
腾讯云服务器获取root权限(ubuntu系统)_腾讯云创建好容器怎么查看root密码-CSDN博客
服务器上安装docker
云服务器 搭建 Docker-实践教程-文档中心-腾讯云 (tencent.com)
ubuntu安装mysql
-
更新系统包列表:打开终端,输入以下命令来更新你的Ubuntu系统的包列表:
sudo apt update -
安装MySQL服务器: 使用以下命令安装MySQL 8.0:
sudo apt install mysql-server -
配置MySQL: 安装完成后,运行安全安装脚本来设置密码和改进安全性:
这个脚本会引导你设置root用户密码、移除匿名用户、禁止root远程登录以及删除测试数据库等。
sudo mysql_secure_installation一般默认开启
auth_socket方式,要使用用户名和密码,执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; FLUSH PRIVILEGES; -
验证MySQL服务状态: 确认MySQL服务已经启动,可以使用以下命令:
sudo systemctl status mysql.service -
如果服务没有运行,使用以下命令启动它:
sudo systemctl start mysql.service -
登录MySQL数据库: 安装完成后,使用以下命令登录到MySQL数据库:
sudo mysql -u root -p
-
运行sql文件
mysql -u username -p database_name < file.sql
下载Docker Compose
-
卸载当前的 Docker Compose:
sudo apt remove docker-compose -
重新安装 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose -
确认安装成功:
docker-compose --version -
如果启用docker compose时,找不到,
-bash: /usr/bin/docker-compose: No such file or directory,需要加到环境变量里(在下面),还要修改权限(在下面)
安装redis
安装Redis:
sudo apt install redis-server
验证Redis是否安装成功: Redis服务默认情况下会自动启动。你可以通过运行以下命令来检查Redis服务器的状态:
sudo systemctl status redis
如果Redis正在运行,你应该会看到一个状态表明它是“active (running)”。
测试Redis: 使用redis-cli工具测试Redis服务器:
redis-cli
在redis-cli中,尝试执行一个简单的命令,例如:
ping
如果Redis服务正在运行,你会得到一个“PONG”作为响应。
配置Redis(可选): Redis的配置文件位于/etc/redis/redis.conf。你可以编辑这个文件来调整配置,例如持久化选项、密码设置等。
-
为了使更改生效,每次修改配置后都需要重启Redis服务:
sudo systemctl restart redis
后端
go项目怎么在windows下打包成在linux中的可运行文件
-
下载mingw64
posix-seh版本
POSIX 线程模型更符合 UNIX/Linux 标准,通常用于需要较好兼容性的场合。SEH (Structured Exception Handling) 是 Windows 特有的异常处理机制,通常提供更好的错误处理能力。
-
在当前环境,把mingw64的bin文件夹加入到
PATH环境变量$env:PATH = "E:\Environment\mingw64\bin;" + $env:PATH检验
gcc是否可用:gcc --version -
编译 uisApp是名称,可改
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o uisApp -
如果报错
PS D:\UISwebsite\backend> $env:GOOS="linux"; $env:GOARCH="amd64"; go build -o uisApp # runtime/cgo gcc_linux_amd64.c: In function '_cgo_sys_thread_start': gcc_linux_amd64.c:57:9: error: unknown type name 'sigset_t'; did you mean '_sigset_t'? 57 | sigset_t ign, oset; | ^~~~~~~~ | _sigset_t gcc_linux_amd64.c:62:9: error: implicit declaration of function 'sigfillset' [-Werror=implicit-function-declaration] 62 | sigfillset(&ign); | ^~~~~~~~~~ gcc_linux_amd64.c:57:23: error: unused variable 'oset' [-Werror=unused-variable] 57 | sigset_t ign, oset; | ^~~~ cc1.exe: all warnings being treated as errors禁用CGO
$env:CGO_ENABLED="0"; -
项目根目录会生成一个app的可执行文件。使用./app就可以直接运行
app的配置文件(静态文件)要单独上传
跨域问题
如果前端成功发送了请求,后端也接收到了,但是前端没收到响应,那就是跨域的问题,要在后端配置CORS
go get -u github.com/gin-contrib/cors
import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// 配置 CORS
router.Use(cors.New(cors.Config{
AllowOrigins: []string{"http://101.42.183.175"}, // 或 "*" 允许所有域
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
AllowOriginFunc: func(origin string) bool {
return origin == "http://101.42.183.175" // 或使用 "*" 来允许所有源
},
MaxAge: 12 * time.Hour,
}))
// 其他路由配置
router.GET("/api/auth", someHandlerFunction)
router.Run(":8000")
}
Docker
但是实际上没有成功用docker部署,有问题还要查
Dockerfile中的基础镜像
在Dockerfile里必须写基础镜像,但是直接使用./uisApp开启后端的话,已经在本地编译成一个独立的二进制文件,不依赖于 Go 运行时或其他 Go 库,实际上用不到基础镜像,(但是需要写一个,可以写FROM ubuntu:latest)
一般Go的基础镜像会使用golang:alpine
docker代理
国内无法拉取Docker镜像了?这些方法拯救你的Docker-腾讯云开发者社区-腾讯云 (tencent.com)
试了很多代理都不行,使用这个链接里的代理可以正常拉取了
dockerfile相关
目录问题
=> ERROR [4/4] COPY /opt/uisApp /app/ 0.0s
------
> [4/4] COPY /opt/uisApp /app/:
------
Dockerfile:13
--------------------
11 |
12 | # 将二进制文件从构建上下文复制到容器内
13 | >>> COPY /opt/uisApp /app/
14 |
15 | # 使你的应用成为容器启动的默认程序
--------------------
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 8dc80e4e-3b4d-406c-bf71-5fd1526ca9d2::qgnqipdd3s5z3zrit93wqt1w8: "/opt/uisApp": not found
目录是基于当前dockerfile所在目录的相对路径,也就是要在当前的app目录里的/app/opt/uisApp找文件
修改后端配置文件
如果一个服务运行是基于另一个服务的,如后端基于mysql,需要修改后端配置文件中的mysql,由127.0.0.1:3306改为mysql80(基于下面的文件)
version: '3.8'
services:
uisapp:
image: uisapp-image
depends_on:
- mysql80
ports:
- "8000:8000"
environment:
MYSQL_HOST: mysql80
MYSQL_USER: root
MYSQL_PASSWORD: 123456
MYSQL_DB: uis
mysql80:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: uis
volumes:
- uis-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
volumes:
uis-data:
前端
怎么把vue项目部署到服务器
-
改项目里的axios配置(在main.js里加)
axios.defaults.baseURL = 'http://服务器IP:8000/api'; -
下载nginx
sudo apt update sudo apt install nginx -
在
/etc/nginx/sites-available下创建一个新的配置文件,例如your_project.conf,并配置如下:server { listen 80; server_name your_server_domain_or_IP; location / { root /path/to/your/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://localhost:8000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } -
启用站点并重启Nginx:(名字一定要对应)
sudo ln -s /etc/nginx/sites-available/your_project.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx
命令
Windos命令
查看进程并删除
netstat -ano | findstr :8080
taskkill /PID <进程ID> /F
docker命令
创建数据卷
使用数据卷可以进行数据持久化。即使容器被删除,数据也会保留在数据卷中。如果需要恢复或迁移数据,只需将同一个数据卷挂载到新的 MySQL 容器即可。
docker volume create mysql-data
运行mysql容器
docker run -d \
--name mysql80 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
mysql-data就是前面创建的数据卷,挂载到 容器的 /var/lib/mysql 目录,这是 MySQL 默认存储数据的位置。
启用Docker Compose
docker-compose up -d
linux命令
环境变量
-
查看
PATH环境变量echo $PATH -
添加环境变量(/usr/local/bin是要添加的,可变)
export PATH=$PATH:/usr/local/bin -
使其生效
source ~/.bashrc
修改权限
sudo chmod +x /usr/local/bin/docker-compose
查看,终止进程
sudo lsof -i :8080
sudo kill -9 <PID>
防火墙
sudo ufw status
sudo ufw allow 8000
nginx
启动
sudo systemctl start nginx
重启
sudo systemctl restart nginx
查看状态
sudo systemctl status nginx
检查语法
sudo nginx -t