服务器部署 Nginx + Django + Vue

2023-10-28

欢迎点击链接跳转 Github Pages 博客,享受更舒适的排版界面。

本篇记录我配置和部署服务器的每一步,主要包括服务器配置 Django 虚拟环境、uWSGI 和 Nginx 的使用以及报错的纠正。以 Linux 服务器为例,因此需要具备一定的 Linux 知识基础。

服务器预设

租服务器

各大云平台,如腾讯云、阿里云、华为云等,都有学生优惠。我这里选择的是腾讯云,原因:控制台界面简洁优雅。

相关配置仅供参考:

  • 镜像信息:CentOS 7.6 64bit
  • 实例规格:CPU 1核,内存 2GB
  • 磁盘:系统盘 40GB
  • 流量包套餐:带宽 5Mbps,流量包 1000GB/月(免费)

SSH 远程连接

配置 SSH 远程连接,方便本地操作服务器,而无需每次都登录云平台。

在控制台中点击登录,进入服务器终端。第一步需要初始化超级用户 root 的密码,进入 superuser 权限。

sudo passwd       # 初始化密码
su                # 切换到root超级用户

修改配置文件,允许密码或密钥远程连接。

vim /etc/ssh/sshd_config      # 编辑ssh设置文件

在打开的文件中,修改:

RSAAuthentication yes                       # 开启rsa验证,需要添加
PubkeyAuthentication yes                    # 开启公钥登录,一般被注释掉了,去掉前面的#就好
AuthorizedKeysFile .ssh/authorized_keys     # 公钥保存位置,原来就有
PasswordAuthentication yes                  # 开启使用密码登录

保存退出,重启 SSH 服务。

service sshd restart        # 重启ssh服务

设置完毕后,即可在本地 powershell 或 git bash 连接服务器。

ssh root@<IP address>       # IP address 为你服务器的公网IP地址

另外,VScode 的 Remote - SSH 远程连接插件真香。

配置公钥

配置公钥后,本地连接服务器,无需每次都输入密码。

首先,生成本地电脑的公钥。

ssh-keygen -t rsa           # 打开cmd或powershell输入

默认回车即可,成功后在 C:\Users\用户名\.ssh 文件夹下会生成 id_rsaid_rsa.pub,后者就是本地用户的密钥。打开该文件,复制内容。然后使用 ssh 命令登录远程服务器,在 root 用户根目录下创建 .ssh 文件夹并进入,再创建 authorized_keys 文件,将密钥粘贴进去,之后重启 ssh 服务。

service sshd restart        # 重启ssh

更新系统软件包

服务器的预配置都比较古老,依次输入以下命令升级软件包或依赖。

yum update -y                               # 更新系统软件包
yum -y groupinstall "Development tools"     # 安装软件管理包
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel epel-release     # 安装可能使用的依赖

配置 Django

安装 python3.8.4

cd /usr/local                   # 我一般喜欢把文件下载到该目录下
wget https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tgz
tar -zxvf Python-3.8.4.tgz      # 解压python包

进入 Python 包路径,并编译安装到指定路径 /usr/local/python3

cd Python-3.8.4
./configure --prefix=/usr/local/python3
make && make install

安装成功后,建立软链接,添加环境变量。因为服务器系统自带有 python、python2、python3,因此我命名为 python3.8,避免冲突。但我的服务器只有 pip3 没有 pip,所以我将 pip3.8 的软连接命名为 pip。

ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3.8
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip

检测是否安装成功。

python3.8 -V
pip -V

安装虚拟环境

建议安装虚拟环境 virtualenv,当不同项目要求的 python 版本不同时,不会产生冲突。

pip install virtualenv
pip install virtualenvwrapper       # 管理虚拟环境

下载成功后,创建存储虚拟环境的目录。

mkdir ~/.virtualenvs                # 我一般存放在 /root/.virtualenvs,可自行修改

查找 virtualenvwrapper.sh 文件位置,添加环境。

find / -name virtualenvwrapper.sh

编辑 .bash_profile 文件,在末尾添加这两句,其中 source 后的路径为前面查到的路径。

export WORKON_HOME=$HOME/.virtualenvs
source  /usr/local/python3/bin/virtualenvwrapper.sh

保存修改后,更新配置信息。

source ~/.bash_profile 

如果保存时报错,在 /etc/profile 中加入下面内容,再 source

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/python3/bin/virtualenv

创建虚拟环境

通过 -p 指定使用的Python版本,创建成功后自动进入该虚拟环境。

mkvirtualenv -p python3.8 django        # django为虚拟环境名称

如果你希望将当前虚拟环境安装的所有插件配置到新虚拟环境中,可以执行:

pip freeze > requirements.txt           # 导出依赖
pip install -r requirements.txt         # 进入新虚拟环境后再执行

虚拟环境的其它常用命令

  • 查看创建的全部虚拟环境:workon
  • 使用某一虚拟环境:workon 虚拟环境名称
  • 退出当前虚拟环境:deactivate
  • 删除虚拟环境:rmvirtualenv 虚拟环境名称 记得退出再删除

虚拟环境中安装 Django 和 uWSGI

uWSGI 可以理解为服务器上持续运行 Django 的代理服务器,用于与 Django 后端进行数据传输等,后续配置需要使用。

进入前面创建的虚拟环境,安装。

pip install django==3.2         # 可指定版本
pip install uwsgi

uWSGI 要安装两次,一次在虚拟环境中,另一次退出虚拟环境进行安装

创建 uWSGI 的软链接。

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

安装 Nginx

Nginx 是 Http 反向代理 web 服务器,同时也提供 IMAP/POP3/SMTP 服务,占用内存少,并发能力强。在这里我们只需要了解,Nginx 能帮我们在指定端口跑我们的项目就好了。

yum install nginx

安装成功后,相关的文件存储路径为

  • 安装成功后,默认的网站目录为 /usr/share/nginx/html
  • 默认的配置文件为 /etc/nginx/nginx.conf
  • 自定义配置文件目录为 /etc/nginx/conf.d/

在启动之前,还需确保服务器的相关端口已打开。http 对应 80 端口,https 对应 443 端口。一般在云平台租的服务器,可以在控制台中的防火墙处开启相应端口。我的设置可供参考。

接下来启动 Nginx

systemctl start nginx

启动成功后,浏览器搜索服务器 IP 地址,就能访问到 Nginx 主页了。

部署项目

上传项目

Django 后端项目文件,直接上传至服务器即可。Vue 框架写的前端,需要使用 npm run build 命令进行打包,再将生成的 dist 目录上传。

这里推荐软件 FileZilla,用于本地与服务器文件传输十分方便。

配置 uWSGI

新建文件 uwsgi.ini,我习惯放置于 Django 项目的根目录下,用于指定项目路径、最大进程数、运行端口等。我的配置参数可供参考。

[uwsgi]
socket = 127.0.0.1:8080
chdir = /root/Ops/django
wsgi-file = /root/Ops/django/django3/wsgi.py
master = true 
enable-threads = true
processes = 8
buffer-size = 65536
vacuum = true
daemonize = /root/Ops/django/uwsgi.log
virtualenv = /root/.virtualenvs/django
uwsgi_read_timeout = 600
threads = 4
chmod-socket = 664

简要介绍该文件的配置信息:

  • [uwsgi]:必须有这个[uwsgi],不然会报错
  • socket:该端口为后端 Django 的运行端口,可自定义,但须与后面 Nginx 的配置一致
  • chdir:django 项目路径
  • wsgi-file:django 项目的 wsgi.py 文件路径
  • master:开启主进程
  • processes:最大进程数量
  • vacuum:当服务器退出的时候自动删除 unix socket 文件和 pid 文件
  • daemonize:输出日志,有报错时可查看
  • virtualenv:项目虚拟环境路径

切换当前路径到 uwsgi.ini 文件所在目录,启动 uWSGI。

uwsgi --ini uwsgi.ini

使用 ps 命令查看进程,检测是否成功。

ps -aux | grep uwsgi

CSDN图床炸了

配置 Nginx

此处先给出部署域名的样例,仅服务器 IP 以后再给出。

首先,删除 /etc/nginx/nginx.conf 文件中 server{...} 部分的代码。当然,如果怕出错,也可先将原本的 nginx.conf 文件备份一下。

接下来,在 /etc/nginx/conf.d 文件夹中修改默认文件 default.conf(若不存在则新建一个),文件内容如下:

server {
    listen 80;
    listen 443 ssl;
    server_name  zewan.top www.zewan.top;

    location / {
        root /root/Ops/vue/dist;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /api {        
        include /etc/nginx/uwsgi_params;
        uwsgi_pass 127.0.0.1:8080;                                                               
    }

    ssl_certificate /etc/nginx/ssl/zewan.top.crt;
    ssl_certificate_key /etc/nginx/ssl/zewan.top.key;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    ssl_prefer_server_ciphers  on;

    error_page 497  https://$host$uri?$args;
}

简要说明文件内容的作用:

  • listen 后接端口,即设定访问的端口,此处同时开放 80 和 443
  • server_name 为访问域名
  • location / 后描述前端 dist 项目文件夹的存放地址,需根据自身情况修改,注意 dist 即为前端项目的根目录
  • location /api 后为后端项目运行端口,注意 uwsgi_pass 后须与之前 uWSGI 的配置保持一致
  • ssl_certificate[_key] 为 SSL 证书存储路径

重要提醒

采用 location /api 与 uWSGI 连接,最终将后端运行在 :443/api/。需保证后端的路由都是 api/*,即 Django 项目的 urls.py 文件所有路由前需加 api/

运行项目

检测 Nginx 配置是否有误,成功后重启 Nginx 服务。

nginx -t                # 测试
nginx -s reload         # 重新加载

注意,若修改了后端 Django 内容或其它内容,须重启 uWSGI 和 Nginx 服务,否则不生效!

ps -ef | grep uwsgi         # 查看uWSGI进程
killall -9 uwsgi            # 用kill方法把uwsgi进程杀死
uwsgi --ini uwsgi.ini       # 重启uwsgi
nginx -s reload             # nginx平滑重启

另外,如果你的项目文件存放于 root 用户目录下,访问网站时可能出现 500 或 403 Forbidden 权限报错,此时需修改 /etc/nginx/nginx.conf,将文件首行的 user nginx 修改为 user root

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务器部署 Nginx + Django + Vue 的相关文章

随机推荐

  • C语言标准库函数qsort(快速排序函数)

    文章目录 一 函数原型 二 函数解析 比较函数 三 手写快排 四 使用qsort 1 对int数组排序 2 对double数组排序 3 对char数组排序 4 对字符串排序 1 char s 2 char s 5 对结构体排序 1 一级排序
  • 简单一行代码解决流读取导致StringBuilder.toString()乱码问题

    今天做上传功能代码读取返回值得时候 StringBuilder toString 出现乱码的情况 在网上找了一堆乱七八糟的办法 繁琐不说 代码还好几行 后来看到String类构造自己就有办法解决这个问题 简单一行代码搞定 在这里记录一下 S
  • 变分推断(Variational Inference)解析

    一 什么是变分推断 假设在一个贝叶斯模型中 x x x为一组观测变量 z z z为一组隐变量 参数也看做随机变量 包含在 z
  • Linux下的TCP&UDP通信作业

    题目描述 一 对于TCP传输 实现客户端发送某特定信息 字符时结束信息传输 断开连接 二 编写程序验证在同一台机器上TCP和UDP能不能同时占用同一个端口进行通信 开始编程 使用vim创建并编辑几个源文件 vim TCPserver c v
  • 由于找不到vcruntime140_1.dll,无法继续执行代码重新安装程序可能会解决此问题。

    出错情况如下 实在着不住了 那些不懂装懂的不要出来祸害人了 又是网上下载vcruntime140 dll放到c盘system32 64文件 这种做法纯属扯淡 vcruntime140 dll文件就是VC 2010的一个文件而已 直接下载运行
  • 序列化理解

    Java序列化 Java提供了一种对象序列化的机制 在该机制中 一个对象可以被表示为一个字节序列 该字节序列包含对象的数据 有关对象的类的信息和存储在对象中数据的类型 将序列化对象写入文件后 可以从文件中读取出来 对且对其进行反序列化 就是
  • 手把手教你配置Pytorch环境并使用(Win10系统下基于Anaconda完成的pytorch1.7.1和torchvision0.8.2的Pytorch深度学习环境搭建)

    概述 1 下载并安装Anaconda 2 在Anaconda Navigator中新建Pytorch虚拟环境 3 配置虚拟环境所需要的torch和torchvision 4 在Pycharm编译环境中使用刚刚建好的Pytorch虚拟环境 详
  • tensorflow兼容处理 tensorflow.compat.v1 tf.contrib

    20201130 问题提出 v1版本中tensorflow中contrib模块十分丰富 但是发展不可控 因此在v2版本中将这个模块集成到其他模块中去了 在学习tensorflow经常碰到tf contrib的代码 一敲就报错 import
  • ME28/ME2L/ME2N增强字段

    导语 用户希望在ME28采购订单审批的时候显示采购订单创建人以及描述 需要通过增强字段来实现 查询了一下SAP有标准的BADI可以进行增强 好像ME28 ME2L ME2N都是通过这里实现 使用不同的展示结构 这里没有深入测试其他事物 仅以
  • 终于弄明白 i = i++和 i = ++i 了

    作者 默辨 来源 https urlify cn Abyuyy 写在前面 前些天看完了JVM的内存结构 自以为自己是懂了 心里想想不就是分线程共享和线程私有嘛 然后又怎么怎么分怎么怎么的嘛 直到遇到了这道题目 说句实话 曾经自己做这种运算题
  • 空间金字塔池化、空洞卷积、深度可分离卷积

    空间金字塔池化 其主要目的是对于任意尺寸的输入产生固定大小的输出 思路 对于不同大小的feature map分成不同大小的块 不同大小的等份 根据具体情况进行设定 然后对每一份进行最大池化 一般是进行最大池化 将池化后的feature ma
  • 项目管理十大知识领域(十)--- 项目采购管理(过程、输入、工具和技术、输出)

    项目管理十大知识领域 十 项目采购管理 1 规划采购管理 输入 项目管理计划 需求文件 风险登记册 活动资源需求 项目进度计划 活动成本估算 干系人等级册 事业环境因素 组织过程资产 工具 自制或外购分析 专家判断 市场调研 会议 输出 采
  • leetcode第一题 :两数之和

    两数之和的哈希表解法 一 题目描述 二 算法思路 1 哈希表的相关说明 2 哈希算法 3 题目讲解 三 题解代码 四 运行结果以及最后的一点点解释 一 题目描述 这里直接贴的leetcode中的题目 哈哈哈 给定一个整数数组 和一个整数目标
  • 深入了解MySQL存储引擎-------InnoDB

    如果想看自己的数据库默认使用的那个存储引擎 可以通过使用命令SHOW VARIABLES LIKE storage engine 一 InnoDB存储引擎 1 InnoDB是事务型数据库的首选引擎 支持事务安全表 ACID 事务的ACID属
  • QT笔记- QListWidget删除item时, 信号QListWidget::currentRowChanged()出现行(索引)错误

    删除QListWidget行或项时 currentRowChanged 信号会在删除前发出 Qt信号QListWidget currentRowChanged int row 在QListWidget当前行号改变时发出 但需注意的是 在使用
  • Spring-IOC容器(控制反转)

    目录 Spring框架图 IOC原理 IOC接口 BeanFactory DI依赖注入 Spring框架图 1 核心层 Core Container 核心容器 这个模块是Spring最核心的模块 其他的都需要依赖该模块 2 AOP层 AOP
  • C++,友元的基本概念以及友元的创建

    一 友元 1 1 友元的基本概念 C 控制对类对象私有部分的访问 通常公有类方法提供唯一的访问途径 但是有时候这种限制太严格 以致于不适合特定的编程问题 在这种情况下 C 提供了另一种形式的访问权限 即友元 友元的种类 友元函数 友元类 友
  • 【软考】-高项-立项管理-重要知识点思维导图

    高项 立项管理 项目立项管理 项目立项包括4个阶段 项目建议与立项申请 含义 作用 项目建议书内容 初步可行性研究 详细可行性研究 内容 评估与决策 7个步骤 可行性研究 内容 可研报告中的开发总成本 经营成本 非经营成本 项目立项管理的作
  • Python判断一个数是否为素数

    Python判断一个数是否为素数 定义一个函数 用来判断一个数 是否为素数 函数名 isPrime 参数 数值n 返回值 布尔类型结果 def isPrime n flag True for i in range 2 n if n i 0
  • 服务器部署 Nginx + Django + Vue

    服务器部署 Nginx Django Vue 服务器预设 租服务器 SSH 远程连接 配置公钥 更新系统软件包 配置 Django 安装 python3 8 4 安装虚拟环境 创建虚拟环境 虚拟环境中安装 Django 和 uWSGI 安装