使用FastCGI部署Python的Django应用的教程


Posted in Python onJuly 22, 2015

作为一个mod_python模块的替代,你可以考虑使用mod_wsgi模块,此模块开发的时间比mod_python的开发时间离现在更近一些,在Django社区已有一些使用。 一个完整的概述超出了本书的范围,你可以从官方的Django文档查看到更多的信息。
使用FastCGI部署Django应用

尽管将使用Apache和mod_python搭建Django环境是最具鲁棒性的,但在很多虚拟主机平台上,往往只能使用FastCGI

此外,在很多情况下,FastCGI能够提供比mod_python更为优越的安全性和效能。 针对小型站点,相对于Apache来说FastCGI更为轻量级。
FastCGI 简介

如何能够由一个外部的应用程序很有效解释WEB 服务器上的动态页面请求呢? 答案就是使用FastCGI! 它的工作步骤简单的描述起来是这样的:

和mod_python一样,FastCGI也是驻留在内存里为客户请求返回动态信息,而且也免掉了像传统的CGI一样启动进程时候的时间花销。 但于mod_python不同之处是它并不是作为模块运行在web服务器同一进程内的,而是有自己的独立进程。

为什么要在一个独立的进程中运行代码?

在以传统的方式的几种以mod_*方式嵌入到Apache的脚本语言中(常见的例如: PHP,Python/mod_python和Perl/mod_perl),他们都是以apache扩展模块的方式将自身嵌入到Apache进程中的。

每一个Apache进程都是一个Apache引擎的副本,它完全包括了所有Apache所具有的一切功能特性(哪怕是对Django毫无好处的东西也一并加载进来)。 而FastCGI就不一样了,它仅仅把Python和Django等必备的东东弄到内存中。

依据FastCGI自身的特点可以看到,FastCGI进程可以与Web服务器的进程分别运行在不同的用户权限下。 对于一个多人共用的系统来说,这个特性对于安全性是非常有好处的,因为你可以安全的于别人分享和重用代码了。

如果你希望你的Django以FastCGI的方式运行,那么你还必须安装 flup 这个Python库,这个库就是用于处理FastCGI的。 很多用户都抱怨 flup 的发布版太久了,老是不更新。 其实不是的,他们一直在努力的工作着,这是没有放出来而已。
运行你的 FastCGI 服务器

FastCGI是以客户机/服务器方式运行的,并且在很多情况下,你得自己去启动FastCGI的服务进程。 Web服务器(例如Apache,lighttpd等等)仅仅在有动态页面访问请求的时候才会去与你的Django-FastCGI进程交互。 因为Fast-CGI已经一直驻留在内存里面了的,所以它响应起来也是很快的。

记录

在虚拟主机上使用的话,你可能会被强制的使用Web server-managed FastCGI进程。 在这样的情况下,请参阅下面的“在Apache共享主机里运行Django”这一小节。

web服务器有两种方式于FastCGI进程交互: 使用Unix domain socket(在win32里面是 命名管道 )或者使用TCP socket.具体使用哪一个,那就根据你的偏好而定了,但是TCP socket弄不好的话往往会发生一些权限上的问题。 What you choose is a manner of preference; a TCP socket is usually easier due to permissions issues.

开始你的服务器项目,首先进入你的项目目录下(你的 manage.py 文件所在之处),然后使用 manage.py runfcgi 命令:

./manage.py runfcgi [options]

想了解如何使用 runfcgi ,输入 manage.py runfcgi help 命令。

你可以指定 socket 或者同时指定 host 和 port 。当你要创建Web服务器时,你只需要将服务器指向当你在启动FastCGI服务器时确定的socket或者host/port。

范例:

    在TCP端口上运行一个线程服务器:

./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

    在Unix socket上运行prefork服务器:

./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid

    启动,但不作为后台进程(在调试时比较方便):

./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock

停止FastCGI的行程

如果你的FastCGI是在前台运行的,那么只需按Ctrl+C就可以很方便的停止这个进程了。 但如果是在后台运行的话,你就要使用Unix的 kill 命令来杀掉它。 然而,当你正在处理后台进程时,你会需要将其付诸于Unix kill的命令

如果你在 manage.py runfcgi 中指定了 pidfile 这个选项,那么你可以这样来杀死这个FastCGI后台进程:

kill `cat $PIDFILE`

$PIDFILE 就是你在 pidfile 指定的那个。

你可以使用下面这个脚本方便地重启Unix里的FastCGI守护进程:

#!/bin/bash

# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"

cd $PROJDIR
if [ -f $PIDFILE ]; then
 kill `cat -- $PIDFILE`
 rm -f -- $PIDFILE
fi
exec /usr/bin/env -  PYTHONPATH="../python:.."  ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFIL

Python 相关文章推荐
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
python生成n个元素的全组合方法
Nov 13 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python调用C语言的实现
Jul 26 Python
python验证码图片处理(二值化)
Nov 01 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
python 实现简单的FTP程序
Dec 27 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
基于python和flask实现http接口过程解析
Jun 15 Python
Python字符串的15个基本操作(小结)
Feb 03 Python
python FTP编程基础入门
Feb 27 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 #Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 #Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 #Python
在Django中同时使用多个配置文件的方法
Jul 22 #Python
在Python的Django框架中编写错误提示页面
Jul 22 #Python
详解Django通用视图中的函数包装
Jul 21 #Python
在Python的Django框架中显示对象子集的方法
Jul 21 #Python
You might like
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
关于python列表增加元素的三种操作方法
2018/08/22 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python实现文法左递归的消除方法
2020/05/22 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
几道PHP面试题
2013/04/14 面试题
公务员个人自我评价分享
2013/11/06 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
讲文明倡议书
2015/04/29 职场文书
致运动员的广播稿
2015/08/19 职场文书