腾讯云Ubuntu18.04部署Django应用(Django 3)完整教程

项目体验地址:175.27.165.229

目录

一. 任务概述

二. 架构设计

三. 创建和开发Django项目

3.1 创建Django项目

3.2 项目开发

3.2.1 加载文字

3.2.2 静态资源导入

四、Nginx+uWSGI生产级部署

4.1 安装Nginx

扫描二维码关注公众号,回复: 13634975 查看本文章

 4.2 协同部署

 4.3 uwsgi后台运行

五. 小结


一. 任务概述

最近准备将原有Django项目迁移到腾讯云的Ubuntu上面去,以前在部署Django应用的时候主要采用Windows的IIS进行部署。为了便于今后操作,本文详细记录在Ubuntu的部署流程。

二. 架构设计

整体的设计架构图如下所示:

Django 的部署可以有很多方式,采用 nginx + uwsgi 的方式是其中比较常见的一种方式。在这种方式中,我们的通常做法是,将 nginx 作为服务器最前端,它将接收 web 的所有请求,通过负载均衡(如果有多台服务器的话)统一管理请求,同时nginx 把所有静态请求(主要是图片、css样式、字体文件等)自己缓存自己来处理(nginx处理静态文件性能非常强)。接下来,nginx 将所有非静态请求传给 uwsgi 来进行处理。uwsgi可以理解为是支撑django的生产级服务器,稳定性和并发性都非常好。通过这样的两级服务器支持,我们可以极大的提高网站访问的稳定性和访问性能。nginx和uwsgi之间一般处于内网环境,使用socket来代替http进行通信,速度极快。

有人会有疑问,为什么不用django自带的开发服务器然后通过命令行python manage.py runserver来启动呢?这是因为django自带的开发者服务器性能比较差,只能用来调试代码,真实生产级环境中无法满足高并发的要求。

三. 创建和开发Django项目

开发环境:Django3.2.10、Python3.6

远程登录软件:基于SSH 的MobaXterm

云服务器:Ubuntu server18.04

3.1 创建Django项目

Django是一个基于Python的Web框架,使用Django可以方便、快捷的创建网站等网络应用。本文仅介绍与本章内容相关的Django部署知识,如果想要深入学习Django的读者可以参考我的Django系列教程或者参考我的书籍《python web开发从入门到实战

首先安装Django:

pip3 install django==3.2.10

然后我们创建Django项目,项目名称为blog:

python3 /home/ubuntu/.local/lib/python3.6/site-packages/django/bin/django-admin.py startproject blog

上述命令注意要找到云服务器上django的安装路径,可以参考上面给出的路径。

此时会自动创建photoweb项目,进入该项目:

cd blog

接下来为该项目创建一个应用:

python3 manage.py startapp app

打开blog/blog/settings.py文件,添加应用同时放开访问权限:

ALLOWED_HOSTS = ['*',]

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',# 添加应用
]

接下来可以启动项目:

python3 manage.py runserver 0.0.0.0:8000

此时,我们可以通过公网ip远程访问这个开发者服务器:http://175.27.165.229:8000/

正常情况下会出现下图所示界面:

说明此时我们在腾讯云上成功创建了一个最简单的示例网站,并且可以简单访问了。

如果上述步骤没有成功,那么需要查看购买的云服务器上8000端口是否已放开,需要登录云服务器控制台将端口开通。每个云服务器提供商对于端口的开通情况不一致,我在使用腾讯云的时候没有这个问题,百度云需要自己开通8000端口。

3.2 项目开发

本小节我们继续加强我们的django应用,最终实现一个基本的个人站点,可以多页面显示和数据库访问。由于需要远程编辑代码,这里推荐使用VS Code的远程调试功能,比较方便编辑代码。

3.2.1 加载文字

打开blog/app/views.py文件,添加视图接口函数:

from django.shortcuts import render

# Create your views here.
def home(request):
    return render(request,'home.html')

这里我们希望通过render函数直接渲染home.html页面。

我们在app文件夹下新建名为templates的子文件夹,然后在templates文件夹中添加对应的home.html文件,这个文件可以随便从网上下载一个html网站模板即可,我们后面会讲解如何对其修改使得django能够正常渲染。这里我们先把免费的html网站首页的html文件拷贝到templates文件夹中然后修改名称为home.html即可。

为了能够顺利的访问图片等静态资源,我们在app目录下创建static文件夹,然后将网站对应的静态资源(css、js、img等)拷贝到该static文件夹下面。

最终完整目录如下所示:

 接下来我们为新添加的视图处理函数添加对应的路由,打开blog/urls.py文件,添加路由如下:

from app.views import home
urlpatterns = [
   ...其它路由...
    path('', home, name='home'),
]

这里默认使用根网址。保存所有修改后启动项目:

python3 manage.py runserver 0.0.0.0:8000

 然后通过外网访问这个网站:

http://175.27.165.229:8000/

效果如下所示:

 可以看到页面文字都显示出来了,但是页面的静态资源文件没有加载成功,下面我们继续完善。

3.2.2 静态资源导入

前面已经将网站需要的css、图片等静态资源放在了app/static目录下面。首先我们要做的就是确定部署环境时的静态资源路径。

打开settings.py文件,添加代码如下:

import os
STATIC_URL = '/static/'
STATIC_ROOT= os.path.join(BASE_DIR,'static')

接下来我们进行静态文件迁移(把app下的static静态资源统一迁移到根目录下的static文件夹中):

python3 manage.py collectstatic

正常情况下效果如下:

 接下来修改html模板,主要修改如下:

(1)头部静态标签引入

在html头部引入静态资源标签,类似于java web的jsp语法:

{% load static %}

注意,这里我们采用的是django3进行部署,如果是django2,那么需要采用下面的语法:

{% load staticfiles %}

(2)静态资源引用

修改所有静态资源引用的地方,主要包括js、css、img等的引入,具体示例如下:

  • css文件
<link rel="stylesheet" href="css/bootstrap.min.css" />

替换为:

<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" />
  • js文件
<script src="js/jquery-1.11.0.min.js"></script>

替换为:

<script src="{% static 'js/jquery-1.11.0.min.js' %}"></script>
  • img图片:
<img src="img/01.jpg" alt="Image 1" class="" />

替换为:

<img src="{% static 'img/01.jpg' %}" alt="Image 1" class="" />

改完以后重新启动,刷新页面,可以看到效果如下所示:

 所有效果和样式都已经正常了。这里我们就在云上基于开发者服务器部署完了。

四、Nginx+uWSGI生产级部署

目前,我们使用的django是采用其默认的开发者服务器进行部署的,这种部署方式不适合高并发需求,稳定性较差。本小节我们将采用nginx + uwsgi 来进行生产级部署。

4.1 安装Nginx

sudo apt-get install nginx

安装好后我们可以检测下nginx版本号:

nginx -v

效果如下所示:

 接下来启动nginx:

sudo service nginx start

启动后nginx默认会开启一个站点,端口在80。我们可以通过外网访问:175.27.165.229:80/

出现下图所示表示启动成功:

 4.2 协同部署

首先安装uwsgi:

sudo pip3 install uwsgi

然后在 Django 项目根目录下新建一个 uWSGI 的配置文件 uwsgi.ini:

cd blog
touch uwsgi.ini 

接下来打开刚刚创建好的配置文件 uwsgi.ini 添加如下配置:

[uwsgi]

socket = :8888
chdir           = /home/ubuntu/code/blog
module          = blog.wsgi
master          = true
processes       = 1
vacuum          = true

接下来配置Nginx。

Nginx 默认的配置文件都在 /etc/nginx 目录下,我们需要进入 /etc/nginx/sites-available 目录下进行配置 default 文件。

首先将原有配置文件进行备份,并打开 nginx 配置文件

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
sudo vim /etc/nginx/sites-available/default

删掉原先的内容,添加配置如下:

server {

    listen          80; 
    server_name     175.27.165.229;
    charset         UTF-8;
    access_log      /var/log/nginx/blog_access.log;
    error_log       /var/log/nginx/blog_error.log;

    client_max_body_size 75M;

    location / { 

        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8888;
        uwsgi_read_timeout 10;
        #uwsgi_max_temp_file_size 0;	# 禁用临时文件缓冲器
    }   

    location /static {

        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /home/ubuntu/code/blog/static;
    }   
}

上述配置不难分析,nginx本身配置在80端口,用于接收所有从80端口来的请求。然后转发给uwsgi对应的8888端口。如果是静态资源,则直接使用nginx进行返回(location /static指明了静态文件路径)。

现在重新启动 nginx:

sudo service nginx restart

然后启动uwsgi。具体的通过 uwsgi 命令读取前面创建的 uwsgi.ini 文件启动项目:

sudo uwsgi --ini uwsgi.ini

注意这里的ini文件里面我们把uwsgi的启动端口设置为了8888。

正常状态内容如下所示:

 注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

到这里我们就基本部署完成了。

这个时候我们通过外网访问http://175.27.165.229/ 进行测试。效果如下图所示:

 可以可以正常访问文字页面,但是css、图片等静态资源没有加载进来。

我们可以查看nginx错误日志,位于/var/log/nginx/blog_error.log,打开后内容如下所示:

2022/01/01 22:22:48 [error] 11674#11674: *41 open() "/home/ubuntu/code/blog/static/slick/slick.min.js" failed (13: Permission denied), client: 112.22.88.175, server: 175.27.165.229, request: "GET /static/slick/slick.min.js HTTP/1.0", host: "175.27.165.229", referrer: "http://175.27.165.229/"
2022/01/01 22:22:48 [error] 11674#11674: *42 open() "/home/ubuntu/code/blog/static/jquery.magnific-popup.min.js" failed (13: Permission denied), client: 112.22.88.175, server: 175.27.165.229, request: "GET /static/jquery.magnific-popup.min.js HTTP/1.0", host: "175.27.165.229", referrer: "http://175.27.165.229/"

可以看到所有静态资源请求均提示Permission denied,这是nginx权限问题。我们使用下面的命令查看当前nginx权限用户:

ps aux | grep "nginx: worker process"

可以看到我们当前id=11674工作的nginx用户名是www-data,并不是ubuntu(腾讯云ubuntu系统默认账户名为ubuntu),因此我们需要将nginx的工作用户改为ubuntu即可。

具体操作如下:

sudo su
cd /etc/nginx
vim nginx.conf

在打开的文件里面将user www-data; 修改为 user root;即可。

然后重新加载nginx:

nginx -s reload

接下来我们重新访问,即可看到页面如下:
 

 到这里图片和css样式等都能准确加载了。

 4.3 uwsgi后台运行

最后,我们还遗留了一个问题。我们是采用远程ssh方式启动uwsgi的,一旦我们的ssh关闭,会发现这个启动的uwsgi也就关掉了。因此,我们希望通过ssh将uwsgi启动并能够在后台一直运行。

我们可以使用下面的命令启动uwsgi并且能够在后台运行:

sudo uwsgi -d --ini uwsgi.ini

这个时候我们关掉ssh,可以看到网站依然可以访问。

如果我们想要关掉已经在后台运行的uwsgi,那么可以使用下面的方法:

首先查询当前所有正在运行的uwsgi:

ps -ef|grep uwsgi

效果如下:

  其中第2列表示进程号,我们可以直接将其kill掉:

sudo kill -9 23559

五. 小结

本文主要讲解如何在腾讯云的ubuntu上实现django的生产级部署。由于水平有限,本文难免有错误或不当的地方,请读者予以指正。

猜你喜欢

转载自blog.csdn.net/qianbin3200896/article/details/122241082
今日推荐