当前位置: 首页 > 工具软件 > quixote > 使用案例 >

scgi和quixote的结合使用

邵博远
2023-12-01

首先: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

 类似资料: