flask - uWSGI 作为进程而不是守护进程工作

标签 flask ubuntu-12.04 uwsgi

对于我当前的 flask 部署,我必须设置一个 uwsgi 服务器。
这就是我创建 uwsgi 守护进程的方式:
sudo vim /etc/init/uwsgi.conf

# file: /etc/init/uwsgi.conf
description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]
respawn

exec /myproject/myproject-env/bin/uwsgi --uid www-data --gid www-data --home /myproject/myproject-env/site/F11/Engineering/  --socket /tmp/uwsgi.sock --chmod-socket --module F11 --callable app --pythonpath /myproject/myproject-env/site/F11/Engineering/ -H /myproject/myproject-env

但是成功运行后:sudo start uwsgi
uwsgi start/running, process 1286

并尝试通过浏览器访问应用程序:

我得到一个 502坏网关

以及 nginx error.log 中的错误条目:

2013/06/13 23:47:28 [error] 743#0: *296 upstream prematurely closed connection while reading response header from upstream, client: xx.161.xx.228, server: myproject.com, request: "GET /show_records/2013/6 HTTP/1.1", upstream: "uwsgi://unix:///tmp/uwsgi.sock:", host: "myproject.com"



但是 sock 文件有它需要的权限:
srw-rw-rw- 1 www-data www-data 0 Jun 13 23:46 /tmp/uwsgi.sock

如果我运行 exec命令从上面的命令行作为一个进程,它工作得很好。为什么守护进程不能正常工作?

顺便说一句,Nginx 正在运行vim /etc/nginx/nginx.conf
user www-data;

vim /etc/nginx/sites-available/default
location / {
                uwsgi_pass   unix:///tmp/uwsgi.sock;
                include        uwsgi_params;
        }

它以 sudo service nginx start 开头

我在 Ubuntu 12.04 LTS 上运行这个.

我希望我已经提供了所有必要的数据,希望有人能指导我走向正确的方向。谢谢。

最佳答案

最后我在工作了近 2 天后解决了这个问题。我希望这个解决方案能帮助遇到类似问题的其他 Flask/uwsgi 用户。

我有两个主要问题导致了这种情况。

1)发现守护进程问题的最好方法显然是一个日志文件和一个更清晰的结构。
sudo vim /etc/init/uwsgi.conf
将守护程序脚本更改为以下内容:

# file: /etc/init/uwsgi.conf
description "uWSGI server"

start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /home/ubuntu/uwsgi-1.9.12/uwsgi -c /myproject/uwsgi.ini
vim /myproject/uwsgi.ini
[uwsgi]
socket = /tmp/uwsgi.sock
master = true
enable-threads = true
processes = 5
chdir= /myproject/F11/Engineering
module=F11:app
virtualenv = /myproject/myproject-env/
uid =  www-data
gid = www-data
logto = /myproject/error.log

这是设置守护进程的更简洁的方式。还要注意最后一行如何设置日志文件。最初我将日志文件设置为 /var/log/uwsgi/error.log .经过大量的汗水和泪水后,我意识到守护进程正在运行 www-data因此无法访问 /var/log/uwsgi/error.log因为 error.log 归 root:root 所有.这让 uwsgi 无声无息地失败了。

我发现将日志文件指向我自己的 /myproject 效率更高,其中守护进程保证访问为 www-data .并且不要忘记让 www-data 可以访问整个项目否则守护进程将失败并返回 Internal Server error message . -->
sudo chown www-data:www-data -R /myproject/

重启 uwsgi 守护进程:
sudo service uwsgi restart

2) 现在您需要注意三个日志文件:
  • tail -f /var/log/upstart/uwsgi.log --> 启动时显示守护进程的问题
  • tail -f /var/log/nginx/error.log --> wsgi访问被拒绝时显示权限问题,通常是因为/tmp/uwsgi.sock文件归 root 所有而不是 www-data .在这种情况下,只需删除 sock 文件 sudo rm /tmp/uwsgi.sock
  • tail -f /myproject/error.log --> 显示 uwsgi 在您的应用程序中抛出的错误

  • 日志文件的这种组合帮助我弄清楚我的 Flask 应用程序中的 Flask-Babel 也有一个错误的导入。从这个意义上说,我利用库的方式是回退到系统的语言环境来确定日期时间格式。
    File "/myproject/F11/Engineering/f11_app/templates/show_records.html", line 25, in block "body"
        <td>{{ record.record_date|format_date }}</td>
      File "./f11_app/filters.py", line 7, in format_date
        day = babel_dates.format_date(value, "EE")
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 459, in format_date
        return pattern.apply(date, locale)
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 702, in apply
        return self % DateTimeFormat(datetime, locale)
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 699, in __mod__
        return self.format % other
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 734, in __getitem__
        return self.format_weekday(char, num)
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 821, in format_weekday
        return get_day_names(width, context, self.locale)[weekday]
      File "/myproject/myproject-env/local/lib/python2.7/site-packages/babel/dates.py", line 69, in get_day_names
        return Locale.parse(locale).days[context][width]
    AttributeError: 'NoneType' object has no attribute 'days'
    

    这是我使用 Flask 过滤器的方式:
    import babel.dates as babel_dates
    
    @app.template_filter('format_date')
    def format_date(value):
        day = babel_dates.format_date(value, "EE")
        return '{0} {1}'.format(day.upper(), affix(value.day))
    

    最奇怪的是,这段代码在开发环境中运行得非常好(!)。从命令行将 uwsgi 作为 root 进程运行时,它甚至可以正常工作。但是当由 www-data 守护进程运行时它会失败。这一定与语言环境的设置方式有关,Flask-Babel 试图回退到该语言环境。

    当我像这样更改导入时,它最终与守护进程一起工作:
    from flask.ext.babel import format_date  
    
    @app.template_filter('format_date1')
    def format_date1(value):
        day = format_date(value, "EE")
        return '{0} {1}'.format(day.upper(), affix(value.day))
    

    因此,在使用 Eclipse/Aptana Studio 时要小心,因为它试图为代码中的类选择正确的命名空间。它真的可以变得丑陋。

    从 2 天起,它现在作为 Amazon Ec2 (Ubuntu 12.04) 上的 uwsgi 守护程序运行得非常好。我希望这种经验可以帮助 Python 开发人员。

    关于flask - uWSGI 作为进程而不是守护进程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099114/

    相关文章:

    python - 使用 Flask/Postgres 安装 psycopg2

    python - 'HTTP 错误 400 : Bad Request' with Python Bottlenose

    python - uWSGI虚拟主机问题

    nginx - 如何使用 nginx 部署 web2py?

    sdl - 如何在 Ubuntu 12.04.1 LTS 上安装 SDL_image?

    python - Docker-Compose NGINX/uWSGI/Flask 绑定(bind)挂载问题

    python - 从 flask_ldap3_login 的 current_user.get_id() 中提取 uid 的正确方法?

    python - 在 docker 容器内运行 Flask 应用程序时无法访问端点

    python - 使用 python 和 OpenCV 加载上传的图像而不保存到硬盘

    python-2.7 - 如何在 Ubuntu 12.04 中删除 Python 版本?