【问题标题】:uWSGI won't reload, restart or let me run serviceuWSGI 不会重新加载、重启或让我运行服务
【发布时间】:2014-05-29 05:22:16
【问题描述】:

我有一个相当大的问题。

我是 uwsgi 的新手,我不能 100% 确定如何调试这个问题,但我会告诉你我在哪里。

  • 我以前有网站使用此配置,但突然无法正常工作。
  • 我正在运行皇帝模式。
  • 当我使用命令行运行它们时,我的 ini 文件正常,但它们似乎不会自动启动

当我运行uwsgi reload

sudo service uwsgi reload

我收到此错误

* Reloading app server(s) uwsgi
...fail!

就是这样。我什么也得不到。

我一直在寻找有关堆栈溢出的几个小时,但没有找到任何可以准确描述此问题的内容,我发现与 peoples .ini 文件有很大关系,但我知道这不是我的问题,因为当通过手动运行我的网站时uwsgi --ini MYINI.ini 然后访问它运行得很好,问题出在 uWSGI 中,我不知道如何找到解决方案。我查看了文档,找不到关于这个特定错误的任何信息。

如果有人感兴趣,这里是我的 uwsgi-server.conf 文件

description     "uWSGI Emperor"

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

respawn

env LOGTO=/var/log/uwsgi.log
env BINPATH=/usr/local/bin/uwsgi

exec $BINPATH --emperor /etc/uwsgi/vassals --logto $LOGTO

任何见解将不胜感激。我觉得我错过了一些东西,但是对 uWSGI 太陌生了,我什至无法猜测它可能是什么,对我来说,根据文档,这一切看起来都不错。

如果您需要有关我的设置的更多信息,请尽管询问。

【问题讨论】:

  • 您是否尝试过运行 /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals 来检查它是否运行良好?
  • 什么版本的uwsgi?
  • @roberto 是的,它工作正常@Louis 1.9.x

标签: django wsgi uwsgi


【解决方案1】:

基于示例应用程序堆栈的 uwsgi 重启工具:来自教程的 Flask/uWSGI/NGINX:

https://iotbytes.wordpress.com/python-flask-web-application-on-raspberry-pi-with-nginx-and-uwsgi/

GIT: https://github.com/mmossak/uwsgi_restart.git

节省一些时间并使任务相当容易。只需确保使用应用程序设置自定义脚本(尤其是启动 uwsgi)。它只会重新启动 uWSGI。

用于我的 Raspbery Pi 项目的应用程序与温度传感器交互,该传感器能够向树莓派发送 GET 请求。

更改 Ini 文件、触摸、sudo service uwsgi 重启方法等对此无济于事。就我而言,uWSGI 不是服务。这是一个守护进程。

您需要终止 uwsgi 主进程并重新启动才能看到应用程序的更改。

【讨论】:

    【解决方案2】:

    正确使用uwsgi

    在 ubuntu 服务器上使用 uwsgi 部署 django 站点非常简单,但是在出错之前你还是需要了解一些事情。

    安装

    在 ubuntu 上安装 uwsgi 有两种方法:apt-get 或 pip

    apt-get

    如果使用apt-get,需要安装python插件:

    sudo apt-get install uwsgi-plugin-python
    sudo apt-get install uwsgi
    

    并且,在您网站的 uwsgi ini 文件中,您需要添加以下内容:

    plugins=python

    点

    如果使用pip,需要先安装python-dev:

    sudo apt-get install python-dev
    sudo pip install uwsgi
    

    而且,您不再需要 ini 文件中的 plugins=python。

    看到 pip 之前的 sudo 了吗?是的,uwsgi 应该安装在全局系统中。 如果你错过了这里的 sudo,你可以将它安装在你的 virtualenv 中。 它没有意义,您可能无法运行它。

    守护 uwsgi

    Daemonize 意味着使 uwsgi 在系统启动时和后台运行。 根据你安装uwsgi的方式,有两种方式。

    apt-get

    当您在 ubuntu 上 apt-get install uwsgi 时,它会自动安装为服务。神奇之处在于这个文件:

    /etc/init.d/uwsgi
    

    /etc/init.d 中的文件将由 sysvinit 加载。然后你可以像这样管理你的 uwsgi 服务:

    sudo /etc/init.d/uwsgi start|stop|restart|reload
    

    或:

    sudo service uwsgi start|stop|restart|reload
    

    service命令可以找到sysvinit管理的服务

    点

    如果你的uwsgi是pip安装的,你只有/usr/local/bin/uwsgi里面的可执行文件,需要自己去守护。

    当您打开/etc/init.d/中的一些文件时,您可能会感到难过: 我只是想将uwsgi注册为服务,为什么我需要写这么长的脚本,看起来和其他的很相似?这没有意义。

    好消息是,在 Upstart 的帮助下,它非常简单,它是 sysvinit 的替代品。它使用/etc/init/ 而不是/etc/init.d/。

    只需创建一个文件/etc/init/uwsgi.conf,内容如下:

    description "uWSGI Emperor"
    start on runlevel [2345]
    stop on runlevel [!2345]
    respawn
    exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals/ --logto /var/log/uwsgi.log
    

    然后,您可以像这样管理您的 uwsgi 进程:

    sudo initctl start|stop|restart|reload| uwsgi
    

    或者,还是这样:

    sudo service uwsgi start|stop|restart|reload
    

    是的,如您所见,service 命令很智能,它可以使用相同的命令管理来自 sysvinit 和 Upstart 的服务。

    如果你同时拥有/etc/init.d/uwsgi 和/etc/init/uwsgi.conf,当你说:

    sudo service uwsgi restart
    

    它将重新启动 Upstart 文件 /etc/init/uwsgi.conf。 sysvinit 将被忽略,或类似的东西。

    为您的站点配置uwsgi

    推荐大家使用 pip 和 Upstart 方式,比 apt-get 方式好很多。

    如果是这样,你使用的是uwsgi的帝王模式,非常好用,功能强大。

    现在,您可以像这样在/etc/uwsgi/vassals/ 中创建一个ini文件:

    [uwsgi]
    virtualenv=/path/to/venv/
    chdir=/path/to/proj/root
    module=wsgi:application
    env=DJANGO_SETTINGS_MODULE=settings
    master=True
    vacuum=True
    socket=/tmp/%n.sock
    pidfile=/tmp/%n.pid
    daemonize=/var/log/uwsgi/%n.log
    

    %n 表示您的文件名。例如,我的项目名称是'example',我为它创建了一个example.ini 文件。然后%n 表示“示例”。你不需要用真实姓名替换它。 uwsgi 会为你做这件事。

    然后重启或者重新加载uwsgi:

    sudo service uwsgi restart
    

    检查您的套接字文件:

    ll /tmp/*.sock
    

    如果它在那里,你现在使用 uwsgi 成功了:)

    您网站的 nginx 配置

    以域名example.com为例:

    server {
        listen          80;
        server_name     www.example.com;
        return          301 $scheme://example.com$request_uri;
    }
    
    server {
        listen 80;
        charset utf-8;
        server_name example.com;
    
        location  /static/ {
            alias  /path/to/static/;
        }
    
        location  /media/ {
            alias /path/to/media/;
        }
    
        location / {
            try_files $uri @django;
        }
    
        location @django {
           uwsgi_pass unix:///tmp/example.sock;
           include uwsgi_params;
        }
    }
    

    重启nginx,你会看到你的站点!

    回答你的问题

    你的 uwsgi 配置文件是 /etc/init/uwsgi-server.conf 所以,你应该使用的名字是uwsgi-server,而不是uwsgi

    你需要像这样重启你的 uwsgi Emperor 实例:

    sudo initctl restart uwsgi-server
    

    或:

    sudo service uwsgi-server restart
    

    就是这样!

    【讨论】:

    • 使用 pip,安装了 2 个文件:/usr/local/bin/uwsgi 和 /usr/local/lib/python2.7/dist-packages/uwsgidecorators.py(如果我们忽略 egg 包的五个元数据文件)。使用安装的 apt-get app 220 文件 :) 从某种意义上说,我喜欢 apt-get 照顾这么多,另一方面,pip 设置更加透明,并且可以理解它是如何工作的。
    • 嗨。我想问一件事,与安装有关。也许你可以帮忙。当由于某种原因使用 pip 安装 uwsgi 时,它在 ubuntu 的系统路径中看不到默认的 python 路径。因此,为了使其正常工作,您需要手动将 sys.path 中的所有默认路径复制到 PYTHONPATH。否则你会得到导入错误。但是通过 apt-get 安装时没有这样的问题。知道如何在不使用诸如通过 .bashrc 将所有这些路径添加到 PYTHONPATH 的肮脏技巧的情况下解决此问题吗?@guoqiao
    • 为什么在 venv 中运行 uwsgi 是“错误的”?您能否详细说明一下皇帝模式与 venv 的关系?谢谢
    • 您对“venv 中的 uwsgi 不好”的想法是不正确的。事实上,建议在 venv 内部运行,并使 venv 真正虚拟化。正确配置 upstart 或 systemd 是关键。
    • 我已回滚您删除所有内容的编辑。有更好的方法来处理这种情况,特别是对于这样一个高度赞成的帖子。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 2015-03-04
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多