uWSGI不会重装,重启或让我跑服务

Dan*_*ate 24 django wsgi uwsgi

我有一个相当大的问题.

我很新的uwsgi和我不是100%确定如何调试这个问题,但我会给你我在哪里的信息.

  • 我以前工作过此配置,突然它是不工作的网站.
  • 我运行皇帝模式.
  • 当我使用命令行运行它们时,我的ini文件是可以的,但似乎它们不会自动启动

我跑的时候 uwsgi reload

sudo service uwsgi reload
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

* Reloading app server(s) uwsgi
...fail!
Run Code Online (Sandbox Code Playgroud)

而已.我得到没有别的.

我一直在寻找在堆栈溢出小时,并没有发现任何东西,正好概括了这个问题,我发现很多事情要做人民的.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
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激.我觉得我失去了一些东西,但这么新的与uWSGI我甚至不能猜测它可能是什么,对我来说这一切看起来OK按文档.

如果您需要在我设置的任何详细信息,请只问.

guo*_*iao 75

正确使用uwsgi

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

安装

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

apt-get的

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

sudo apt-get install uwsgi-plugin-python
sudo apt-get install uwsgi
Run Code Online (Sandbox Code Playgroud)

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

plugins=python

果仁

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

sudo apt-get install python-dev
sudo pip install uwsgi
Run Code Online (Sandbox Code Playgroud)

并且,您不再需要plugins=pythonin ini文件.

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

daemonize uwsgi

Daemonize意味着使uwsgi在系统启动和后台运行.根据你如何安装uwsgi,你有两种方法.

apt-get的

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

/etc/init.d/uwsgi
Run Code Online (Sandbox Code Playgroud)

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

sudo /etc/init.d/uwsgi start|stop|restart|reload
Run Code Online (Sandbox Code Playgroud)

要么:

sudo service uwsgi start|stop|restart|reload
Run Code Online (Sandbox Code Playgroud)

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

果仁

如果您通过pip安装uwsgi,那么您只有可执行文件/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
Run Code Online (Sandbox Code Playgroud)

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

sudo initctl start|stop|restart|reload| uwsgi
Run Code Online (Sandbox Code Playgroud)

或者,仍然这样:

sudo service uwsgi start|stop|restart|reload
Run Code Online (Sandbox Code Playgroud)

是的,正如您所看到的,service命令是智能的,它可以使用相同的命令从sysvinit和Upstart管理服务.

而且,如果你同时/etc/init.d/uwsgi/etc/init/uwsgi.conf,当你说:

sudo service uwsgi restart
Run Code Online (Sandbox Code Playgroud)

它将重新启动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
Run Code Online (Sandbox Code Playgroud)

%n意味着你的文件名.例如,我的项目名称是'example',我example.ini为它创建了一个文件.然后%n是'示例'.您无需使用真实名称替换它.uwsgi会为你做这件事.

然后重启或重新加载uwsgi:

sudo service uwsgi restart
Run Code Online (Sandbox Code Playgroud)

检查你的套接字文件:

ll /tmp/*.sock
Run Code Online (Sandbox Code Playgroud)

如果它在那里,你现在成功使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

回答你的问题

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

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

sudo initctl restart uwsgi-server
Run Code Online (Sandbox Code Playgroud)

要么:

sudo service uwsgi-server restart
Run Code Online (Sandbox Code Playgroud)

就这样!

  • 为什么uwsgi在venv中运行是"错误的"?你能否详细说明皇帝模式与venv?谢谢 (2认同)
  • 您关于“venv 中的 uwsgi 不好”的想法是不正确的。事实上,建议在 venv 内运行,这使 venv 真正虚拟。正确配置 upstart 或 systemd 是关键。 (2认同)
  • 我已撤消您删除所有内容的修改。有更好的方法来处理这种情况,尤其是在职位高度评价的情况下。 (2认同)