我在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
答案 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一起工作! :)