【问题标题】:web.py + lighttpd + matplotlib not workingweb.py + lighttpd + matplotlib 不工作
【发布时间】:2010-12-24 00:34:09
【问题描述】:

我正在尝试使用 lighttpd 部署我的 web.py 应用程序。导入matplotlib就不行了。

这行得通...

你好.py:

#!/usr/bin/python

import web

# Say hello.
class Index:
    def GET(self): return 'hello web.py'
if __name__ == "__main__":
    app = web.application(('/*', 'Index'), globals())
    app.run()

/etc/init.d/lighttpd restart

我访问我的网站并查看“hello web.py”。

但是,如果我将 import matplotlib 添加到 hello.py 并重新启动服务器,那么当我访问该站点时,我会收到 500 - Internal Server Error。

这里是/var/log/lighttpd/error.log

2010-12-24 00:17:31: (log.c.166) server started
2010-12-24 00:17:42: (mod_fastcgi.c.1734) connect failed: Connection refused on
unix:/tmp/fastcgi.socket-0
2010-12-24 00:17:42: (mod_fastcgi.c.3037) backend died; we'll disable it for 1 s
econds and send the request to another backend instead: reconnects: 0 load: 1
2010-12-24 00:17:43: (mod_fastcgi.c.2582) unexpected end-of-file (perhaps the fa
stcgi process died): pid: 4074 socket: unix:/tmp/fastcgi.socket-0
2010-12-24 00:17:43: (mod_fastcgi.c.3320) child exited, pid: 4074 status: 1
2010-12-24 00:17:43: (mod_fastcgi.c.3367) response not received, request sent: 9
53 on socket: unix:/tmp/fastcgi.socket-0 for /hello.py?, closing connection
2010-12-24 00:20:30: (server.c.1503) server stopped by UID = 0 PID = 4095
2010-12-24 00:20:30: (log.c.166) server started

-- 编辑--

这是我的 lighttpd.conf:http://pastebin.com/n6sG5z9K

很确定这只是默认设置(除了我设置了server.document-root = "/var/www/hello/"

这是我的 fastcgi.conf:

server.modules   += ( "mod_fastcgi" )
server.modules   += ( "mod_rewrite" )

fastcgi.server = ( "/hello.py" =>
 (( "socket" => "/tmp/fastcgi.socket",
    "bin-path" => "/usr/bin/python /var/www/hello/hello.py",
    "max-procs" => 1,
   "bin-environment" => (
     "REAL_SCRIPT_NAME" => ""
   ),
   "check-local" => "disable"
 ))
 )

url.rewrite-once = (
   "^/favicon.ico$" => "/static/favicon.ico",
   "^/static/(.*)$" => "/static/$1",
   "^/(.*)$" => "/hello.py/$1",
 )

有什么建议吗?

【问题讨论】:

    标签: python matplotlib lighttpd web.py


    【解决方案1】:

    今天偶然发现了这个(使用 Apache,但很可能是完全相同的问题)。我从脚本中重定向了 stdout 和 stderr 以查看发生了什么,问题是 matplotlib 正在尝试创建一个文件:

    Traceback (most recent call last):
      File "/home/ec2-user/dlea/src/dla.py", line 24, in <module>
        import dbm
      File "/home/ec2-user/dlea/src/dbm.py", line 7, in <module>
        import matplotlib
      File "/usr/lib64/python2.6/site-packages/matplotlib/__init__.py", line 709, in <module>
        rcParams = rc_params()
      File "/usr/lib64/python2.6/site-packages/matplotlib/__init__.py", line 627, in rc_params
        fname = matplotlib_fname()
      File "/usr/lib64/python2.6/site-packages/matplotlib/__init__.py", line 565, in matplotlib_fname
        fname = os.path.join(get_configdir(), 'matplotlibrc')
      File "/usr/lib64/python2.6/site-packages/matplotlib/__init__.py", line 240, in wrapper
        ret = func(*args, **kwargs)
      File "/usr/lib64/python2.6/site-packages/matplotlib/__init__.py", line 439, in _get_configdir
        raise RuntimeError("Failed to create %s/.matplotlib; consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data"%h)
    RuntimeError: Failed to create /var/www/.matplotlib; consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data
    

    由于它是作为用户 httpd (Apache) 运行的,它会尝试在 /var/www/ 中创建文件,该文件是 root 拥有的,并且不能由 Apache 用户写入。

    一个有效的解决方案就像在导入 matplotlib 之前将 MPLCONFIGDIR 设置为临时目录一样简单:

    import os
    import tempfile
    os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp()
    import matplotlib
    

    为了跟踪问题,我将 stdout 和 stderr 重定向到某个日志文件以查看发生了什么:

    sys.stdout = open("/var/log/dla_stdout.txt", 'a')
    sys.stderr = open("/var/log/dla_stderr.txt", 'a')
    

    我实际上从另一个 StackOverflow 问题中得到了解决方案:Setting Matplotlib MPLCONFIGDIR: consider setting MPLCONFIGDIR to a writable directory for matplotlib configuration data

    【讨论】:

    • 这是很久以前的事了,我真的无法测试这个答案,所以我只是假设它是正确的:)
    【解决方案2】:

    我正在遵循这个食谱:http://webpy.org/cookbook/fastcgi-lighttpd

    我忽略了此线程顶部的链接:http://www.mail-archive.com/webpy@googlegroups.com/msg02800.html

    该线程有解决方案。我像这样运行python进程:

    /var/www/hello.py fastcgi 9080

    然后像这样设置我的fastcgi.conf

     fastcgi.server = ( "/hello.py" =>
         ((
            "host" => "127.0.0.1",
            "port" => 9080,
            "check-local" => "disable"
        ))
     )
    

    然后就可以了。 (仍然不确定我是否已正确配置所有内容,但似乎一切正常。)

    【讨论】:

      【解决方案3】:

      我通过以下方式解决问题:

      pip install flup
      

      不需要

      /var/www/hello.py fastcgi 9080
      

      我的系统是:amazon ec2,ubuntu 10.04
      lighttpd:1.4.26

      【讨论】:

        【解决方案4】:

        我的第一个猜测是你得到了一个ImportError,因为matplotlib 没有正确安装或者不在PYTHONPATH 或其他一些疯狂的东西上。唯一确定的方法是查看回溯。它显示你正在运行 fastcgi,这意味着 python 代码正在另一个进程中执行。因此,您无法在 lighttpd 日志中找到回溯。

        你是如何运行 fastcgi 进程的?回溯将被写入其标准错误。您也可以考虑使用supervisord。它支持将 stderr 重定向到日志文件和其他各种使创建守护进程更容易的东西。

        【讨论】:

        • 我只是在启用 fastcgi 的情况下运行 lighttpd。我猜 lighttpd 处理在幕后产生的过程?我编辑了我的问题以显示我的 fast-cgi.conf。这些帮助有用?另外,我不太了解supervisord如何适应所有这些......对不起,如果我很愚蠢,我对这些东西还是很陌生。
        猜你喜欢
        • 1970-01-01
        • 2011-05-30
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 2011-09-14
        • 2021-07-06
        • 2022-11-08
        • 1970-01-01
        相关资源
        最近更新 更多