前期本人完成了“编写你的第一个 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------------------------------