uWSGI在空闲后没有重启

时间:2017-08-01 12:24:12

标签: python uwsgi systemd

我在ubuntu 16上使用带有systemd的uwsgi。

我按照每个应用的一项服务的说明从这里开始:http://uwsgi-docs.readthedocs.io/en/latest/Systemd.html

如果我启动systemd套接字并进入该网站,那么每件事情都可以。 但是在空闲时间(在ini文件中指定)之后,uwsgi进程被杀死,并且进一步的请求似乎没有重新启动/重新激活该进程。

workers have been inactive for more than 30 seconds (1501589319-1501589288)
SIGINT/SIGQUIT received...killing workers...
worker 1 buried after 1 seconds
worker 2 buried after 1 seconds
goodbye to uWSGI.

这是我的ini档案:

[uwsgi]
module = wsgi

logto = /tmp/uwsgi.log

master = true
processes = 2
cheap = true
idle = 30
die-on-idle = true

manage-script-name = true

这是我的systemd套接字配置:

[Unit]
Description=Socket for uWSGI app

[Socket]
ListenStream=/var/run/uwsgi/myapp.socket
SocketUser=www-data
SocketGroup=www-data
SocketMode=0666

[Install]
WantedBy=sockets.target

这是我的systemd服务配置:

[Unit]
Description=uWSGI app
After=syslog.target

[Service]
ExecStart=/home/myapp/venv/bin/uwsgi \
        --ini /home/myapp/uwsgi/uwsgi.ini \
        --socket /var/run/uwsgi/myapp.socket
User=www-data
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
RuntimeDirectory=uwsgi
WorkingDirectory=/home/myapp

1 个答案:

答案 0 :(得分:3)

在摆弄了近一天之后,我在文档中找到了相关设置的答案。虽然它不是同一类型的设置,因为我不使用皇帝,它确实给了我一个发生了什么的线索。

套接字激活仅在第一次运行的原因是因为uwsgi会覆盖systemd套接字创建的套接字文件。

看绿色“!”此页面上的重要框: http://uwsgi-docs.readthedocs.io/en/latest/OnDemandVassals.html

它说:

  

如果你要在你的vassal配置中定义相同的套接字   emperor for on demand action,vassal将覆盖该套接字文件。   这可能会导致意外行为,例如在需求方面   激活那个附庸只会工作一次。

所以在我的情况下,我没有皇帝,但是系统就像皇帝一样。

那么解决方案是什么?

从systemd服务文件中的--socket中删除ExecStart参数。

而不是

ExecStart=/home/myapp/venv/bin/uwsgi \
        --ini /home/myapp/uwsgi/uwsgi.ini \
        --socket /var/run/uwsgi/myapp.socket

我把它改成了

ExecStart=/home/myapp/venv/bin/uwsgi \
        --ini /home/myapp/uwsgi/uwsgi.ini

之后我停止了systemd服务和套接字,做了一个systemctl daemon-reload并再次启动了systemd套接字。 Evrything开始按预期工作 - systemd套接字激活与uwsgi一起工作! :)