在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例

news2025/4/21 20:03:17

目录

  • 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 -tsudo systemctl reload nginx
重启之后,访问相应URL,前端页面显示正常。
若要关闭nginx服务,执行sudo systemctl stop nginx

4. 后端配置

这里后端采用的是django,django环境安装不再赘述。
这里需要注意,在正式配置后端之前,一定要在django项目的settings.py中修改以下配置:

  1. DEBUG = False
  2. 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.log

Restart=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 是常见的选择,但最好使用权限受限的专用用户。
修改好配置文件之后,执行:

  1. 重新加载 Systemd 配置: 让 Systemd 读取你新创建的服务文件。sudo systemctl daemon-reload
  2. 启动Gunicorn服务:sudo systemctl start 自定义.service
  3. 检查服务状态: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
  4. 设置开机自启动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. 其他注意事项

  1. 关于嵌套/嵌入式前端应用部署
    • 问题:当一个预构建的前端应用(应用 B)被嵌入到另一个前端应用(应用 A)的子目录下时,应用 B 内部引用的静态资源(JS, CSS)路径可能因部署路径改变而失效 (404)。
    • 解决:必须为嵌入的应用(应用 B)在其构建配置中明确指定最终的、绝对的部署路径(例如,如果应用 A 在 /app-a/,应用 B 在其下,则路径为 /app-a/app-b/),然后重新构建应用 B。将新构建的产物替换应用 A 中的旧版本(public中),并(如果需要)重新构建应用 A。
  2. 关于前端 API 请求 URL
    • 问题:在 HTTPS 页面中硬编码使用 HTTP 协议或 IP 地址的 API 请求 URL,会导致 “Mixed Content” 安全错误或请求失败。直接在组件中写死 URL 也容易出错且不利于维护。
    • 解决:确保所有 API 请求均使用正确的协议 (通常是 HTTPS) 和主机名 (域名)。最佳实践是配置并统一使用一个全局 HTTP 请求库实例(如 Axios),为其设置正确的 baseURL (包含协议和域名),然后在组件代码中仅使用相对路径(如 /api/data)发起请求。
  3. 如何更新服务(在修改代码后):
    • 后端 (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)
  4. 查看日志命令
    • 后端 (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
      
  5. 取消systemctl自启动:
    关闭自启动:sudo systemctl disable gunicorn-qk.service
    停止当前服务并防止它因被 kill 而重启:
    不要直接用 kill 命令。应该使用 systemd 的命令来停止它:
    sudo systemctl stop gunicorn-qk.service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java+Mysql】学生信息管理系统

学生信息管理系统是一种用于管理学生信息的软件系统,旨在提高学校管理效率和服务质量。本课程设计报告旨在介绍设计和实现学生信息管理系统的过程。报告首先分析了系统的需求,包括学生基本信息管理、成绩管理等功能。接着介绍了系统的设计方案&#xff0…

小白从0学习网站搭建的关键事项和避坑指南(2)

以下是针对小白从零学习网站搭建的 进阶注意事项和避坑指南(第二期),覆盖开发中的高阶技巧、常见陷阱及解决方案,帮助你在实战中提升效率和质量: 一、进阶技术选型避坑 1. 前端框架选择 误区:盲目追求最新…

Windows 10 上安装 Spring Boot CLI详细步骤

在 Windows 10 上安装 Spring Boot CLI 可以通过以下几种方式完成。以下是详细的步骤说明: 1. 手动安装(推荐) 步骤 1:下载 Spring Boot CLI 访问 Spring Boot CLI 官方发布页面。下载最新版本的 .zip 文件(例如 sp…

vue2技术练习-开发了一个宠物相关的前端静态商城网站-宠物商城网站

为了尽快学习掌握相关的前端技术,最近又实用 vue2做了一个宠物行业的前端静态网站商城。还是先给大家看一下相关的网站效果: 所以大家如果想快速的学习或者掌握一门编程语言,最好的方案就是通过学习了基础编程知识后,就开始利用…

嵌入式学习——远程终端登录和桌面访问

目录 通过桥接模式连接虚拟机和Windows系统 1、桥接模式 2、虚拟机和Windows连接(1) 3、虚拟机和Windows连接(2) 在Linux虚拟机中创建新用户 Windows系统环境下对Linux系统虚拟机操作 远程登录虚拟机(1&#xff…

如何新建一个空分支(不继承 master 或任何提交)

一、需求分析: 在 Git 中,我们通常通过 git branch 来新建分支,这些分支默认都会继承当前所在分支的提交记录。但有时候我们希望新建一个“完全干净”的分支 —— 没有任何提交,不继承 master 或任何已有内容,这该怎么…

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. 什么是分布式缓存 分布式缓存:指将应用系统和缓存组件进行分离的缓存机制,这样多个应用系统就可以共享一套缓存数据了,它的特点是共享缓存服务和可集群部署,为缓存系统提供了高可用的运行环境&#xff0c…

Spring Boot 中的自动配置原理

2025/4/6 向全栈工程师迈进! 一、自动配置 所谓的自动配置原理就是遵循约定大约配置的原则,在boot工程程序启动后,起步依赖中的一些bean对象会自动的注入到IOC容器中。 在讲解Spring Boot 中bean对象的管理的时候,我们注入bean对…

剑指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、添…

【教程】PyTorch多机多卡分布式训练的参数说明 | 附通用启动脚本

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 torchrun 一、什么是 torchrun 二、torchrun 的核心参数讲解 三、torchrun 会自动设置的环境变量 四、torchrun 启动过程举例 机器 A&#…

Neo4j初解

Neo4j 是目前应用非常广泛的一款高性能的 NoSQL 图数据库,其设计和实现专门用于存储、查询和遍历由节点(实体)、关系(边)以及属性(键值对)构成的图形数据模型。它的核心优势在于能够以一种自然且…

音视频小白系统入门课-2

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门: 音视频小白系统入门笔记-0音视频小白系统入门笔记-1 课程实践代码仓库:传送门 音视频编解…

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、结语 一、简介 CentOS(Community ENTerprise Operating System)是一个基于 Linux 的发行版之一,旨在提供一个免费的、企业级的计算平台,因其稳定性、安全…