首先,理解lighttpd,flup和web.py这三者之间的关系
1. lighthttpd: 功能同tomcat,做为一个请求代理(request proxy),它主要负责根据配置来把不同的请求分发到不同的server来进行处理,它也可以作为一个web server自己来处理一些静态文件请求。同时对于fastcgi等请求,它会把这些请求转发给flup这些server/gateway来进行处理。 tomcat运行比较稳定但是占用资源比较多,而lighthttpd占用资源少,但是处理php有时会不太稳定。
2. flup: 一个用python写的web server,也就是cgi中所谓的Server/Gateway,它负责接受lighttpd转发的请求,并调用你写的程序 (application),并将application处理的结果返回到apache/lighttpd
3. web.py: 应该说有了上面的东西你就可以开始编写你的web程序了,但是问题是你就要自己处理浏览器的输入输出,还有cookie、session、模板等各种各样的问题了,web.py的作用就是帮你把这些工作都做好了,它就是所谓的web framework,另外一个出名的是django,不过感觉太复杂了,web.py差不多就够用了(目前web.py对session的支持不是太好)。
其次,安装
1. flup: 到http://trac.saddi.com/flup下载flup安装包,假设已经把安装包下载到了/tmp目录下。
- #cd /tmp
- #tar -zxvf flup-1.0.1.tar.gz
- #cd flup-1.0.1
- #python setup.py install
2. web.py: 到http://webpy.org/下载web.py安装包,假设已经把安装包下载到了/tmp目录下。
- #cd /tmp
- #tar -zxvf web.py-0.23.tar.gz
- #cd web.py-0.23
- #python setup.py install
3. lighttpd: 到http://www.lighttpd.net/下载lighthttpd安装包,假设已经把安装包下载到了/tmp目录下。
如果想在lighttpd中使用正则,则需要pcre的支持。所以先到http://sourceforge.net/project/showfiles.php?group_id=10194&package_id=9960&release_id=624398下载pcre-7.8.tar.gz 到/tmp目录下,进行编译安装
- #cd /tmp
- #tar -zxvf pcre-7.8.tar.gz
- #cd pcre-7.8
- #./configure
- #make clean
- #make
- #make install
然后安装lighttpd
- #cd /tmp
- #tar xzvf lighttpd-1.4.19.tar.gz
- #cd lighttpd-1.4.19
- #./configure --prefix=/usr/local/lighttpd --with-openssl --with-openssl-libs=/usr/lib
- #make clean
- #make
- #make install
- //复制配置文件到指定的文件夹下
- #mkdir /usr/local/lighttpd/etc
- #cp doc/lighttpd.conf /usr/local/lighttpd/etc
- //为lighttpd单独创建一个用户组和用户
- #groupadd lighttpd
- #useradd -g lighttpd lighttpd
- //创建lighttpd工作目录
- #mkdir /www
- #chown -R lighttpd.lighttpd /www
- //创建lighttpd日志目录
- #mkdir /lighttpdlogs
- #chown -R lighttpd.lighttpd /lighttpdlogs
- #chmod 750 /lighttpdlogs
- //安装启动脚本
- #cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd
- #chkconfig lighttpd on
- //修改启动脚本,主要是修改lighttpd和lighttpd.conf文件所在的目录,以便能正常启动该服务
- #vim /etc/init.d/lighttpd
- //找到LIGHTTPD_CONF_PATH,并修改为LIGHTTPD_CONF_PATH="/usr/local/lighttpd-1.4.19/etc/lighttpd.conf"
- //找到lighttpd,并修改为lighttpd="/usr/local/lighttpd-1.4.19/sbin/lighttpd"
在第四行中,--with-openssl --with-openssl-libs=/usr/lib表示编译ssl模块,从而可以支持https连接。至此lighttpd已经安装完毕了。接下来的工作就是配置文件的修改。
再次,配置文件的修改
配置文件中有一些日志文件、工作目录、用户组用户名等一些配置项,所以需要在配置文件中找到如下几项,并设置为如下值:
- server.document-root = "/www/"
- server.errorlog = "/lighttpdlogs/lighttpd.error.log"
- accesslog.filename = "/lighttpdlogs/access.log"
- static-file.exclude-extensions = ( ".py", ".php", ".pl", ".fcgi" )
- server.username = "lighttpd"
- server.groupname = "lighttpd"
server.modules定义了lighttpd运行时要使用的包,因为我们需要使用alias为界面代码保存的路径指定别名,所以需要将其前面的"#"去掉。
为了使lighttpd支持web.py,我们需要mod_fastcgi模块。为了便于配置文件的管理,我们把配置文件进行分离,然后在lighttpd.conf文件中引入该mod_fastcgi.conf包。在lighttpd.conf中添加一条引入配置包的语句:
- include "/usr/local/lighttpd/etc/mod_fastcgi.conf"
然后我们创建并写入mod_fastcgi.conf配置文件:
- #vim mod_fastcgi.conf
- #vim mod_fastcgi.conf
- #mv mod_fastcgi.conf /usr/local/lighttpd/etc
其中mod_fastcgi.conf文件内容如下:
- server.modules += ("mod_fastcgi")
- server.modules += ( "mod_rewrite" )
- fastcgi.server = ( "/index.py" =>
- (("socket" => "/tmp/fastcgi.socket",
- "bin-path" => "/www/index.py",
- "max-procs" => 1,
- "bin-environment" => (
- "REAL_SCRIPT_NAME" => ""
- ),
- "check-local" => "disable"
- ))
- )
- url.rewrite-once = (
- "^/favicon.ico$" => "/satic/favicon.ico",
- "^/py/(.*)$" => "/index.py/$1",
- )
上面的配置文件中的fastcgi.server设置表明lighttpd的fastcgi请求会由/www目录下的index.py脚本来进行处理。url.rewrite-once设置表明所有的/py/的请求会由index.py来进行处理。这两项共同作用下实现功能为:形如http://127.0.0.1/py/.*的所有fastcgi请求都转由index.py脚本来进行处理,并把结果返回给lighttpd.如果/www目录下还有静态页面index.html,我们则可以通过请求http://127.0.0.1/ 或 http://127.0.0.1/index.html 来进行访问。
接下来我们在/www目录下创建index.py脚本文件:
index.py脚本文件内容如下:
- #!/usr/bin/env python
- import web
- import time
- from flup.middleware.session import MemorySessionStore, SessionMiddleware
- from list import *
-
- urls = (
- '/py/count', 'count',
- '/py/reset', 'reset',
- '/py/list', 'list',
- '/py/(.*)', 'index'
- )
-
- #web.config['session'] = MemorySessionStore(timeout=5 )
- #session = web.config['session'].createSession()
- def getSession():
- return web.ctx.environ['com.saddi.service.session'].session
-
- class index:
- def GET(self, name):
- print 'Hello %s!' % web.ctx.environ['REMOTE_ADDR']
-
- class count:
- def GET(self):
- session = getSession()
- if 'count' in session.keys():
- session['count'] += 1
- else:
- session['count'] = 0
- print session
- class reset:
- def GET(self):
- getSession().invalidate()
- web.seeother('/py/')
- return ''
-
- def Session(app):
- store = MemorySessionStore(1)
- return SessionMiddleware(store, app)
-
- if __name__ == '__main__':
- web.run(urls, globals(), web.reloader, Session)
在index.py中import的list.py内容如下:
- #! /usr/bin/env python
- import os, web
-
- class list:
- def GET(self):
- data = web.input(path={}, name={})
- path = data.path.value
- print os.popen('ls -l %s' % path).read()
我们通过请求http://127.0.0.1/py/list?path=/sur,可以看到ie中列举了ls -l /usr的结果。
如果我们需要lighttpd支持https, 则需要在lighttpd.conf配置如下:
- $SERVER["socket"] == ":443" {
- ssl.engine = "enable"
- ssl.pemfile = "/usr/local/lighttpd-1.4.19/etc/server.pem"
- ssl.ca-file = "/usr/local/lighttpd-1.4.19/etc/server.crt"
- ssl.use-sslv2 = "disable"
- }
上面配置说明对于443端口的https请求,则通过server.pem证书来验证。这样lighttpd可以同时支持80端口的http请求和443端口的https请求了。对于证书的生成,可以通过如下方式:
- #cd /tmp
- #openssl -config openssl.cnf -new -x509 -keyout server.key -out server.crt -days 365 -nodes
- #copy /b server.key+server.crt server.pem
- #mv server.* /usr/local/lighttpd/etc
我们通过请求https://127.0.0.1/py/list?path=/sur,可以看到效果同http请求。
如果需要双向证书(即客户端验证服务器端证书,同时服务器端也需要验证客户端证书)的话,则需要对安装包进行相应的patch,然后再设置相关配置项。可以参考:http://trac.lighttpd.net/trac/ticket/1288。