首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行nginx + python flask +python-daemon时:上游发送不支持的FastCGI协议版本91

运行nginx + python flask +python-daemon时:上游发送不支持的FastCGI协议版本91
EN

Stack Overflow用户
提问于 2012-05-09 20:23:22
回答 1查看 2.3K关注 0票数 3

我正在使用Python Flask通过nginx的FCGI运行Python for web。我的fcgi后端设置如下:

代码语言:javascript
复制
#!/usr/bin/env python
import argparse, daemon, os
from flup.server.fcgi import WSGIServer
from fwd_msg import app

SOCKET_LOCATION = '/tmp/fingerprinter-fcgi.sock'

if __name__ == '__main__':
    # arg parse (and daemonize)
    arg_parser = argparse.ArgumentParser()
    arg_parser.add_argument('--daemon', action='store_true', default=False, help='Run as daemon')
    arg_parser.add_argument('--cwd', action='store', default='/', 
                            help='Full path of the working directory to which the process should change on daemon start.')
    arg_parser.add_argument('--uid', action='store', type=int, default=os.getuid(),
        help='The user ID ("UID") value and group ID ("GID") value to switch the process to on daemon start.')
    args = vars(arg_parser.parse_args())

    if args['daemon']:
        context = daemon.DaemonContext(working_directory=args['cwd'], uid=args['uid'])
        with context:
            WSGIServer(app, bindAddress=SOCKET_LOCATION).run()
    else:
        WSGIServer(app, bindAddress=SOCKET_LOCATION).run()

如果我不使用守护程序参数来运行WSGIServer,它就能正常工作。

但是如果我用守护进程参数运行它,我会在nginx日志中得到这个错误,而任何对服务器的请求都会显示"502 BAD GATEWAY":

代码语言:javascript
复制
2012/05/09 12:16:00 [error] 30895#0: *30 upstream sent unsupported FastCGI protocol version: 91 while reading response header from upstream, client: XXX.XXX.XXX.XXX, server: localhost, request: "POST / HTTP/1.1", upstream: "fastcgi://unix:/tmp/fingerprinter-fcgi.sock:", host: "XXX.XXX.XXX.XXX"

你知道为什么会发生这种情况吗?如何防止呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-11 22:59:48

结果是DaemonContext关闭了所有打开的文件描述符,所以基本上应该有一个函数,它实例化WSGIServer,以及应用程序а和所有可以在DaemonContext中打开文件描述符的东西。

还要确保工作目录属于用户所有,或者至少具有允许具有给定UID的用户在其中写入的权限(不推荐)。

示例:

代码语言:javascript
复制
#!/usr/bin/env python
import argparse, daemon, os
from flup.server.fcgi import WSGIServer
from fwd_msg import app

SOCKET_LOCATION = '/tmp/fingerprinter-fcgi.sock'

def main():
    app = flask.Flask(__name__)
    @app.route('/', methods=['GET'])
    def index():
        pass # your actions here

if __name__ == '__main__':
    # arg parse (and daemonize)
    arg_parser = argparse.ArgumentParser()
    arg_parser.add_argument('--daemon', action='store_true', default=False, help='Run as daemon')
    arg_parser.add_argument('--cwd', action='store', default='/', 
                            help='Full path of the working directory to which the process should change on daemon start.')
    arg_parser.add_argument('--uid', action='store', type=int, default=os.getuid(),
        help='The user ID ("UID") value and group ID ("GID") value to switch the process to on daemon start.')
    args = vars(arg_parser.parse_args())

    if args['daemon']:
        context = daemon.DaemonContext(working_directory=args['cwd'], uid=args['uid'])
        with context:
            main()
    else:
        main()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10516007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档