【问题标题】:Python fastcgi clientPython fastcgi 客户端
【发布时间】:2011-07-23 16:13:39
【问题描述】:

我正在 python 上编写一个用于监控 fastcgi 应用程序的工具。我需要从 fastcgi 做的唯一事情就是加载 ping 和状态页面(如果失败则返回某种错误)。

有很多库(从 python-fasctgi 绑定到twisted)似乎能够做到这一点,但是对于我的目的来说,它们中的大多数只是矫枉过正,而且它们中的许多会让我产生额外的依赖关系,从而导致一些打包问题。

那么,是否有任何简单的 python fastcgi client 实现/库易于安装/打包(到 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='' 而不是s = environ['wsgi.input'].read(chunk_size),这是flup 中一些与wsgi 相关的内容的一部分。所以它应该发送空的标准输入。

另外,我将flup修改为return status, headers, result

我检查了响应阅读代码,似乎没问题:fpm 的正文确实是空的。我已经检查了与 wireshard 的网络通信,这对我来说似乎很好 - 所有参数都在传输。

有什么想法吗?

更新

问题在于 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 client fastcgi


    【解决方案1】:

    虽然flup 主要用作fastcgi 服务器,但它也包括一个fastcgi 客户端。

    http://hg.saddi.com/flup-server/file/tip/flup/client/fcgi_app.py

    它似乎是一个没有依赖关系的单文件独立实现。它有一个许可许可证。

    【讨论】:

    • 嗯,在更改了一些代码(注释 stdin 处理)后,我能够连接到 fastcgi 服务器,但无法得到答案 - 由于某种原因,它总是返回 200 且正文为空。任何想法为什么?
    • 在我看来,stdin 处理是将输入传递给 FCGI 服务器的原因,因此如果您将其注释掉,您可能会发送一个空请求。
    • 我实际上没有评论,只是发送空的标准输入。如果我理解正确(来自 fascgi 协议文档和 php-fpm 源代码),stdin 仅用于传递发布数据,所有其他信息都通过参数传递。请编辑问题并提供更多详细信息。
    • 哦,没关系 - 问题不在于标准输入,而是某些 FASTCGI_PARAMS 因某种原因被flup过滤。
    • fcgi_app.py 依赖于 WSGIServer,JFYI。
    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 2011-03-18
    • 2016-04-07
    • 2016-10-07
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多