前期本人完成了“编写你的第一个 Django 应用程序”,有了一个简单的项目代码,在本地window系统自测没问题了,接下来就想办法部署到服务器上,可以通过公网访问我们的Django项目。将开发机器上运行的开发版软件实际安装到服务器上进行长期运行,这是使用 Django 框架进行开发的的最后一个环节,也是非常重要的一部分。

本人在把Django项目部署到服务器过程中,发现对于新手来说还是比较难的,百度上实际可用的项目部署参考文档凤毛麟角,绝大多数参考文档支离破碎,并不能真正指导一个新手完成一个项目的完整部署。为方便新手们顺利完成项目部署,本人参考了许多文档资料,将一个Django项目在云服务器上的部署全过程整理成详细部署文档,希望能够对项目新手提供一些实际可用的帮助,总体部署是基于:centos7+nginx+uwsgi+python3+django 之上做的。。

在实际的工作中,线上环境的服务器主机大部分都购买自阿里云亦或是腾讯云(大型互联网企业都是自己的服务器集群,而对于中小型公司来说成本太高,所以一般都采用购买云服务主机的方式)它们是现在主流的云虚拟主机提供方,如果你想自己搭建一个网站在线上环境下运行,你除了需要一个域名外还要有一台云虚拟机用来部署你的项目,这些大家可以自行了解。

一、云服务器前提环境条件:

根据在本地window系统下开发环境,在服务器上也要保持同步环境。

1,安装python3.7 ,这块不懂的网上自行搜索方法,因为服务器本身有python2 版本,所以安装python3.7 版本后,执行python3.7 的命令改成 python3 开头。

2,安装mysql 5.7.10 ,记得新建相同名的数据库,迁移本地数据库表结构和数据,这块不懂的网上自行搜索方法。

3,安装Django 3.2.18 。

以上前提环境条件准备好后开始部署“编写你的第一个 Django 应用程序”。

二、部署uwsgi服务器

1. 什么是WSGI协议:

Django 是 Python 语言编写的 Web 框架,而我们使用 Django 编写的项目称为 Web 应用,而一个 Web 项目的运行离不开 Web 服务器,所以就需要一种规范或者协议来定义 Web 应用如何与 Web 服务器之间实现交互以及请求的接受与响应的返回,这就引出了 WSGI 协议。

所以,我们就能够了解到 WSGI 协议的主要工作职责是什么了。

1) 从定义层面理解WSGI协议

WSGI(Web Server Gateway Interface)即 Web 服务器网关接口,它是属于一种规范协议,它定义了 Python Web 应用程序与 Web 服务器通信的接口。为了让大家更容易理解 WSGI 的作用,我们举一个通俗易懂的例子,比如,世界上有很多国家,各个国家之间货币都不通用,当你需要到韩国旅游的时候,就需要把我们的人民币按照国际汇率标椎兑换成韩元,这样我们才可以在韩国消费,而国际汇率标准就是一套完整的规范协议准则,也就相当于本节讲到的 WSGI 协议,需要各个国家遵守。

2) Python Web中WSGI协议

通过上面例子,再理解 WSGI 协议在 Python Web 中的作用就变的非常简单。Python 语言有各种各样的 Web 应用框架,如果在没有统一标准的情况下,可能需要针对每一个框架去实现各自的 Web 服务器。可想而知,如果这样的话,会给我开发者带来繁重的工作量。

WSGI 协议的出现恰恰解决了上述问题,它可以让 Web 服务器知道如何去调用 Python 应用程序;让 Python 应用程序知道客户端在请求什么,以及如何返回结果给 Web 服务器,WSGI 实现了 Web 服务器与应用程序之间的交互。

2. Django内置WSGI服务器

在 WSGI 协议中定义了两个角色:一个是 Web 服务器即 server,另一个是应用程序即 application,server 需要接受来自客户端的请求,然后根据协议定义调用应用程序(application),应用程序处理请求并返回结果给 server,最终响应给客户端。

Django 框架同时实现了 WSGI 的 server 和 application。其中内置的 WSGI 服务器是基于 Python 的内置模块 wsgiref 实现的,主要是添加了一些异常处理和错误记录,但是没有考虑到运行效率,故不适合在生产环境中使用,它主要被使用在开发和测试过程中。在这里进行一下简单的讲解,不作为本节的重点。

3. uWSGI生产环境的搭建与配置

上面介绍了 Django 的内置 WSGI 服务器的实现,但是由于 Django 并不专注于实现服务器,所以内置的 WSGI 服务器无法满足生产环境的需求,所以我们在这里要介绍另外一种 WSGI 服务器,即 uWSGI。

1) uWSGI服务器简单介绍

uWSGI 是当下最流行的一种 WSGI 服务器,同样遵守 WSGI 协议。它可以与各种 Python Web 框架实现兼容,而且配置过程与使用方式都非常简单。我们之前使用 runserver 命令启动项目,通常只是在开发和测试环境中使用。当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时候可以使用 uWSGI,它是 WSGI 服务器的一种,它可以让 Django、Flask 等开发的 Web 应用站点运行其中。

2) 安装与配置uWSGI服务器

要使用 uWSGI,首先要对它进行安装,但是这里有一点需要注意,因为项目都是部署在 Linux 系统上,所以这些操作也要在Linux 系统上完成,学会配置 uWSGI 服务器。

pip3 install uwsgi

使用上述命令安装 uWSGI,安装完成后在 mysite 项目的根目录下,新建 uwsgi.ini 配置文件(和 manage.py 文件同级目录),并在该文件中进行如下配置:

[uwsgi]
# 套接字方式的 IP地址:端口号
socket=127.0.0.1:8000
# Http通信方式的 IP地址:端口号
# http=127.0.0.1:8000
#上述两种方式选择其一,在使用Nginx需要使用socket

# 项目当前工作目录自行配置
chdir=/home/py_workspace/django_pro/mysite 这里需要换为项目文件夹的绝对路径

#指定wsgi模块下的application对象
module = mysite.wsgi:application

#是否启动主进程来管理其他进程
master=true

# 以上4个是核心配置项

# 项目中wsgi.py文件的目录,相对于当前工作目录
wsgi-file=mysite/mysite/wsgi.py
# 进程个数,根据电脑配置设置
process=4
# 每个进程的线程个数
threads=2
# 服务的pid记录文件
pidfile=uwsgi.pid
# 服务的日志文件位置
daemonize=uwsgi.log

然后修改项目 ./mysite/settings.py 文件将其设置为适合线上生产环境使用,如下所示:

....
DEBUG=False                    #关闭调试模式
ALLOWED_HOSTS = ['*']   #任何ip都可以访问
....

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'world',  #服务器数据库名
"USER": "root",
"PASSWORD": "123456", #服务器数据库密码
"HOST": "127.0.0.1", #服务器数据库地址, 项目代码部署的服务器和数据库服务器一致可以用这个,不同的话使用实际数据库地址
"PORT": "3306",
"OPTIONS": {"init_command": "SET default_storage_engine=INNODB",},
}
}

3) 启动与测试uWSGI服务器

配置完成后,我们就可以使用下面的命令启动 uWSGI 了:

#启动 uwsgi 命令
$ cd ./mysite/mysite # 项目文件夹,uwsgi.ini 配置文件 下执行
$ uwsgi --ini uwsgi.ini
#停止 uwsgi 命令
$ uwsgi --stop uwsgi.pid

说明:当 uWSGI 启动后,当前 Django 项目的程序已变成后台守护进程,在关闭当前终端时此进程也不会停止。执行完我启动命令后,可以看到在项目的主目录下又生成了两个文件分别是 uwsgi.pid 与 uwsgi.log,它们分别用来记录,uWsgi 的进程号码 pid 与 uWSGI 的相关运行日志。启动成功的标志如下所示:

[uWSGI] getting INI configuration from uwsgi.ini

此时 uWSGI.log 会帮助我们记录 uWSGI 服务器的请求日志等等,有兴趣可以自己看一看日志内容。上述就是 uWSGI 服务器的完整部署与使用流程,不过如果这样使用的话, uWSGI 会直接暴露给客户端用户,所以它通常会和 Nginx 搭配在一起进行使用。

三、部署Nginx服务器

1. 什么是Nginx及其主要作用 

Nginx (engine x) 是一个高性能的 HTTP ,负载均衡和反向代理 Web 服务器。Nginx 的主要作用是作为 Web 服务器的反向代理服务器,实现 Web 服务器的负载均衡以及站点资源的动静分离。

你虽然知道了 Nginx 拥有强大的功能,并且在实际应用中使用很广泛,但是你可能仍然处于云里雾里的感觉,所以我们就要理解一些和相关概念,比如什么是反向代理、负载均衡以及动静分离。

1) 反向代理服务器

反向代理服务器位于客户端用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为 Web 加速,用来提升用户访问站点的速度,所以使用 Nignx 作为 Web 服务器的前置服务器可以降低网络和服务器的负载,从而提高访问效率。

2) 什么是负载均衡

负载均衡(Load Balance),它的意思就是将工作任务分摊到多个操作单元上进行执行,比如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上面,将原先请求到单个服务器上面的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,这就是负载均衡。

3) 理解动静分离

所谓动静分离就是为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低单个服务器的压力。进而提升整个服务访问性能和可维护性。

4) Nginx应用场景

主要有以下三大场景:

一、作为虚拟主机,它可以实现在一台服务器虚拟出多个网站;

二、用来充当 HTTP 服务器。Nginx 是一个 HTTP 服务器可以独立提供 HTTP 服务,也可以做网页静态服务器;

三、实现反向代理、负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求,这时就需要用多台服务器组成服务集群并把 Nginx 做为反向代理服务器,实现多台服务器可以平均分担负载的目的,这样就不会造成某台服务器负载过高而宕机,而集群中另一台服务器闲置的情况。

2. 实现Nginx+uWSGI+Django项目部署

1) 项目部署原理分析

我们了解了 Nginx 的主要作用,在整个项目中起着关键的作用。在项目部署中,Nginx 作为“带头大哥”迎难而上来接收数客户端的请求(一个Nginx服务器能够同一时刻支撑 5 万的并发量),并将请求分为动态请求与静态请求,而 uWSGI 是排在第二位“二哥”将 Nginx 接收到的请求转变为 Django Web 框架能看懂的形式并发送给 Django,根据客户端请求,Django 返回响应交给 uWSGIM 依次传递,最后由 Nginx 返回给客户端响应,如下图所示:

图1:Django项目部署流程分析图
 

简图如下所示,理解起来非常方便:

图2:Django项目部署流程简易图

2) Nginx安装与配置

理解了上面原理架构图,我们就正式开始安装配置 Nginx ,使用如下命令在线安装即可:

yum -y install nginx

安装完了,我们要查找nginx 安装到哪里了,有那些重要文件和路径。

服务器上查看安装路径命令:

whereis nginx

/usr/sbin/naginx ---执行路径

/usr/lib64/nginx ---安装路径

/etc/nginx/ --- 配置路径

/usr/share/nginx ---默认站点目录

1、修改nginx配置文件

cd /etc/nginx  #进入配置路径

#先备份一个配置文件

cp nginx.conf nginx.conf.bak

#修改配置文件

vi nginx.conf

打开文件后,清空,复制如下配置信息,然后再根据实际情况修改部分数据。

#user root;
#worker_processes 1; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on; server {
# 监听端口号
listen 80;
# 你的云服务器ip
server_name xx.xx.xx.xx;
charset utf-8;
client_max_body_size 75M; # adjust to taste location / {
# 将nginx所有请求转到uwsgi
include uwsgi_params;
# uwsgi的ip与端口,与之前的 uwsgi.ini 配置文件 地址端口一致
uwsgi_pass 127.0.0.1:8000;
} location /static {
# 静态文件目录
alias /home/py_workspace/django_pro/mysite/static;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} } }

2.、配置完成后,启动nginx.

cd /usr/sbin  #进入执行路径

#启动 nginx

./nginx

#重启 nginx

./nginx -s reload

#停止 nginx

./nginx -s stop

ps -ef|grep nginx    查端是否启动成功

[root@ /usr/sbin]# ps -ef|grep nginx

root      7760     1  0 18:07 ?        00:00:00 nginx: master process ./nginx

nginx     7761  7760  0 18:07 ?        00:00:00 nginx: worker process

root      8449  8413  0 21:53 pts/0    00:00:00 grep --color=auto nginx

四、完成部署

经过 uwsgi 服务器和  nginx 服务器 部署配置,启动完成后,基本就结束部署了,打开浏览器,查看部署的第一个Django项目。

xx.xx.xx.xx  代表你的云服务器对外访问IP,因为nginx 配置默认端口为 80 , 云服务器一般开通了80端口访问权限,然后 uwsgi + Django 配置了 8000端口,需要在云服务器官网,自己添加 8000 端口访问权限,这块自行网上搜索解决,网络端口解决了,直接输入下面网址查看部署结果。

-- 进入后台管理网页

http://xx.xx.xx.xx/admin

-- 进入自建的 polls 网页

http://xx.xx.xx.xx/polls

--------------------------------------end------------------------------

云服务器下如何部署Django项目详细操作步骤的更多相关文章

  1. CentOS7下部署Django项目详细操作步骤

    严格按下面步骤 一.更新系统软件包 yum update -y 二.安装软件管理包和可能使用的依赖 yum -y groupinstall "Development tools" ...

  2. 转载:CentOS7下部署Django项目详细操作步骤

    部署是基于:centos7+nginx+uwsgi+python3+django 之上做的 文章转自:Django中文网        https://www.django.cn/article/sh ...

  3. Linux云服务器下Tomcat部署超详细

    基于阿里云Centos 7服务器的Tomcat 项目部署 工具:一台安装jdk1.8的Centos 6/7.X 云服务器(64位) Putty  ssh远程连接云服务器的软件 FileZillaCli ...

  4. 阿里云轻量级服务器和NGINX部署Django项目

    部署条件: 1.一台阿里云服务器(本人的是CentOS系统的服务器) 2.已经构建好的项目 3.服务器上安装并配置Nginx 首先第一步:在服务器上安装并配置Nginx 进入服务器 $ ssh roo ...

  5. CentOS6.9下离线部署Django项目

    最近项目服务器变动,研究了CentOS6.9下httpd2.4+django1.11.16+python3.6+PostgreSQL的部署,之前还有一个ubuntu16.04下的部署等以后整理好后再来 ...

  6. Linux云服务器下Tomcat部署

    基于阿里云Centos 7服务器的Tomcat 项目部署 工具:一台安装jdk1.8的Centos 6/7.X 云服务器(64位) Putty  ssh远程连接云服务器的软件 FileZillaCli ...

  7. 基于阿里云服务器Linux系统部署JavaWeb项目

    前段时间刚完成一个JavaWeb项目,想着怎么部署到服务器上,边学边做,花了点时间终于成功部署了,这里总结记录一下过程中所遇到的问题及解决方法.之所以选择阿里云,考虑到它是使用用户最多也是最广泛的云服 ...

  8. Linux下自动备份MySQL数据库详细操作步骤(转载)

    环境说明操作系统:CentOSIP:192.168.150.214Oracle数据库版本:Oracle11gR2用户:root 密码:123456端口:3306数据库:ts_0.ts_1.ts_2.t ...

  9. 腾讯云服务器部署 django项目整个流程

    CentOS7下部署Django项目详细操作步骤 前记:购买腾讯云服务器,配置自选,当然新用户免费体验半个月,我选择的系统是centos7系统版本, 接下来我们来看整个配置项目流程. 部署是基于:ce ...

  10. linux上使用nginx、uwsgi部署django项目

    参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...

随机推荐

  1. [转]CLion 2022.2.4破解教程详细图解mac,windows,linux均适用(2022.11.10亲测有效)

    前言 此教程为CLion 2022.2.4 破解教程,且此教程以及下面提供的破解补丁适用与2022.2以后的新版本.2022年11月10日亲测有效,mac与windows均测试完美破解 CLion   ...

  2. IM跨平台技术学习(三):vivo的Electron技术栈选型、全方位实践总结

    本文由vivo技术团队Yang Kun分享,原题"electron 应用开发优秀实践",本文有修订. 1.引言 在上篇<Electron初体验(快速开始.跨进程通信.打包.踩 ...

  3. 第二章 dubbo源码解析目录

    6.1 如何在spring中自定义xml标签 dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个 ...

  4. Golang-函数5

    http://c.biancheng.net/golang/func/ Go语言函数(Go语言func) 函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func.函数名.参数列 ...

  5. Docker核心技术及架构

  6. Linux通配符和转移字符(扩展匹配文件名)、man帮助文档的使用

  7. MySQL分页性能思考

    MySQL分页性能思考 关键词:深度分页 背景 最近有一个需求:在后台管理页面中,需要展示产品信息的列表. 之前版本开发中产品信息是用户填写完所有字段之后能进行保存.在之前的基础上需要支持用户不完全填 ...

  8. BUUCTF刷题-Web方向1~5wp

    [极客大挑战 2019]EasySQL 一个sql注入登录框,直接万能密码登录 拿到flag [极客大挑战 2019]Havefun 打开环境,没有任何信息,查看源码,发现这么一段代码 GET方式传入 ...

  9. Dart中操作符详细介绍和使用

    dart中静态成员 1 使用satic关键字 来实现类级别的变量和函数 2 静态方法不能够访问非静态成员, 非静态方法可以访问静态成员 3 静态属性,不要通过this去访问 因为this指向的是这个实 ...

  10. 深入理解 Future, CompletableFuture, ListenableFuture,回调机制

    深入理解 Future, CompletableFuture, ListenableFuture,回调机制 本文禁止转载. 本文从设计思想.具体实现等角度分析了 Future.CompletableF ...