uWSGI无法重新加载、重启或让我运行服务。

28

我有一个相当大的问题。

我对uwsgi非常陌生,不太确定如何调试这个问题,但我会提供我所知道的信息:

  • 我之前已经在这个配置上运行了网站,但突然间它不工作了。
  • 我正在运行皇帝模式。
  • 当我使用命令行运行我的ini文件时,它们是正常的,但似乎它们无法自动启动。

当我运行uwsgi reload时,

sudo service uwsgi reload

我遇到了这个错误

* Reloading app server(s) uwsgi
...fail!
那就是这样了。我什么都没有得到。
我在Stack Overflow上寻找了数小时,没有找到任何准确概述此问题的内容。我发现很多与用户的.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 来检查它是否正常工作了吗? - roberto
您使用的uWSGI版本是哪个? - Louis
@roberto 是的,它运行良好。 @Louis 1.9.x - Daniel Tate
2个回答

85

正确使用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

如果您使用pip,请先安装python-dev:

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

现在,你不再需要在ini文件中使用plugins=python了。

注意到了pip前面的sudo了吗?是的,uwsgi应该被安装在全局系统中。 如果你忘记在这里使用sudo,那么你可能会将其安装在虚拟环境中。 这没有意义,而且你可能会在运行时遇到麻烦。

使uwsgi成为守护进程

守护进程意味着让uwsgi在系统启动时以及后台运行。 根据你安装uwsgi的方式,有两种方法。

apt-get方式

当你在Ubuntu上安装uwsgi时通过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

如果你是通过pip安装uwsgi的,那么你只有可执行文件位于 /usr/local/bin/uwsgi ,你需要自己将其变成守护进程。

当你打开/etc/init.d/下的一些文件时,你可能会感到难过: 我只想注册uwsgi作为一个服务,为什么我需要编写这么长的脚本,看起来与其他脚本类似?这没有意义。

好消息是,在Upstart的帮助下很简单,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”,我为它创建了一个example.ini文件。然后,%n表示“example”。您不需要用真实名称替换它,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

就这些!


1
使用pip安装后,会安装2个文件:/usr/local/bin/uwsgi/usr/local/lib/python2.7/dist-packages/uwsgidecorators.py(如果忽略egg包的五个元数据文件)。使用apt-get应用程序则会安装220个文件 :) 从某种意义上说,我喜欢apt-get负责这么多事情,另一方面,pip设置更加透明,可以理解其工作原理。 - Mads Skjern
嗨。我想问一件事,与安装有关。也许你可以帮忙。 当使用pip安装uwsgi时,在ubuntu系统路径中它不会看到默认的python路径,原因不明。所以为了使其工作,您需要手动将所有这些在sys.path中的默认路径复制到PYTHONPATH中。否则,您会遇到导入错误。但是,当通过apt-get安装时,就没有这样的问题。有什么办法可以解决这个问题,而不需要像通过.bashrc添加所有这些路径那样使用肮脏的技巧吗?@guoqiao - Viktor
3
在venv中运行uwsgi为什么是“错误”的? Emperor模式和venv有什么区别?谢谢。 在venv中运行uwsgi被认为是“错误”的,因为venv旨在创建隔离的Python环境,以便安装和管理特定于项目的依赖项。如果在venv中运行uwsgi,将在该环境中安装uwsgi,这可能会干扰其他应用程序或项目。相比之下,Emperor模式将uwsgi与系统范围内的Python解释器一起使用,以避免此类冲突,并允许它同时处理多个应用程序。 - Andreas
2
你认为“在虚拟环境中使用uwsgi是不好的”这个想法是不正确的。事实上,在虚拟环境中运行是推荐的,可以使虚拟环境真正地虚拟化。正确配置upstart或systemd是关键。 - Nirmal
2
我已经还原了您删除所有内容的编辑。在处理这种高赞帖子的情况下,有更好的方法。 - Andy

0

基于教程中的样例应用程序栈:Flask/uWSGI/NGINX,提供uwsgi重启工具:

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文件、touch、sudo服务uwsgi重启方法等都无法解决此问题。在我的情况下,uWSGI不是一个服务,而是一个守护进程。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接