Python + Django4 搭建个人博客(二十):阿里云部署博客项目

2023-11-16

本篇我们将完成我们搭建个人博客的核心功能的最后一篇:部署上线。

接下来部分我们将不定期更新一些其他的博客功能,比如:文章栏目,消息通知,用户扩展等小功能模块。


目录

准备服务器

安装Xshell 和Xftp

服务器安装软件

安装Mysql

修改Django项目配置文件

传输Django项目到服务器

Nginx配置

准备后台用户及启用Gunicorn

测试及运行


本文我们将利用Nginx和Gunicorn实现网站项目在阿里云上面实现Django项目的在线部署。

开发时我们用的是 Django 自带的开发服务器,但那个性能太差了,不可能用到线上环境。所以线上部署时,我们不仅要安装 Django,还要安装 Nginx 和 Gunicorn,这三兄弟的工作流程如下:

  • 客户端发来 http 请求,Nginx 作为直接对外的服务器接口,对 http 请求进行分析
  • 如果是静态资源请求,则由Nginx自己处理(效率极高)
  • 如果是动态资源请求,则把它转发给 Gunicorn
  • Gunicorn 对请求进行预处理后,转发给 Django,最终完成资源的返回

部署一个Django项目的步骤大概为如下:

  • 准备服务器(打开80端口)
  • 准备远程连接服务器和传输文件相关工具(Xshell和Xftp)
  • 安装Python,Nginx,Mysql
  • 创建数据库
  • 修改Django项目配置文件
  • 传输Django项目到服务器
  • 安装项目Requirements.txt中包含的相关的Python包
  • 收集静态资源
  • 配置Nginx相关代理参数
  • 安装并启用Gunicorn
  • 测试运行

准备服务器

本文采用阿里云,阿里云服务器可以试用一个月,我们以试用服务器为例来实现项目的部署。

在开通服务的界面,其他的可以随便填,操作系统我们采用Ubuntu 22.04 64位版本。

开通的时候我们选择仅操作系统,先不预装其他应用。

开通后进入管理实例界面,可以看到我们最关键的字段内容,公网IP:39.107.240.223

然后重置下我们的实例密码(否则登录服务器的时候默认会使用秘钥)

接着检查下我们的安全组内的入方向端口,至少需要80和22端口是打开的。

安装Xshell 和Xftp

Xshell和Xftp都是 NetSarang 开发的远程工具。

  • Xshell可以远程连接并控制服务器
  • Xftp可以远程传输文件到服务器

下载地址如下,个人使用使用免费版就行了。

家庭/学校免费 - NetSarang Websitehttps://www.xshell.com/zh/free-for-home-school/

安装好软件之后,我们首先打开Xshell,新建一个会话,主机输入我们前面阿里云的公网地址。

选择用户身份验证,输入登录用户名和密码后点击连接按钮,完成登录。

Xftp和Xshell的安装和登录方式几乎一样,这里就不做特别介绍了。

服务器安装软件

安装软件之前,我们先升级下系统内库的版本,防止系统版本过旧导致问题。

~$ sudo apt-get update
~$ sudo apt-get upgrade

安装必要的软件:Nginx,Python,PIP,同时 PIP 安装了Python虚拟环境virtualenv库。

~$ sudo apt-get install nginx
~$ sudo apt-get install python3
~$ sudo apt-get install python3-pip
~$ sudo pip3 install virtualenv

安装Mysql

sudo apt install mysql-server

检查运行状态

sudo systemctl status mysql

安装完成后使用命令直接root用户登录

sudo mysql

(在MySQL 8.0上,root 用户默认通过auth_socket插件授权,无法使用密码登录,修改密码后才能启用密码登录。)

然后在mysql命令界面输入下面两条命令修改root用户的密码为你的最新密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';

mysql> FLUSH PRIVILEGES;

退出mysql:

mysql> exit

然后检查下使用root密码登录是否成功:

mysql -u root -p

如下界面代表登录成功。

顺手我们把数据库也一起创建了(名字和我们本地创建的一样就好了):

mysql> CREATE DATABASE IF NOT EXISTS django_blog DEFAULT CHARSET utf8;

修改Django项目配置文件

部署项目到线上去的话,我们需要修改下配置文件django4blog/settings.py

DEBUG = False

ALLOWED_HOSTS = ['*']

# 静态文件收集目录
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')

主要涉及3点:

  • 部署时要关闭调试模式,避免安全性问题(此时 Django 就不再处理静态资源了)。
  • ALLOWED_HOSTS指明了允许访问的服务器名称或 IP,星号表示允许所有的请求。实际部署时请改成你的域名或 IP,比如ALLOWED_HOSTS = [ '127.0.0.1']。
  • 项目中有很多静态文件,部署时需要找一个地方统一收集起来,也就是STATIC_ROOT指定的地址了,指定了这个地址后,Django在部署的时候可以通过命令将所有的(包括Django自带的Admin页面相关)静态资源(css,js等)全部收集到指定文件夹,便于我们在部署的时候统一加载。

接着我们需要修改下配置解决在线部署的跨域问题:

先PIP安装一下包django-cors-headers

pip install django-cors-headers

然后修改下配置文件django4blog/settings.py

INSTALLED_APPS = [
    ......
    'corsheaders',  #解决浏览器跨域问题
    ......
]

MIDDLEWARE = [
    ......
    'corsheaders.middleware.CorsMiddleware',  #解决浏览器跨域问题
    'django.middleware.common.CommonMiddleware', #解决浏览器跨域问题
    ......
]

CORS_ORIGIN_ALLOW_ALL = True #解决浏览器跨域问题
CORS_ALLOW_CREDENTIALS = True #解决浏览器跨域问题

SECURE_CROSS_ORIGIN_OPENER_POLICY = 'None'  #Django4 特定解决浏览器跨域问题

另外,如果我们服务器数据库密码和本地的数据库密码不一致,我们可以提前修改下配置文件的参数:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'django_blog', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'newpassword', # 数据库密码 修改为服务器数据库密码
    }
}

最后我们将我们本地项目需要用到的库列一个清单,以便在服务器上统一安装。

在本地虚拟环境中输入命令:pip freeze > requirements.txt

(env) E:\django_project\django4blog>pip freeze > requirements.txt

得到库清单文件requirements.txt

传输Django项目到服务器

本地项目参数修订好之后,我们登陆Xftp,直接将本地项目文件夹django_project复制到服务器

回到Xshell的服务器操作界面,进入我们的项目文件夹django_project

cd django_project

接着在服务器生成虚拟环境:

virtualenv --python=python3.10 myenv

进入虚拟环境:

source env/bin/activate

进入到django4blog项目文件夹:

cd django4blog

输入如下命令安装项目必要的Python库。

(env) ../django4blog# pip3 install -r requirements.txt

如果在命令pip3 install -r requirements.txt的时候出现如下错误。

是因为本地的tzdata库的版本太高,阿里的镜像版本目前只支持到2022.4,这时我们可以直接修改requirements.txt内的tzdata的版本为2022.4。

Ubuntu修改文件命令如下:

vi requirements.txt,打开文件

按Insert或者i键,可以开始修改文件,将tzdata版本修改为2022.4

修改完成后,先按下Esc键,然后输入命令:wq保存并退出文件。

重新执行命令

pip3 install -r requirements.txt

安装成功

接着分别输入如下命令完成静态资源收集和数据迁移。

(env) ../django4blog# python3 manage.py collectstatic
(env) ../django4blog# python3 manage.py migrate

至此,我们部署针对开发和代码这部分的工作已经结束了。

Nginx配置

接下来就是启用Nginx并配置相关代理。

首先我们把Nginx的默认配置和连接文件default先删除。

分别进入/etc/nginx/sites-available/etc/nginx/sites-enabled两个文件夹输入命令:

sudo rm -r default删除default文件。

然后我们进入/etc/nginx/sites-available新建一个我们自己的配置文件:django4blog

(myenv) root.../etc/nginx/sites-available# cd /etc/nginx/sites-available
(myenv) root.../etc/nginx/sites-available# vi django4blog

输入如下配置内容:

server {
  charset utf-8;
  listen 80;
  server_name 39.107.240.223;  # 改成你的 IP

  location /static {
    alias /root/django_project/django4blog/collected_static;
  }

  location / {
    proxy_set_header Host $host;
    proxy_pass http://unix:/tmp/39.107.240.223.socket;  # 改成你的 IP
  }
}

 :wq 保存退出后输入命令

sudo ln -s /etc/nginx/sites-available/django4blog /etc/nginx/sites-enabled

接着检查下Nginx的配置文件的用户信息:

这个用户改成root,否则可能会报403权限错误。

cd /etc/nginx# vi nginx.conf 修改用户为root

最后刷新下Nginx配置信息:

sudo service nginx reload

准备后台用户及启用Gunicorn

先回到项目所在的目录cd django_project/django4blog,并且进入虚拟环境,输入命令创建一个超级账户:

python manage.py createsuperuser

然后安装gunicorn:

pip3 install gunicorn

启动gunicorn,注意修改为自己的公网地址和自己的项目名称。

gunicorn --bind unix:/tmp/39.107.240.223.socket django4blog.wsgi:application

测试及运行

回到本地系统中,在浏览器输入地址:首页

成功运行!!

接着我们登录后台Log in | Django site admin ,添加几条数据。

回到首页

阅读文章详情页

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

Python + Django4 搭建个人博客(二十):阿里云部署博客项目 的相关文章

  • 在Python中如何获取字典的部分视图?

    是否有可能获得部分视图dict在Python中类似于pandasdf tail df head 说你有很长一段时间dict 而您只想检查某些元素 开头 结尾等 dict 就像是 dict head 3 To see the first 3
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • 编辑 Jupyter Notebook 时 VS Code 中缺少“在选择中查找”

    使用 Jupyter Notebook 时 VSCode 中缺少 在选择中查找 按钮 它会减慢开发速度 所以我想请问有人知道如何激活它吗 第一张图显示了在 python 文件中的搜索 替换 第二张图显示了笔记本电脑中缺少的按钮 Python
  • 使用 Python 计算 Spark 中成对 (K,V) RDD 中每个 KEY 的平均值

    我想与 Python 共享这个特定的 Apache Spark 解决方案 因为它的文档非常贫乏 我想通过 KEY 计算 K V 对 存储在 Pairwise RDD 中 的平均值 示例数据如下所示 gt gt gt rdd1 take 10
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • GradientTape 根据损失函数是否被 tf.function 修饰给出不同的梯度

    我发现计算的梯度取决于 tf function 装饰器的相互作用 如下所示 首先 我为二元分类创建一些合成数据 tf random set seed 42 np random seed 42 x tf random normal 2 1 y
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 如何在 Django 中使每五个帖子成为广告帖子

    我正在尝试允许用户赞助帖子 以便为该帖子带来更多点击量 我想让每五个帖子成为赞助帖子 但如果我尝试在模板中使用可整除并循环浏览广告 那么它将发布all第四个帖子后的广告 这是我尝试过的一些代码 编辑 我已将问题更改为不会显示帖子的问题 有人
  • falcon,AttributeError:“API”对象没有属性“create”

    我正在尝试测试我的猎鹰路线 但测试总是失败 而且看起来我把所有事情都做对了 my app py import falcon from resources static import StaticResource api falcon API
  • 从 S3 提供 Django 的静态文件和媒体文件

    我遇到了一个奇怪的问题 我不知道是什么原因造成的 这是我当前的配置 使用Heroku MEDIA URL media STATIC URL static STATICFILES DIRS os path join PROJECT DIR s
  • 导入错误:无法导入名称“时间戳”

    我使用以下代码在 python 3 6 3 中成功安装了 ggplot conda install c conda forge ggplot 但是当我使用下面的代码将其导入笔记本时 出现错误 from ggplot import Impor
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du
  • python 中的 after() 与 update()

    我是 python 新手 开始使用 tkinter 作为画布 到目前为止 我使用 update 来更新我的画布 但还有一个 after 方法 谁能给我解释一下这个函数 请举个例子 两者之间有什么区别 root after integer c

随机推荐

  • Java多线程程序:多线程模拟抢票

    public class BuyTicket extends Thread public static int tickets 20 Override public void run while sale synchronized publ
  • 【精华】经典的图像数据集介绍

    目录 1 经典的数据集介绍 1 1 ImageNet 1 2 PASCAL VOC 1 3 Labelme 1 4 COCO 1 5 SUN 1 6 Caltech 1 7 Corel5k 1 8 CIFAR Canada Institud
  • angular学习之路(一)开山篇

    1 ng app 定义angularJS的使用范围 2 ng init 变量 值 变量 值 初始化变量的值 有多个变量时 中间用分号隔开 3 ng model 变量 定义变量名 4 ng bind 变量 绑定变量名 获取该变量的数据 这里的
  • underlay和overlay? & 传统网络和数据中心网络 ?

    underlay和overlay 百度 Underlay 和 Overlay 是网络架构中两个常用的概念 用于描述不同层次或视角下的网络结构和通信方式 1 Underlay 底层网络 Underlay 是指基础网络层 即物理网络或基础网络架
  • B站马士兵python入门基础版详细笔记(5)

    前言 这是这篇文章是B站学习python入门基础班的视频的第五章内容 主要讲述的是循环结构 主要包括while语句和for in语句 一 range函数 这个函数生成的是一个整数序列 他的返回值是一个迭代器对象 所以直接print它是没有用
  • java gc 次数_JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数...

    一 JVM的分区 1 程序计数器 私有 程序计数器是一块较小的内存分区 你可以把它看做当前线程所执行的字节码的指示器 在虚拟机的概念模型里 字节码解释器工作时 就是通过改变计数器的值来选择下一条需要执行的字节码指令 程序技术器为线程私有 每
  • UNet3+详解

    目录 1 UNet3 解决的问题 1 UNet 2 UNet 2 UNet3 的创新点 3 UNet3 的结构体 1 编码层 2 解码层 a 跳跃连接 b 分类引导模块 CGM c 特征聚合机制 d 深监督 e 混合损失函数 4 UNet3
  • Supervisor使用备忘

    为什么要用Supervisor 从这里说起 服务器端要将程序以daemon运行 其目的是摆脱控制终端的信号影响 以免进程退出 Daemon化流程 int daemonize pid t pid fork if pid 0 exit 0 if
  • 更改Ansys Workbench的语言的方法

    如果没有学过日文 安装Ansys Workbench后出现如下界面 一定会感到很无助 如何把它改为英文界面呢 按下面步骤来 1 点击第三个菜单 2 再点击下拉菜单中的最后一个菜单 如下 3 在弹出对话框中 点击左边的第三项 图中红色矩形框框
  • 零基础学Java,最开始应该学什么?

    Java的知识面太广了 这里整理了一个思维导图 不是很全面 但足够硬核 先学最重要的 从浅到深 能够让你快速地学好Java 一 两个学习阶段 在介绍如何学好Java前 我们先把学习路线定一下 我把这个过程分成两个阶段 第一阶段 打好基础 先
  • MarkDown 高级操作

    目录 1 图片处理 2 插入音乐 3 插入视频 4 在页面内跳转 5 插入跳转链接 用新的窗口打开 6 设置不同的字体颜色 7 设置不同类型的字体 8 使用标准字体 9 添加背景色 10 多种矩阵形式输入 10 1 不带括号的 10 2 带
  • ue4中Pak文件中挂载的资源名称获取

    在pak文件中 会挂接很多资源 api也在变化 废话不多说 上代码 FPakPlatformFile GetPakPlatformFile FPakPlatformFile pakPlatformFile nullptr auto plat
  • 概念学习—机器学习

    概念学习 介绍 概念学习 假设的一般到特殊序 Find S 寻找极大特殊假设 变型空间和候选消除算法 表示 更简明的表示 关于变型空间和候选消除的说明 候选消除算法是否会收敛到正确的假设 归纳偏置 介绍 定义 概念学习是指从有关某个布尔函数
  • H.264的Slice及Slice类型

    一 基本概念 一个视频图像可编码成一个或更多个条带 每个条带包含整数个宏块 MB 即每个条带至少一个MB 最多时每个条带包含整个图像的宏块 总之 一幅图像中每个条带的宏块数不一定固定 设条带的目的是为了限制误码的扩散和传输 应使编码条带相互
  • 网络安全渗透测试之pingtunnel使用实验

    目录 一 实验环境准备 二 安装pingtunnel 一 在192 168 101 105 web服务器上安装pingtunnel 三 建立ICMP隧道 一 在web服务器上启动pingtunnel 二 在kali上设置转发 三 隧道渗透演
  • 白盒测试(程序流程图)

    白盒测试又称结构测试 透明盒测试 逻辑驱动测试或基于 代码的测试 白盒测试是一种 测试用例设计方法 盒子指的是被测试的 软件 白盒指的是盒子是可视的 你清楚盒子内部的东西以及里面是如何运作的 白盒 法全面了解程序内部逻辑结构 对所有逻辑路径
  • CBC模式解读

    一 什么是CBC模式 CBC模式的全称是Cipher Block Chaining模式 密文分组链接模式 之所以叫这个名字 是因为密文分组像链条一样相互连接在一起 在CBC模式中 首先将明文分组与前一个密文分组进行XOR运算 然后再进行加密
  • LM算法初识

    由于工作内容接触到点云标定 需要用到最小二乘法 所以特意花了点时间研究LM算法 但是由于大学的高等数学忘得差不多了 所以本文从最基本的一些数学概念开始 信赖域法 在最优化算法中 都是要求一个函数的极小值 每一步迭代中 都要求目标函数值是下降
  • canvas系列教程之填充颜色

    艺术离不开色彩 今天咱们来介绍一下填充颜色 体会一下色彩的魅力 填充颜色主要分为两种 基本颜色 渐变颜色 又分为线性渐变与径向渐变 我们一个个来看 填充基本颜色 Canvas fillStyle属性用来设置画布上形状的基本颜色和填充 fil
  • Python + Django4 搭建个人博客(二十):阿里云部署博客项目

    本篇我们将完成我们搭建个人博客的核心功能的最后一篇 部署上线 接下来部分我们将不定期更新一些其他的博客功能 比如 文章栏目 消息通知 用户扩展等小功能模块 目录 准备服务器 安装Xshell 和Xftp 服务器安装软件 安装Mysql 修改