uWSGI不会重新加载,重新启动或让我运行服务

时间:2014-04-15 02:46:58

标签: django wsgi uwsgi

我有一个相当大的问题。

我对uwsgi很新,并不是100%确定如何调试此问题,但我会告诉您有关我所处位置的信息。

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

当我运行uwsgi reload

sudo service uwsgi reload

我收到此错误

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

多数民众赞成。我什么都没得到。

我一直在寻找堆栈溢出的时间,并且没有找到任何完全勾勒出这个问题的东西,我发现很多与人.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这么新,我甚至无法猜测它是什么,对我来说,根据文档,这一切看起来都不错。

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

1 个答案:

答案 0 :(得分:72)

以正确的方式使用uwsgi

使用uwsgi在ubuntu服务器上删除django网站非常简单,但在犯错之前还有一些事情你需要知道。

安装

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

易于得到

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

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

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

plugins=python

PIP

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

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

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

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

daemonize uwsgi

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

易于得到

当您在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管理的服务

PIP

如果utsgi是由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的emperor模式,这非常方便和强大。

现在,您可以在/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.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

这就是全部!