首先:scgi是什么。是app与webserver通信的一种协议.
那按照我的理解:比如说webserver是apache,启动后其会监听某个端口的请求,而后处理之。如果是静态的那就自己搞定,如果是动态的呢?我们就将之交给scgi来处理。
scgi是一种c/s架构,mod_scgi是client,我们将这个client加载到nginx中,这样nginx就有能力与scgi-server通信了. 而后我们配置一下:对于哪些请求转发给后边的scgi-server来处理。这些请求可以通过:domain,path等来选择出来,而后转到后端的scgi-server。 这里有个问题就是:后端的scgi-server可能有多个,那是该转到哪个呢?这里就需要唯一表示一个scgi-server,这里是domain+port的方式来唯一标识的.就相当于:每一个scgi-server运行起来后都是要监听一个地址端口的,这个肯定都不相同,那在前段nginx在转交时都要指定转交给哪个domain+port的scgi-server。 说白一点:scgi-server其实也可以理解成是一个web-server
举个我自己熟悉的例子:以前配置过前后端的webserer。 前端的lighttpd负责转发请求都后端的Lighttpd。前端lighttpd要做的就是依据不同的domain来转发请求到后端的实际模块的自己的lighttpd.比如 beijing.test.com是单独一个项目,而shanghai.test.com是另外一个单独的项目. 那我们将这两个域名都绑定到前端lighttpd所在的机器,其会依据domian的不同来决定将请求转发到这两个项目各自后端实际处理的lighttpd上去。 前后端lighttpd的交互是用的linux-sock. 这样:前断Lighttpd监听的端口可能就是80,但是往后端转时就可以转到后端不同ip和port的后端Lighttpd上!而后端lighttpd要做的就是监听这个端口,等待请求并处理。
那这里类比一下,后端Lighttpd实际上就是scgi-server(就是完全把scgi-server看做一种webserver),亦即:前端webserver是nginx,后端webserver是scgi-server.
两者通信用的就是mod_scgi这个scgi-server的客户端啦!于是前后逻辑就很简单了: nginx收到请求后,会依据不同的domain来选择发往后端哪个scgi-server(说白了标识不同的scg-server就是用的其所在机器domian+port来唯一标识的!!),而后端scgi-server要做的工作就是简单的监听对应端口就ok啦!
那按照我的理解:这种通信方式和sock,http通信没什么区别。也可以分布在不同机器上,也可以分布在同一台机器上。其各自各有什么优缺点呢?
配置①前后端都用nginx,通信用sock
配置②前端用nginx,后端用scgi-server,通信用scgi_mod
不过前者搭配感觉更适合于:前后端是处在不同机器上。 而配置②更适合于前后端处于同一台机器上的情况。
当然我们也可以:前端nginx,后端是nginx+scgi
亦即:前端负责转发请求到后端,后端实际处理请求时再把动态请求交给scgi来处理!!
===================================================================================================
那假设我们在同一台机器上,nginx收到请求后,将之交给scgi-server处理,这个scgi-server该如何写呢?
如下: server-scgi.py
#!/usr/bin/env python
from scgi.quixote_handler import QuixoteHandler, main
from quixote.publish import Publisher
from quixote import enable_ptl
enable_ptl()
class MyAppHandler(QuixoteHandler):
publisher_class = Publisher
root_namespace = "test2.ui"
prefix = ""
if __name__ == '__main__':
main(MyAppHandler)
./server-scgi.py -p 3001 -l tmp.log
这样就可以启动这个scgi-server了。
说明一下代码:
①scgi.quixote_handler是scgi自带的,下载后就有
②我们要做的就是实现自己的请求处理函数,一般继承自QuixoteHandler,这样就可以紧密结合quixote来处理请求了,我们唯一要做的就是:指定一下自己要使用的Publisher,指定一下quixote的root-namespace. 这两个都是系统变量。指定后就可以处理之了!!
这样做完之后,你就可以写自己的代码了,问题是:你运行着这个scgi-server时:你可能随时修改其中的代码,此时如何让修改生效呢?
start:
#!/bin/sh -v ./server-scgi.py -p 3001 -l tmp.log
restart:
#!/bin/sh -v kill -HUP `cat /var/tmp/server-scgi.pid`
stop:
#!/bin/sh -v kill `cat /var/tmp/server-scgi.pid`
嗯,所以一般我们都是写一个shell脚本,来启动,关闭和重新启动这个scgi-server ~~~~
http://www.rexx.com/~dkuhlman/quixote_scgi.html#changing-your-quixote-application