我正在使用Python编写一个用于监控FastCGI应用程序的工具。我只需要从FastCGI加载ping和status页面(如果失败则返回某种错误)。
有许多库(从python-fastcgi绑定到twisted),它们似乎都可以做到这一点,但其中大部分对于我的目的来说过于复杂,并且许多库会引入其他依赖项,导致一些打包问题。
那么,是否有任何简单的Python FastCGI客户端实现/库易于安装/打包(为RPM)或足够小以与项目一起分发。
更新:
感谢agf,我已经能够连接到FastCGI应用程序并向其发送某种请求。它不过是标准的php-fpm。但我无法获取任何位置的响应:我正在尝试从'/ ping'开始,它应该响应200 OK并在正文中显示“pong”。但我得到的仅仅是空正文的200 OK响应。我是这样发出请求的:
注意:将
另外,我已经修改了flup以
我已经检查了响应读取代码,它似乎很好:确实有来自fpm的空主体。我使用wireshark检查了网络通信,对我来说似乎很好-所有参数都被传输了。
有什么想法吗?
更新:
问题在于fastcgi参数过滤函数:它过滤掉许多有用的参数,如DOCUMENT_ROOT、SCRIPT_FILENAME等。在禁用此功能后,一切正常运行。
对于任何感兴趣的人,这里是修改后的客户端:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py,这里是使用示例:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py。
有许多库(从python-fastcgi绑定到twisted),它们似乎都可以做到这一点,但其中大部分对于我的目的来说过于复杂,并且许多库会引入其他依赖项,导致一些打包问题。
那么,是否有任何简单的Python FastCGI客户端实现/库易于安装/打包(为RPM)或足够小以与项目一起分发。
更新:
感谢agf,我已经能够连接到FastCGI应用程序并向其发送某种请求。它不过是标准的php-fpm。但我无法获取任何位置的响应:我正在尝试从'/ ping'开始,它应该响应200 OK并在正文中显示“pong”。但我得到的仅仅是空正文的200 OK响应。我是这样发出请求的:
def _load_page(self, url):
""" load fastcgi page """
fcgi = fcgi_client.FCGIApp(host = self.fcgi_host, port = self.fcgi_port)
env = {
'SCRIPT_FILENAME': url,
'QUERY_STRING': url,
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': url,
'REQUEST_URI': url,
'GATEWAY_INTERFACE': 'CGI/1.1',
'SERVER_SOFTWARE': 'ztc',
'REDIRECT_STATUS': '200',
'CONTENT_TYPE': '',
'CONTENT_LENGTH': '0',
'DOCUMENT_URI': url,
'DOCUMENT_ROOT': '/',
#'SERVER_PROTOCOL' : ???
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '123',
'SERVER_ADDR': self.fcgi_host,
'SERVER_PORT': str(self.fcgi_port),
'SERVER_NAME': self.fcgi_host
}
ret = fcgi(env)
print ret
我还需要修改flup客户端处理标准输入的部分:
# Transfer wsgi.input to FCGI_STDIN
content_length = int(environ.get('CONTENT_LENGTH') or 0)
s = ''
while True:
chunk_size = min(content_length, 4096)
#s = environ['wsgi.input'].read(chunk_size)
content_length -= len(s)
rec = Record(FCGI_STDIN, requestId)
rec.contentData = s
rec.contentLength = len(s)
rec.write(sock)
if not s: break
注意:将
s = environ ['wsgi.input'] .read(chunk_size)
更改为s =''
,这是来自flup的一些wsgi相关内容的一部分。因此,它应该发送空stdin。另外,我已经修改了flup以
返回状态、标头、结果
。我已经检查了响应读取代码,它似乎很好:确实有来自fpm的空主体。我使用wireshark检查了网络通信,对我来说似乎很好-所有参数都被传输了。
有什么想法吗?
更新:
问题在于fastcgi参数过滤函数:它过滤掉许多有用的参数,如DOCUMENT_ROOT、SCRIPT_FILENAME等。在禁用此功能后,一切正常运行。
对于任何感兴趣的人,这里是修改后的客户端:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/lib/flup_fcgi_client.py,这里是使用示例:https://bitbucket.org/rvs/ztc/src/6ec59525156d/src/ztc/php/fpm.py。