在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例
目录
- 1. 需求
- 2. 项目准备
- 3. VUE CLI项目部署
- 3.1 部署前的准备
- 3.1.1 后端通信路由修改
- 3.1.2 导航修改
- 3.2 构建项目
- 3.3 配置nginx代理
- 4. 后端配置
- 4.1 其他依赖项
- 4.2 单次执行测试
- 4.3 创建Systemd 服务文件
- 4.4 配置 Nginx 作为反向代理
- 5. 其他注意事项
1. 需求
近期做一些简单工程开发基本都采用的VUE-Django框架,需要部署在单位服务器或腾讯云服务器,步骤稍微有些杂,容易忘,每次都得问LLM,故做此记录,以供参考。
2. 项目准备
如何创建VUE及Django项目,此博客不做阐述。
3. VUE CLI项目部署
3.1 部署前的准备
将本地写的vue cli项目整个打包到服务器。
3.1.1 后端通信路由修改
我这里用的是VUE CLI。在.vue文件中,若有前后段数据传输或函数调用,一定记得在script中把路由该一下,不能是本地的127.0.0.1,若服务器地址是43.***.**.63,则需要换成这个地址,最好直接用域名。
例如:
const response = await fetch('http://127.0.0.1:8000/api/journal/');
就需要改为:
const response = await fetch('https://i...s.cn/api/journal/');
8000 被移除,因为 Nginx 通常会配置为监听 80 (HTTP) 或 443 (HTTPS) 端口,并将请求代理到后端的 8000 端口。如果你的服务器配置了 HTTPS,应使用 https://。
可以导航到相应的目录下,执行以下代码查看哪些文件包含127.0.0.1
grep -rl '127.0.0.1' .
如果使用诸如const response = await axios.get('/api/email/history')就不会有这个问题。
3.1.2 导航修改
找到vue cli项目根目录下的vue.config.js文件,如下:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,devServer: {port: 8080},// 新增:配置 htmlWebpackPlugin 的选项chainWebpack: config => {config.plugin('html').tap(args => {args[0].title = '标题'; // 设置网页标题return args;});},publicPath: '/xb/' // 添加这一行
})
需要新增 publicPath: '/xb/'
找到文件/src/router/index.js,底部添加:
const router = createRouter({history: createWebHistory('/xb/'),routes
})
找到文件src/main.js
找到设置 Axios baseURL 的行:
查找类似 axios.defaults.baseURL = 'http://43.×××.××.63' 的代码。
修改为正确的 HTTPS 地址和域名:
// 推荐使用域名并确保协议是 https
axios.defaults.baseURL = 'https://i...s.cn'
执行npm run build.
3.2 构建项目
在VUE CLI目录下执行npm run build构建项目,会生成dist目录。
3.3 配置nginx代理
在路径/etc/nginx/sites-available下新建一个配置文件,如果不新建可以都写在default中,但太多容易乱。更推荐新建一个。
比如,我新建了一个i...s.cn(我的域名),然后写入配置:
# HTTP Redirect for i...s.cn
server {listen 80;listen [::]:80;server_name i...s.cn www.i...s.cn;return 301 https://$host$request_uri;
}# HTTPS Configuration for i...s.cn
server {listen 443 ssl http2;listen [::]:443 ssl http2;server_name i...s.cn www.i...s.cn;ssl_certificate /www/server/panel/vhost/cert/i...s.cn/fullchain.pem;ssl_certificate_key /www/server/panel/vhost/cert/i...s.cn/privkey.pem;# 1. i...s.cn 官方网站根目录root /www/wwwroot/i...s.cn;index index.html index.htm index.php;# 2. pdf_download 配置(在该域名下的其他目录网站)location /pdf_download/ {alias /www/wwwroot/i...s.cn/pdf_download/;index dashboard.html;autoindex off;}# 3. vue 应用配置 (部署在 /xb/ 路径下)location /xuebao/ {alias /www/wwwroot/i...s.cn/xb/vue/dist/;index index.html index.htm;try_files $uri $uri/ /xb/index.html;}# 处理官方网站根路径和其他未匹配的路径location / {try_files $uri $uri/ /index.php?$args;}# 处理 PHP 文件请求 (如果官方网站需要)location ~ \.php$ {include snippets/fastcgi-php.conf;fastcgi_pass unix:/tmp/php-cgi-80.sock; # 请确认此路径是否正确fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}# 访问和错误日志access_log /var/log/nginx/i...s.cn.access.log;error_log /var/log/nginx/i...s.cn.error.log;
}
}
因为是新建的配置文件,需要执行
sudo ln -s /etc/nginx/sites-available/i...s.cn /etc/nginx/sites-enabled/i...s.cn
以及重启nginx
sudo nginx -t、sudo systemctl reload nginx
重启之后,访问相应URL,前端页面显示正常。
若要关闭nginx服务,执行sudo systemctl stop nginx
4. 后端配置
这里后端采用的是django,django环境安装不再赘述。
这里需要注意,在正式配置后端之前,一定要在django项目的settings.py中修改以下配置:
- DEBUG = False
- ALLOWED_HOSTS添加自己的域名
4.1 其他依赖项
这里的HTTP服务器我选择Gunicorn。
若没有执行pip install gunicorn
4.2 单次执行测试
可先单独执行django,确保没有因为环境问题造成的bug。
切换到django目录下,执行gunicorn --bind 127.0.0.1:8000 qk.wsgi:application
看到类似以下信息,则没有问题:
gunicorn --bind 127.0.0.1:8000 qk.wsgi:application
[2025-04-16 22:02:35 +0800] [2812697] [INFO] Starting gunicorn 23.0.0
[2025-04-16 22:02:35 +0800] [2812697] [INFO] Listening at: http://127.0.0.1:8000 (2812697)
[2025-04-16 22:02:35 +0800] [2812697] [INFO] Using worker: sync
[2025-04-16 22:02:35 +0800] [2812698] [INFO] Booting worker with pid: 2812698
ctrl+c停止手动运行的Gunicorn。
4.3 创建Systemd 服务文件
这是让 Django (通过 Gunicorn) 在后台运行、开机自启、并在失败时自动重启的关键。
sudo nano /etc/systemd/system/自定义命名.service
粘贴配置以下内容
[Unit]
Description=gunicorn daemon for qk Django project
After=network.target # 表示在网络可用后启动[Service]
# === 修改为你运行代码的用户和组 ===
User=ubuntu # 创建的专用用户
Group=ubuntu # 用户同名组# === 修改为你的 Django 项目根目录 ===
WorkingDirectory=/www/wwwroot/....# === 修改为你的 Python 环境中 gunicorn 和 python 的绝对路径 ===
ExecStart=/home/ubuntu/anaconda3/envs/ser/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 qk.wsgi:application \--access-logfile /var/log/gunicorn/gunicorn-qk-access.log \--error-logfile /var/log/gunicorn/gunicorn-qk-error.logRestart=always # 如果服务退出,总是尝试重启
RestartSec=10 # 重启前等待 10 秒
KillSignal=SIGQUIT # 使用 SIGQUIT 平滑关闭 Gunicorn
TimeoutStopSec=5 # 等待 5 秒后强制关闭
PrivateTmp=true # 使用私有临时目录[Install]
WantedBy=multi-user.target # 表示服务应该在多用户模式下启用
!!注意,不要有行末注释,我这里是为了解释,配置文件删掉#,不然后续会报错!!
User / Group: 运行 Gunicorn 进程的用户和组。非常重要! 确保这个用户对项目目录 (WorkingDirectory) 和虚拟环境有读取权限,并且对日志目录 (如果使用) 有写入权限。ubuntu 和 www-data 是常见的选择,但最好使用权限受限的专用用户。
修改好配置文件之后,执行:
- 重新加载 Systemd 配置: 让 Systemd 读取你新创建的服务文件。
sudo systemctl daemon-reload - 启动Gunicorn服务:
sudo systemctl start 自定义.service - 检查服务状态:
sudo systemctl status gunicorn-qk.service
若出现Active: active (running) since Wed 2025-04-16 22:16:16 CST; 28s ago即为成功
如果失败,可检查日志错误信息。sudo journalctl -u gunicorn-qk.service -n 50 --no-pager - 设置开机自启动
sudo systemctl enable gunicorn-qk.service
4.4 配置 Nginx 作为反向代理
Django 需要写进 Nginx 的配置文件。Gunicorn 服务正在监听 127.0.0.1:8000,这个地址只能从服务器内部访问。 VUE 前端通过公网 IP 发送请求。Nginx 需要知道:当收到指向 /api/ 的请求时,应该将这个请求转发给内部运行在 127.0.0.1:8000 的 Gunicorn 服务。
需要在/etc/nginx/sites-available/i...s.cn文件的 server { … } 块(监听 443 端口的那个)中添加或修改一个 location /api/ { … } 块。
location /api/ {proxy_pass http://127.0.0.1:8000;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;}
5. 其他注意事项
- 关于嵌套/嵌入式前端应用部署
- 问题:当一个预构建的前端应用(应用 B)被嵌入到另一个前端应用(应用 A)的子目录下时,应用 B 内部引用的静态资源(JS, CSS)路径可能因部署路径改变而失效 (404)。
- 解决:必须为嵌入的应用(应用 B)在其构建配置中明确指定最终的、绝对的部署路径(例如,如果应用 A 在 /app-a/,应用 B 在其下,则路径为 /app-a/app-b/),然后重新构建应用 B。将新构建的产物替换应用 A 中的旧版本(public中),并(如果需要)重新构建应用 A。
- 关于前端 API 请求 URL
- 问题:在 HTTPS 页面中硬编码使用 HTTP 协议或 IP 地址的 API 请求 URL,会导致 “Mixed Content” 安全错误或请求失败。直接在组件中写死 URL 也容易出错且不利于维护。
- 解决:确保所有 API 请求均使用正确的协议 (通常是 HTTPS) 和主机名 (域名)。最佳实践是配置并统一使用一个全局 HTTP 请求库实例(如 Axios),为其设置正确的 baseURL (包含协议和域名),然后在组件代码中仅使用相对路径(如 /api/data)发起请求。
- 如何更新服务(在修改代码后):
- 后端 (Django/Gunicorn): 修改 Python 代码 (如 views.py, models.py, settings.py) 后,重启 Gunicorn 服务:
sudo systemctl restart gunicorn-qk.service,gunicorn-qk.service是自定义的名字。 - 前端 (VUE): 修改前端源代码 (如 .vue, .js, .css) 后,需要重新构建项目,并将新生成的 dist 文件部署:
npm run build
(Nginx 通常不需要重启或重新加载,因为它会自动提供 dist 目录下的新文件。只有在修改 Nginx 配置文件本身时才需要 sudo systemctl reload nginx)
- 后端 (Django/Gunicorn): 修改 Python 代码 (如 views.py, models.py, settings.py) 后,重启 Gunicorn 服务:
- 查看日志命令
-
后端 (Django/Gunicorn):查看 Gunicorn 错误日志 (主要看 Python/Django 错误):
sudo tail -n 50 /var/log/gunicorn/gunicorn-qk-error.log # 实时查看: sudo tail -f /var/log/gunicorn/gunicorn-qk-error.log -
查看 Gunicorn 访问日志 (看哪些请求到了后端):
sudo tail -n 50 /var/log/gunicorn/gunicorn-qk-access.log # 实时查看: sudo tail -f /var/log/gunicorn/gunicorn-qk-access.log -
查看 Systemd 服务日志 (看服务启动/停止状态):
sudo journalctl -u gunicorn-qk.service -n 50 --no-pager # 实时查看: sudo journalctl -u gunicorn-qk.service -f -
前端 (VUE / Nginx):查看 VUE 运行时错误 (JS 错误): 在浏览器开发者工具 (F12) 的 “Console” (控制台) 查看。查看 Nginx 错误日志 (Nginx 配置、权限错误):
sudo tail -n 50 /var/log/nginx/i....s.cn.error.log # 实时查看: sudo tail -f /var/log/nginx/i...s.cn.error.log -
查看 Nginx 访问日志 (看浏览器请求记录,包括静态文件和 API 代理):
sudo tail -n 50 /var/log/nginx/i....s.cn.access.log # 实时查看: sudo tail -f /var/log/nginx/i....s.cn.access.log
-
- 取消systemctl自启动:
关闭自启动:sudo systemctl disable gunicorn-qk.service
停止当前服务并防止它因被kill而重启:
不要直接用kill命令。应该使用systemd的命令来停止它:
sudo systemctl stop gunicorn-qk.service
相关文章:
在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例
目录 1. 需求2. 项目准备3. VUE CLI项目部署3.1 部署前的准备3.1.1 后端通信路由修改3.1.2 导航修改 3.2 构建项目3.3 配置nginx代理 4. 后端配置4.1 其他依赖项4.2 单次执行测试4.3 创建Systemd 服务文件4.4 配置 Nginx 作为反向代理 5. 其他注意事项 1. 需求 近期做一些简单…...
回归,git 分支开发操作命令
核心分支说明 主分支(master/production)存放随时可部署到生产环境的稳定代码,仅接受通过测试的合并请求。 开发分支(develop)集成所有功能开发的稳定版本,日常开发的基础分支,从该分支创建特性…...
【java+Mysql】学生信息管理系统
学生信息管理系统是一种用于管理学生信息的软件系统,旨在提高学校管理效率和服务质量。本课程设计报告旨在介绍设计和实现学生信息管理系统的过程。报告首先分析了系统的需求,包括学生基本信息管理、成绩管理等功能。接着介绍了系统的设计方案࿰…...
小白从0学习网站搭建的关键事项和避坑指南(2)
以下是针对小白从零学习网站搭建的 进阶注意事项和避坑指南(第二期),覆盖开发中的高阶技巧、常见陷阱及解决方案,帮助你在实战中提升效率和质量: 一、进阶技术选型避坑 1. 前端框架选择 误区:盲目追求最新…...
Windows 10 上安装 Spring Boot CLI详细步骤
在 Windows 10 上安装 Spring Boot CLI 可以通过以下几种方式完成。以下是详细的步骤说明: 1. 手动安装(推荐) 步骤 1:下载 Spring Boot CLI 访问 Spring Boot CLI 官方发布页面。下载最新版本的 .zip 文件(例如 sp…...
spring boot -- 配置文件application.properties 换成 application.yml
在Spring Boot项目中,application.properties和application.yml是两种常用的配置文件格式,它们各自具有不同的特点和适用场景2。以下是它们之间的主要差异2: 性能差异 4: 加载机制 2: application.properties文件会被加载到内存中,并且只加载一次,之后直接从内存中读取…...
Spring Boot实战:基于策略模式+代理模式手写幂等性注解组件
一、为什么需要幂等性? 核心定义:在分布式系统中,一个操作无论执行一次还是多次,最终结果都保持一致。 典型场景: 用户重复点击提交按钮网络抖动导致的请求重试消息队列的重复消费支付系统的回调通知 不处理幂等的风…...
【Rust 精进之路之第14篇-结构体 Struct】定义、实例化与方法:封装数据与行为
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越元组,给数据赋予意义 在之前的学习中,我们了解了 Rust 的基本数据类型(标量)以及两种基础的复合类型:元组 (Tuple) 和数组 (Array)。元组允许我们将不同类型的值组合…...
postgres 数据库信息解读 与 sqlshell常用指令介绍
数据库信息: sqlshell Server [localhost]: 192.168.30.101 Database [postgres]: Port [5432]: 5432 Username [postgres]: 用户 postgres 的口令: psql (15.12, 服务器 16.8 (Debian 16.8-1.pgdg120+1)) 警告:psql 主版本15,服务器主版本为16.一些psql功能可能无法正常使…...
论文阅读:2024 arxiv DeepInception: Hypnotize Large Language Model to Be Jailbreaker
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 DeepInception: Hypnotize Large Language Model to Be Jailbreaker DeepInception:催眠大型语言模型,助你成为越狱者 https://arxiv.org/pdf/2311.0…...
vue2技术练习-开发了一个宠物相关的前端静态商城网站-宠物商城网站
为了尽快学习掌握相关的前端技术,最近又实用 vue2做了一个宠物行业的前端静态网站商城。还是先给大家看一下相关的网站效果: 所以大家如果想快速的学习或者掌握一门编程语言,最好的方案就是通过学习了基础编程知识后,就开始利用…...
嵌入式学习——远程终端登录和桌面访问
目录 通过桥接模式连接虚拟机和Windows系统 1、桥接模式 2、虚拟机和Windows连接(1) 3、虚拟机和Windows连接(2) 在Linux虚拟机中创建新用户 Windows系统环境下对Linux系统虚拟机操作 远程登录虚拟机(1ÿ…...
wpf stylet框架 关于View与viewmodel自动关联绑定的问题
1.1 命名规则 Aview 对应 AVIewModel, 文件夹 views 和 viewmodels 1.2 需要注册服务 //RootViewModel是主窗口 public class Bootstrapper : Bootstrapper<RootViewModel>{/// <summary>/// 配置IoC容器。为数据共享创建服务/// </summary…...
如何新建一个空分支(不继承 master 或任何提交)
一、需求分析: 在 Git 中,我们通常通过 git branch 来新建分支,这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交,不继承 master 或任何已有内容,这该怎么…...
HarmonyOS-ArkUI-动画分类简介
本文的目的是,了解一下HarmonyOS动画体系中的分类。有个大致的了解即可。 动效与动画简介 动画,是客户端提升界面交互用户体验的一个重要的方式。可以使应用程序更加生动灵越,提高用户体验。 HarmonyOS对于界面的交互方面,围绕回归本源的设计理念,打造自然,流畅品质一提…...
Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
一、前言 在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如…...
[第十六届蓝桥杯 JavaB 组] 真题 + 经验分享
A:逃离高塔(AC) 这题就是简单的签到题,按照题意枚举即可。需要注意的是不要忘记用long,用int的话会爆。 📖 代码示例: import java.io.*; import java.util.*; public class Main {public static PrintWriter pr ne…...
深⼊理解 JVM 执⾏引擎
深⼊理解 JVM 执⾏引擎 其中前端编译是在 JVM 虚拟机之外执⾏,所以与 JVM 虚拟机没有太⼤的关系。任何编程语⾔,只要能够编译出 满⾜ JVM 规范的 Class ⽂件,就可以提交到 JVM 虚拟机执⾏。⾄于编译的过程,如果你不是想要专⻔去研…...
iwebsec靶场 文件包含关卡通关笔记11-ssh日志文件包含
目录 日志包含 1.构造恶意ssh登录命令 2.配置ssh日志开启 (1)配置sshd (2)配置rsyslog (3)重启服务 3.写入webshell木马 4.获取php信息渗透 5.蚁剑连接 日志包含 1.构造恶意ssh登录命令 ssh服务…...
kafka菜鸟教程
一、kafka原理 1、kafka是一个高性能的消息队列系统,能够处理大规模的数据流,并提供低延迟的数据传输,它能够以每秒数十万条消息的速度进行读写操作。 二、kafka优点 1、服务解耦 (1)提高系统的可维护性 通过服务…...
应用镜像是什么?轻量应用服务器的镜像大全
应用镜像是轻量应用服务器专属的,镜像就是轻量应用服务器的装机盘,应用镜像在原有的纯净版操作系统上集成了应用程序,例如WordPress应用镜像、宝塔面板应用镜像、WooCommerce等应用,阿里云服务器网aliyunfuwuqi.com整理什么是轻量…...
深入理解分布式缓存 以及Redis 实现缓存更新通知方案
一、分布式缓存简介 1. 什么是分布式缓存 分布式缓存:指将应用系统和缓存组件进行分离的缓存机制,这样多个应用系统就可以共享一套缓存数据了,它的特点是共享缓存服务和可集群部署,为缓存系统提供了高可用的运行环境,…...
Spring Boot 中的自动配置原理
2025/4/6 向全栈工程师迈进! 一、自动配置 所谓的自动配置原理就是遵循约定大约配置的原则,在boot工程程序启动后,起步依赖中的一些bean对象会自动的注入到IOC容器中。 在讲解Spring Boot 中bean对象的管理的时候,我们注入bean对…...
软考高级-系统架构设计师 论文范文参考(一)
文章目录 论SOA技术的应用论SOA在企业信息化中的应用论UP(统一过程方法)的应用论分布式数据库的设计与实现论改进Web服务器性能的有关技术论基于UML的需求分析论基于构件的软件开发论基于构件的软件开发(二) 论SOA技术的应用 摘要: 本人于…...
剑指Offer(数据结构与算法面试题精讲)C++版——day16
剑指Offer(数据结构与算法面试题精讲)C版——day16 题目一:序列化和反序列化二叉树题目二:从根节点到叶节点的路径数字之和题目三:向下的路径节点值之和附录:源码gitee仓库 题目一:序列化和反序…...
windows server C# IIS部署
1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 说明:自带的是.net 4.5 不需要安装.net 3.5 尽量使用 windows server 2019、2016高版本,低版本会出现需要打补丁的问题 2、打开IIS 3、打开iis应用池 .net 4.5 4、添…...
Android: gradient 使用
在 Android 中使用 gradient(渐变) 通常是通过 drawable 文件来设置背景。下面是可以直接用的几种用法汇总,包括线性渐变、径向渐变、扫描渐变(sweep)等: ✅ 1. Linear Gradient(线性渐变&#…...
【教程】PyTorch多机多卡分布式训练的参数说明 | 附通用启动脚本
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 torchrun 一、什么是 torchrun 二、torchrun 的核心参数讲解 三、torchrun 会自动设置的环境变量 四、torchrun 启动过程举例 机器 A&#…...
Neo4j初解
Neo4j 是目前应用非常广泛的一款高性能的 NoSQL 图数据库,其设计和实现专门用于存储、查询和遍历由节点(实体)、关系(边)以及属性(键值对)构成的图形数据模型。它的核心优势在于能够以一种自然且…...
学习笔记二十——Rust trait
🧩 Rust Trait 彻底搞懂版 👀 目标读者:对 Rust 完全陌生,但想真正明白 “Trait、Trait Bound、孤岛法则” 在做什么、怎么用、为什么这样设计。 🛠 方法: 先给“心里模型”——用生活类比把抽象概念掰开揉…...
