CentOS 7 下Django项目部署(基于uwsgi和Nginx)

本文主要介绍如何在Linux平台上部署Django相关项目,关于Django项目的部署在互联网论坛上有不少的资料,笔者在查阅众多资料并通过实践后发现结果并不如意(或多或少老是遇到一些问题,每每与资料的预期不相符)。在浏览了许多资料后笔者整理得出了部署Django项目的通常性方法,部署的方法有不少种,在此笔者选择了较为经常使用的基于uwsgi和Nginx的部署方案。python

1、前提准备

部署前主要是须要作一些与服务器相关的准备工做,本次教程的服务器采用了阿里云的 CentOS 7.3 64位,固然做为资料学习你们也可以使用Linux虚拟机进行部署。另外,为了方便的Linux的使用和部署操做,在此推荐你们安装XSHELL(https://www.netsarang.com/en/xshell/)和XFTP(https://www.netsarang.com/en/xftp/),XSHELL主要是用于链接服务器并进行终端操做,而XFTP则可用来进行服务器与开发主机的文件传输(好比windows和linux间的传输)。mysql

在此还须要注意的是,若是你们和我同样使用阿里云服务器,那么在部署前还须要留意一下设置相应的网络安全组,这个安全组主要是用于设置外网对服务器端口的访问权限,因为阿里云服务器中有的端口默认未开启被访问,因此为了可以让外网访问到部署的项目(好比Django网站),那么就须要开启相应的端口(好比80端口)。安全组设置可在阿里云控制台(https://ecs.console.aliyun.com/)的服务器实例中查看到,以下左边功能栏的【本实例安全组】,点击进入后可在安全组列表中查看到相关规则设置,点击【配置规则】后即可进行端口访问权限的设置(好比下图中新设置的80和8000端口)。linux

2、部署所须要安装软件的清单

本篇采用uwsgi和nginx的部署方案,所以在Linux环境下咱们须要预先安装好如下软件,不过在此只作简单的描述,读者们有一个概念性的印象即可(若是想要深刻理解可自行学习相关资料),各个软件具体的安装方法和使用操做将在后文一一讲述。nginx

  • Python:因Lunix系统默认安装了python2版本,但因为如今的Django项目主流是采用python3开发,所以咱们还须要在服务器中安装好python3的版本,并配置相关的环境变量以便在终端的直接使用。对于Linux下python3环境的安装与搭建这一部分,限于篇幅,在此不进行阐述,各位读者能够到互联网上查询相关的资料。
  • uwsgi:uwsgi是一个基于python的应用服务器,它可充当网络请求中文件的传输,也能够用于启动Django项目。在咱们的Django项目部署中,通常让其充当非静态文件的资源访问中间服务器,外网能够借助于它来访问Django项目的非静态文件资源。固然,uwsgi也能够传输静态资源,但在这一点上其性能并不高。
  • nginx:nginx是一个高性能的HTTP和反向代理web服务器,它主要负责转发外网的端口访问请求,好比它可转发80端口至uwsgi进程以访问相关网站,而两者之间的联系可经过socket进行关联。另外因为nginx转发性能之高,也能够用来作相关服务器,在Django项目中若是说uwsgi充当非静态资源的中间服务器,那么nginx充当的角色即是静态资源的中间服务器,它能够经过转发特定的静态http 请求来让外网访问到Django的静态文件资源。
  • supervisor:supervisor是一个进程管理工具,可经过fork/exec的方式将这些被管理的进程看成supervisor的子进程来启动,而且当监听的子进程异常中断时,它还能够捕获到相关信息并进行异常处理(好比从新启动子进程)。在Django项目中,因为uwsgi命令行启动Django项目是依赖于uwsgi进程的,当进程结束后Django项目也随之结束,所以部署时咱们能够把“启动Django项目”的进程(好比uwsgi进程)做为supervisor的一个子进程,并开启supervisor服务,以便在终端断开后对部署进行监听与管理。在supervisor中,包括supervisord和supervisorctl两部分,前者为核心功能模块,充当命令行命令功能,然后者则是一个控制台(相似于mysql控制台),亦可对进程进行管理。

总的来讲,以上几个模块在Django项目中的关系可表述为下图:web

以上为部署项目最基本的软件需求,具体的软件环境还须要结合实际状况进行配置(好比一些项目可能须要mysql、memcache和redis等环境,那么还须要进行相关环境的搭建)redis

3、正式部署

本次部署工做分为两个环节——开发主机和服务器主机,开发主机主要负责项目的开发与调试,确保项目质检合格后方可在服务器主机中进行部署与运维操做。sql

(一)开发主机

在此以全新的Django 3.0项目为例进行阐述,并预先建立好了一个测试用的testapp,其主要是用于展现一个测试网站首页,总体项目架构以下图所示:shell

1. 测试Django项目

开启DEBUG,在终端输入以下命令开启项目,并在浏览器访问127.0.0.1:8000,观察项目是否正常运行数据库

$ python manage.py runserver 0.0.0.0:8000

 

2. 打包项目环境依赖

关闭DEBUG,并在settings,py中设置ALLOWED_HOSTS和STATIC_ROOT两个常量django

  • ALLOWED_HOSTS:用于设置可访问的域名地址,即待部署服务器的域名或公网IP。
  • STATIC_ROOT:用于设置静态资源的收集目录,在服务器项目中经过运行命令可将项目全部的静态资源收集起来以方便后续Nginx的转发访问。

在此,笔者为方便DEBUG的切换,将两种模式下的设置进行了以下整合:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True if DEBUG == True: # 开发模式下容许全部域名访问
    ALLOWED_HOSTS = ['*'] else: # 发行模式下容许访问的域名地址
    ALLOWED_HOSTS = ['XXX.XXX.XXX.XXX'] # …… # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) if DEBUG == False: # 发行模式下设置静态文件收集目录,收集静态文件以便后续 Nginx 的配置
    STATIC_ROOT = os.path.join(BASE_DIR, 'static_dist')

以后运行命令打包项目的虚拟环境依赖,命令完成后在项目根目录下可见到新生成的requirements.txt文件,这里面记录着本项目所依赖的pip包,以便后续在服务器中的安装。

$ pip freeze > requirements.txt

# requirements.txt

asgiref==3.2.3
Django==3.0.3
pytz==2019.3
sqlparse==0.3.0

3. 项目源文件迁移

将项目源文件(不含venv虚拟环境文件夹)经过XFTP传输到服务器中(好比本教程将其迁移至服务器下的’/srv/Django_projects/DjangoDistTest/’目录下)

至此,开发主机的工做已所有完成.

(二)服务器主机(注:该教程中全部Linux命令均在root权限下操做)

1. 安装python3环境和virtualenv虚拟环境管理工具

Linux下Python3环境的安装在此不进行阐述,这里主要讲解virtualenv的安装与使用,同时为方便后文的讲述,假设咱们的python3安装目录为‘/usr/local/python3’。

virtualenv是python的一个虚拟环境管理工具,经过它能够很方便地建立一个python虚拟环境(这里稍微补充一下,虚拟环境是指拷贝式地建立一个与系统python版本如出一辙的python运行环境,但这个环境不包含任何多余的依赖包,咱们能够在这个虚拟环境中根据项目针对性地安装一些依赖包,从而方便python项目的管理并减小包的冗余)。

安装命令

$ pip3 install virtualenv

设置软连接

上文已经说明,软连接是为了将一程序配置为命令以方便Linux直接在终端经过命令行进行操做

$ ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

使用方法

直接在咱们的项目目录下执行相关命令,其中参数’python’指向所拷贝的源python程序

$ cd /srv/django_projects/DjangoDistTest
$ virtualenv --python=/usr/local/python3/bin/python3 venv

2. 安装项目环境依赖并验证

开启虚拟环境,同时检查所安装的包

$ source ./venv/bin/activate
$ (venv) pip list

安装项目依赖包,以后再次查看包若发现已装上所有依赖则表示虚拟环境已搭建好

$ pip3 install -r requirements.txt
 

执行’python manage.py makemigrations’和’python manage.py migrate’进行数据库迁移(若是以前将.sqlite3文件拷贝过来了,那么迁移时可能会不一样,删除.sqlite3文件便可;另外,对于不一样版本的Linux,这一步可能会出现sqlite3文件错误,缘由是系统未安装sqlite3,所以查阅相关资料安装sqlite3便可)

$ (venv) python manage.py makemigrations
$ (venv) python manage.py migrate
 

因为咱们项目如今的DEBUG为关闭状态,考虑到上文中的STATIC_ROOT设置,因此须要收集静态文件资源(关于静态资源路由的设置请参看文末附录)

$ (venv) python manage.py collectstatic
 

以后运再次运行项目,在浏览器中访问网址便可(服务器公网IP:8000或域名:8000)。另外,这里还须要留意一下阿里云安全组是否已经设置好。

3. 安装uwsgi

安装命令

因为uwsgi是基于python编写的,所以咱们能够直接经过pip进行安装(笔者以前在查阅资料时发现有的博主是经过CentOS 的yum进行安装的,不过经实践后操做效果不是那么好,所以仍是推荐使用pip进行安装)。这里须要注意的是,uwsgi因为是经过系统进程来调用,因此要在系统级别中安装,所以咱们须要预先退出虚拟环境再进行安装。

$ (venv) deactivate
$ pip3 install uwsgi
 

创建软连接

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

验证安装

直接使用uwsgi命令行形式开启项目,参数http表示端口号,module表示项目的wsgi文件,home表示所使用的虚拟环境目录

$ uwsgi --http :8000 --module DjangoDistTest.wsgi --home=/srv/django_projects/DjangoDistTest/venv/
 

以后使用浏览器进行访问便可

上面这种经过命令行的方法已经能够启动项目,但若是每次启动项目都输入一长串命令的话会比较费力,所以下面介绍经过ini文件配置的方式启动项目

uwsgi.ini文件配置

在项目根目录下新建ini文件(好比本例中的DjangoDistTest_uwsgi.ini),并输入如下配置信息,以后即可经过运行命令’uwsgi –ini DjangoDistTest_uwsgi.ini’来启动该项目了

# DjangoDistTest_uwsgi.ini
[uwsgi] # Django相关的设置 # 项目根目录
chdir = /srv/django_projects/DjangoDistTest # Django的wsgi文件
module = DjangoDistTest.wsgi # 虚拟环境路径
home = /srv/django_projects/DjangoDistTest/venv/
# 指定端口
http = :8000
# Django 和 uwsgi的相关日志记录位置,注意要预先在项目中新建log文件夹
daemonize = /srv/django_projects/DjangoDistTest/log/uwsgi.log # 进程相关的设置 # 主进程
master = true # 最大数量的工做进程
processes = 10
# socket文件路径,用于与 Nginx 进行通讯
socket = /srv/django_projects/DjangoDistTest/DjangoDistTest.sock # 设置socket文件的权限
chmod-socket = 666
# 退出时是否清理环境
vacuum = true
$ uwsgi –-ini DjangoDistTest_uwsgi.ini
 

4. 安装Nginx

安装命令

Nginx服务能够直接经过yum命令进行安装

$ yum install nginx’
 

验证安装

安装完成之后,使用命令’systemctl start nginx’便可开启nginx服务,以后使用浏览器访问服务器公网ip(即http 80端口),若出现以下界面则表示nginx已成功启动(有的系统可能会出现”Welcome to NGINX!”的欢迎界面,这两种都是能够的,主要与系统版本和配置有关)

$ systemctl start nginx
 

固然,也能够经过命令’systemctl status nginx’查看nginx服务的状态

$ systemctl status nginx
 

此外,还有相对应的restart和stop命令控制重启和中止,后续感兴趣的同窗也能够把Nginx服务设置成开机自动启动。(这里再补充一下下,对于之前版本的CentOS,须要将命令改写成对应的”service nginx XXX”格式)

关联uwsgi和Nginx

在完成好uwsgi和Nginx的安装后,咱们即可经过Nginx配置将两者进行关联,即当外网访问某一端口(好比80端口)时Nginx会自动转发至相应的uwsgi服务器进行处理。这一关联的映射文件存放在’/etc/nginx/conf.d’目录下(新安装的Nginx可能没有该文件夹,须要本身手动建立一下),所以,咱们在该目录下新建相关映射文件DjangoDistTest.conf。(注意下面的server_name填上公网ip或域名)

# DjangoDistTest.conf
upstream DjangoDistTest { # 设置 socket 通讯文件位置
    server unix:///srv/django_projects/DjangoDistTest/DjangoDistTest.sock; } server { # 监听的端口号
    listen 80; # 域名
    server_name XXX.XXX.XXX.XXX; #若是有域名的话,就写上域名,好比"unikfox.cn wwwunikfox.cn XXX.XXX.XXX.XXX"
    charset utf-8; # 最大的文件上传尺寸
 client_max_body_size 75M; # 转发非静态文件请求到Django服务器
    location / { uwsgi_pass DjangoDistTest; # uwsgi_params文件地址
        include /etc/nginx/uwsgi_params; } # 转发静态文件 http 请求
    location /static { alias /srv/django_projects/DjangoDistTest/static_dist; } }

以后从新启动uwsgi和Nginx服务便可,因为上述配置中监听了80端口,所以如今咱们只须要经过在浏览器访问服务器公网ip或域名便可访问Django项目了(而不须要再填写8000端口)

5. 使用supervisor管理进程

上文已经提到,uwsgi是一个进程,它有可能由于某些神秘力量而被迫终止,一旦uwsgi进程退出了那么它所对应的Django项目也就中止了,所以为了不uwsgi的结束风险,咱们可使用supervisor工具进行进程管理,以使当uwsgi异常退出时能自行恢复。

安装方法

使用pip3在系统级中进行安装

$ pip3 install supervisor
 

创建软连接(包括supervisord和supervisorctl两部分)

$ ln -s /usr/local/python3/bin/supervisord /usr/bin/supervisord
$ ln -s /usr/local/python3/bin/supervisorctl /usr/bin/supervisorctl
 

配置文件

接下来,在项目根目录下进行相关的文件配置便可(如本例中的”DjangoDistTest_supervisor.conf”)

# DjangoDistTest_supervisor.conf # supervisor程序名字
[program:DjangoDistTest] # supervisor执行命令
command = uwsgi --ini DjangoDistTest_uwsgi.ini # 项目的目录
directory = /srv/django_projects/DjangoDistTest # 开始的时候等待多少秒
startsecs = 0 # 中止的时候等待多时秒
stopwaitsecs = 0 # 自动开始
autostart = true # 程序挂了后自动重启
autorestart = true # 输出的log文件
stdout_logfile = /srv/django_projects/DjangoDistTest/log/supervisord.log # 输出的错误文件
stderr_logfile = /srv/django_projects/DjangoDistTest/log/supervisord.err [supervisord] # log的级别
loglevel = info # 设置supervisorctl管理员配置
[supervisorctl] # supervisorctl登陆的的地址和端口号,端口号可自定义
serverurl = http://127.0.0.1:XXXX
# supervisorctl的用户名和密码
username = unikfox password = 123456 [inet_http_server] # supervisor的服务器,与上面serverurl的端口号一致
port = :XXXX
# 用户名和密码
username = unikfox password = 123456 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

启动命令

以后即可在项目根目录下使用命令启动supervisor进程

$ supervisord -c DjangoDistTest_supervisor.conf
 

对于进入管理控制台,可以使用以下的命令

$ supervisorctl -c DjangoDistTest_supervisor.conf
 

经常使用的管理命令:

  • status # 查看状态啊
  • start program_name # 启动程序
  • restart program_name # 从新启动程序
  • stop program_name # 关闭程序
  • reload # 从新加载DjangoTest_supervisor配置文件
  • quit #推出控制台

使用'help'可查看supervisorctl所支持的全部命令

固然,除此之外,也还能够经过浏览器访问配置文件中serverurl的方式管理进程

如此一来,Django项目的部署便大功告成啦~完结撒花"o((>ω< ))o" 

这里还须要注意一点的是,重启centOS后如需部署则需手动开启如下两个服务:

  • 开启nginx服务:'systemctl start nginx'
  • 开启相关项目的supervisor:'supervisord -c DjangoDistTest_supervisor.conf'

固然,你们也能够尝试把这两个设置成开机自动启动,这样就不再用每次开机都手动输入命令啦。

 


附录——Django项目中urls.py下静态文件和图标的路由设置

# DjangoDistTest/urls.py
from django.contrib import admin from django.urls import path,include # 处理网站图标
from django.views.generic.base import RedirectView # 处理静态文件的访问
from django.views import static from django.conf import settings from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), path('', include('testapp.urls')), url(r'^favicon.ico$', RedirectView.as_view(url=r'static/images/icon.ico')), #网站图标 ] + [ url(r'^static/(?P<path>.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static') #静态资源,只适用于DEBUG为False的状况 ]

 


以上即是本次的《CentOS 7 下Django项目部署(基于uwsgi和Nginx)》,Django项目的部署方式不止本案例一种,有关更多的部署方式你们能够查阅相关网络资料,重要的是,只要适合本身的方式那它就是好的方式。

关于本教程,如各位读者有一些疑问、想法或是更好的看法,欢迎留言交流与分享。

相关文章
相关标签/搜索