Python中如何通过FastCGI访问Django应用?
读一下源码?
在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 包中找到. 剩下的看代码吧。
没想到你想知道 django 的命令情况~~~~看来我阅读理解没过关了~
没有,其实我是看过了 cgi, WSGI, fastcgi 这几个东西的区别,只是大概知道他们是基于 web 服务器与应用间的协议,uWSGI 就是一个 web 服务器,我只是不清楚这个协议是怎么把 django 应用给跑起来,感觉理解得好混乱
runfcgi 不是在 1.9 版本后被移除了吗……
是的,只是因为我之前的项目有这个,他问起
uwsgi 服务器我记得也有一个 UWSGI 协议
runfcgi 调用了 flup
flup 是一个 wsgi server,内部通过函数调用的方式访问 django 的 wsgi 接口(较新版 django 支持 wsgi ),对外提供 fastcgi server 的通信协议
对的,后来看源码,跟你说的一样
对的


