我们前面的代码都是在我们自己的电脑(通常是Windows操作系统)上面运行的,因为我们还处于开发过程中。
当我们完成一个阶段的开发任务后,就需要把我们开发的网站服务,给真正的用户使用了。
那就需要我们的 网站 部署在公网机器上,而不是我们的个人电脑。 这个给真正用户使用的网站服务器我们通常称之为 生产环境
通常,我们的web服务是部署在云服务厂商的云主机上,比如阿里云的ECS云主机。当然如果你们公司有自己的机房和公网服务器,当然也可以。
现在的web服务,基本都是采用 Linux 操作系统。 而且生产环境不应该使用 SQLite 数据库,通常是 MySQL、Postgresql、Oracle等。
本章内容就是教大家,如何把基于Django的web系统部署到生产环境,也就是 如何 在Linux操作系统上安装 我们 网站系统,包括我们的代码和MySQL数据库服务。
架构说明
一个大型的网站系统,架构通常非常的复杂,包括很多的功能节点。大家可以以后慢慢学习。
当前,我们先从基础的架构学起。
可能你会说,我们前面已经把网站运行起来了呀,现在只需要把系统从 Windows 转移到Linux上了,把SQLite 改为 MySQL就行了吧?
不仅如此,认真学习课程的同学应该记得,我们前面曾经讲过如下两点:
-
Django 在生产环境不应该处理静态资源(比如网页、图片等)的请求
前面是开发阶段,为了是环境搭建容易,我们还是让Django来处理静态资源的请求了。
在生产环境不能这样做,这里我们使用Nginx来处理静态资源的请求。
-
Django 在生产环境 不能直接处理 HTTP请求
Django是 wsgi web application 的框架,它只有一个简单的单线程 wsgi web server。 供调试时使用。性能很低。
在生产环境必须提供 专业的 wsgi web server,比如 uWSGI 或者 Gunicorn。 我们这里使用 Gunicorn。
而且即使有了 uWSGI 或者 Gunicorn,我们最好还要在前面设置 Nginx 。所有的客户请求由它先接受,再进行相应的转发。
为什么要这样?
Nginx 在整个后端的最前方, 可以实现 负载均衡、反向代理、请求缓存、响应缓存 、负荷控制等等一系列功能。可以大大的提高整个后端的性能和稳定性。
综上, 我们当前这个简单网站,其架构图如下
这里为了简单,把整个后端系统都部署在同一台Linux主机上,包括:Nginx、Gunicorn、Django(包括我们的代码)、MySQL服务。
在实际项目中,如果系统的负荷比较大,通常是部署在多台主机上。
这个架构的各个子系统是如何协同工作的?
-
Nginx
Nginx 运行起来是多个进程,接收从客户端(通常是浏览器或者手机APP)发过来的请求。
它会
根据请求的URL
进行判断:如果请求的 是 静态资源,比如HTML文档、图片等,它直接从配置的路径进行读取,返回内容给客户端。
如果请求的 是 动态数据, 转发给 Gunicorn+Django 进行处理
-
Gunicorn/Django
Gunicorn 和 Django 是运行在同一个 Python进程里面的。 它们都是用Python代码写的程序。
启动Gunicorn的时候,它会根据配置加载Django的入口模块,这个入口模块里面提供了WSGI接口。
当 Gunicorn 接收到 Nginx 转发的 HTTP请求后,就会调用 Django的 WSGI入口函数,将请求给Django进行处理。
Django框架 再根据请求的URL 和 我们项目配置的 URL 路由表,找到我们编写的对应的消息处理函数进行处理。
我们编写的消息处理函数,就是前面章节大家学习到的,处理前端请求。如果需要读写数据库,就从MySQL数据库读写数据。