Python中如何通过FastCGI访问Django应用?

面试的时候被问及,通过 uwsgi 运行 dajngo 是使用了 django 项目下默认创建的 wsgi.py 下的配置,以运行 django

但 python manage.py runfcgi host=127.0.0.1 port=9527 运行的时候项目内并无任何配置,fastcgi 又是如何运行 django 项目呢?

说实话,一直都是这么配置就能用了,我还真不知道其中具体原理,请各大神赐教


Python中如何通过FastCGI访问Django应用?

16 回复

读一下源码?


在Django中通过FastCGI部署,虽然现在不是主流方式(更常用WSGI),但用flup库还是能搞定的。核心就是写个FastCGI启动脚本。

首先确保装了flup

pip install flup

然后在Django项目根目录(和manage.py同级)创建个fcgi.py文件:

#!/usr/bin/env python
import os
import sys

# 设置Django环境
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")

from django.core.servers.fastcgi import runfastcgi

if __name__ == "__main__":
    # 这里配置监听方式,两种选一种:
    
    # 1. 绑定到本地TCP端口
    runfastcgi(method="threaded", host="127.0.0.1", port=8000)
    
    # 2. 或者用Unix socket(性能更好)
    # runfastcgi(method="threaded", daemonize="false", socket="/tmp/django.sock")

接着给执行权限并运行:

chmod +x fcgi.py
python fcgi.py

Nginx那边配置大概长这样:

location / {
    fastcgi_pass 127.0.0.1:8000;  # 对应TCP方式
    # fastcgi_pass unix:/tmp/django.sock;  # 对应socket方式
    include fastcgi_params;
}

用supervisor管理进程的话,配置里写command = python /path/to/fcgi.py就行。

总结:用flup写个启动脚本,配好Nginx转发。

建议可以先了解下 wsgi 协议

看下 WSGI 代码,看了下 HTTP 原理你就知道了。

我没用过 django。但看 nginx 的 fastcgi 配置就可知道,nginx 在向 fastcgi 后端请求时, 会传送文件路径,uri 参数以及系统参数等信息。
fastcgi 进程启动时并不需要项目参数。




都写在 manage.py 了,,捂脸,-u-

首先, 在 django 中允许用户自定义命令,然后使用 python manage.py <command> [参数]去执行。当然,runserver,runfcgi, sql …都是 django 自带的命令。但其实现原理都是一样的, 都是继承了 BaseCommand 类并实现 handler 方法, 实现命令的 py 文件的目录结构也很有特点, 一定是在<app>.management.commands 目录下。因此你可以很容易的找到 runfcgi 命令实现的源码(django.core.management.commands.runfcgi), 同样其他内置的命令实现都可以在 django.core.management.commands 包中找到. 剩下的看代码吧。

很详细,3q

没想到你想知道 django 的命令情况~~~~看来我阅读理解没过关了~

没有,其实我是看过了 cgi, WSGI, fastcgi 这几个东西的区别,只是大概知道他们是基于 web 服务器与应用间的协议,uWSGI 就是一个 web 服务器,我只是不清楚这个协议是怎么把 django 应用给跑起来,感觉理解得好混乱

runfcgi 不是在 1.9 版本后被移除了吗……

是的,只是因为我之前的项目有这个,他问起

uwsgi 服务器我记得也有一个 UWSGI 协议

runfcgi 调用了 flup
flup 是一个 wsgi server,内部通过函数调用的方式访问 django 的 wsgi 接口(较新版 django 支持 wsgi ),对外提供 fastcgi server 的通信协议

对的,后来看源码,跟你说的一样

回到顶部