在RHEL4上搭建Python/Lighttpd/FastCGI环境

在一台赤裸裸的RHEL4上部署web.py程序,一切从几乎是从零开始。以下操作均以root用户操作。

1. 安装MySQL数据库

下载安装MySQL
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.41-linux-i686-glibc23.tar.gz/from/http://mirror.services.wisc.edu/mysql/
解压,按照INSTALL文件说明进行安装,不多赘述

2. 安装Python环境

下载Python源码

wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2
解压,编译安装,不需要特殊操作。

下载Easy_install

wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
安装
sh setuptools-0.6c11-py2.6.egg

安装相关Packages

easy_install DBUtils
easy_install flup
easy_install web.py

安装mysql-python

mysql-python包不能用easy_install安装,手动下载
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python-test/1.2.3b1/MySQL-python-1.2.3b1.tar.gz?use_mirror=softlayer
加压,编辑site.cfg
指定mysql_config的路径,注意是新安装的mysql路径
mysql_config=/usr/local/mysql/bin/mysql_config
编译、安装
python setup.py build
python setup.py install

声明libmysqlclient路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib

3. 安装服务器环境

下载安装fastcgi头文件

wget http://www.fastcgi.com/dist/fcgi.tar.gz
解压,默认编译安装

下载安装PCRE

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2
解压,默认编译安装

下载lighttpd

wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.25.tar.bz2
configure时指定–prefix=/usr/local/lighttpd
编译,安装

4. 配置

lighttpd fastcgi运行web.py程序请参考
http://www.classicning.com/blog/2009/11/lighttpd%e9%80%9a%e8%bf%87fastcgi%e8%bf%90%e8%a1%8cweb-py%e7%a8%8b%e5%ba%8f/

非常重要的几点注意:

  • 通过fastcgi运行的python脚本必须具有可执行权限, chmod u+x web/main.py
  • 重启fastcgi程序需要删除/tmp/fastcgi.socket*

任何Python程序出错、权限错误都会导致lighttpd这样的报错:
2009-11-27 18:12:02: (mod_fastcgi.c.1108) child exited with status 13 /home/admin/web/main.py
2009-11-27 18:12:02: (mod_fastcgi.c.1111) If you’re trying to run your app as a FastCGI backend, make sure you’re using the FastCGI-enabled version.
If this is PHP on Gentoo, add ‘fastcgi’ to the USE flags.
2009-11-27 18:12:02: (mod_fastcgi.c.1399) [ERROR]: spawning fcgi failed.
2009-11-27 18:12:02: (server.c.931) Configuration of plugins failed. Going down.

报错会提示fastcgi未正确安装,而实际上仅仅是程序错误或权限问题而已。

Lighttpd通过FastCGI运行web.py程序

web.py是个很小的python框架,特点就是小,连session都没有实现人家就发布了。前几天KungfuRails大会上他们吹牛说Sinatra可以写出世界上最小的Webapp,但是有web.py的化,那个最小至少要加上个“之一”。

Web.py在Lighttpd上通过fastcgi运行的配置,可以在web.py的网站上找到文档:
http://webpy.org/cookbook/fastcgi-lighttpd

实际我用的时候把静态的index.html用作首页,稍改动一下:

server.document-root = "/home/sun/projects/sdostatweb"

server.modules   += ( "mod_fastcgi" )
server.modules   += ( "mod_rewrite" )

server.port = 4000

mimetype.assign = (
    ".html" => "text/html"
)

index-file.names = ( "index.html" )

fastcgi.server = ( "/sdostatweb.py" =>
(( "socket" => "/tmp/fastcgi.socket",
        "bin-path" => "/home/sun/projects/sdostatweb/sdostatweb.py",
        "max-procs" => 5,
        "bin-environment" => (
        "REAL_SCRIPT_NAME" => ""
    ),
        "check-local" => "disable"
    ))
)

url.rewrite-once = (
    "^/$" => "/static/index.html",
    "^/flotr/(.*)$" => "/static/flotr/$1",
    "^/static/(.*)$" => "/static/$1",
    "^/(.*)$" => "/sdostatweb.py/$1",

)

另外用fastcgi的方式使用web.py,需要安装flup。

详细的事,可以看看新浪的Tim Yang的优化:
http://timyang.net/python/python-webpy-lighttpd/

我之前真不敢相信搜狐Mail是跑在web.py上。