首先了解一下开发环境服务器跟生产环境服务器有何不同。
一、我们通过 python manage.py runserver 启动开发环境服务器,这条命令背后做了哪些事情?
1、首先加载Django项目的设置(settings)
2、检查数据库迁移,确保数据库是最新的,或者提醒开发者关于未应用的迁移。
3、启动开发服务器 :接下来,Django会启动一个轻量级的Web服务器。这个服务器默认监听127.0.0.1:8000
地址和端口,但你可以通过命令行参数更改这些设置。
4、监听文件修改并自动重新加载,代码文件修改后,Django会自动重启服务器,这样你就可以立即看到你的更改效果。
5、静态文件和媒体文件的服务:在开发模式下,runserver
也会自动服务静态文件(CSS、JavaScript、图片等)和媒体文件,让你不需要配置额外的Web服务器就能测试这些文件的加载和显示。
6、请求处理 :对于进来的HTTP请求,runserver
通过Django的WSGI应用来处理。它会根据配置的URL路由将请求分发到相应的视图函数或类视图上,然后返回响应给客户端。
7、输出日志信息:runserver
会在控制台输出访问日志和错误信息,这对开发者调试应用非常有用。
我们重点关注3和6(启动开发服务器 和 请求处理),django内置了一个轻量服务器模块: django.core.servers.basehttp。当你运行python manage.py runserver
命令时,Django会通过django.core.management.commands.runserver
模块创建一个django.core.servers.basehttp.WSGIServer实例,这个实例是 Django 的轻量级 Web 服务器的核心。它接收 HTTP 请求并将其转发给 Django 的 WSGI 应用处理,然后再将响应返回给客户端。
二、我们看看生产环境,以Nginx + Gunicorn + Django为例。
这个配置下,整个http请求处理过程中不会 启动django.core.servers.basehttp.WSGIServer
而是会启动Gunicorn服务器:以下是启动Gunicorn服务器的指令。
gunicorn myproject.wsgi
默认情况下,Gunicorn会监听127.0.0.1:8000
地址
然后就是 客户端 <--->Nginx<--->Gunicorn<--->WSGI<--->你写的脚本
参考这个图:
三、对于IIS+wfastcgi+django
IIS的作用相当于Nginx,
wfastcgi的作用也类似于Gunicorn,都是将HTTP请求转换为WSGI兼容请求,并传递给Django应用,但wfastcgi的功能比Gunicorn少。例如:
Gunicorn 可以监听HTTP请求以及将WSGI应用的响应发送回客户端,而wfastcgi没有自己监听HTTP请求的能力,也不能将response发送给客户端,它是依赖于IIS来接收接收和发送响应的。-->因此,Gunicorn可以独立作为服务器(无需Nginx),但wfastcgi脱离了IIS就无法处理请求和响应。
四、对于 IIS+httpPlatformHandler +django
使用HttpPlatformHandler
时,是需要搭配waitress才能完成整个http的请求+响应的。(Gunicorn和uWSGI不支持windows,所以用waitress,waitress的功能比Gunicorn少一点)
如果没有搭配waitress,而使用以下这个配置的话,实际上是启动了Django内置的开发服务器(django.core.servers.basehttp.WSGIServer),所以这个配置并不适用于生产环境。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*"
modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="D:\home\Python27\python.exe" arguments="manage.py runserver %HTTP_PLATFORM_PORT%" requestTimeout="00:04:00" startupTimeLimit="120" startupRetryCount="3" stdoutLogEnabled="true">
<environmentVariables>
<environmentVariable name="PYTHONPATH" value="D:\home\site\wwwroot"/>
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>
若把:
arguments="manage.py runserver %HTTP_PLATFORM_PORT%"
改为waitress就可以用于生产环境了:
arguments="run_waitress_server.py"
或为waitress 也可以用于生产环境:
arguments="run_waitress_server.py"
-----------------------------------------------------
# 前提是确保先安装了waitress
pip install waitress
# run_waitress_server.py 的代码如下:
import os
from waitress import serve
from index import app
serve(app,host="0.0.0.0",port=os.environ["PORT"])
waitress 是跟 Gunicorn 同性质的纯python web server,相比之下,waitress 配置更简单但性能弱一些,适合小型项目。网上有不少waitress vs Gunicorn 的比较文章。