使用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 相关文章推荐
python如何实现远程控制电脑(结合微信)
Dec 21 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
Python生成器以及应用实例解析
Feb 08 Python
Python字符串的常见操作实例小结
Apr 08 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
Spring实战之使用util:命名空间简化配置操作示例
Dec 09 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 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中目录,文件操作详谈
2007/03/19 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
js压缩利器
2007/02/20 Javascript
javascript比较文档位置
2008/04/08 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python单链表实现代码实例
2013/11/21 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
python format 格式化输出方法
2018/07/16 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Python random模块的使用示例
2020/10/10 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
酒店总经理岗位职责
2014/03/17 职场文书
环保标语口号
2014/06/13 职场文书
诚实守信主题班会
2015/08/13 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS