Django Can';t使用systemd运行uwsgi.ini文件

Django Can';t使用systemd运行uwsgi.ini文件,django,uwsgi,systemd,Django,Uwsgi,Systemd,我正在尝试设置uwsgi.service,以便在带有Fedora24的Linode上运行systemd for Django 1.10 /etc/systemd/system/uwsgi.service [Unit] Description=uWSGI Emperor After=syslog.target [Service] ExecStart=/home/ofey/djangoenv/bin/uwsgi --ini /etc/uwsgi/emperor.ini Restart=always

我正在尝试设置uwsgi.service,以便在带有Fedora24的Linode上运行systemd for Django 1.10

/etc/systemd/system/uwsgi.service

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

[Service]
ExecStart=/home/ofey/djangoenv/bin/uwsgi --ini /etc/uwsgi/emperor.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
这就应该叫,, /etc/uwsgi/emporer.ini

[uwsgi]
emperor = /etc/uwsgi/vassals
uid = www-data
gid = www-data
limit-as = 1024
logto = /tmp/uwsgi.log
然后我使用一个符号链接

$ sudo ln -s /home/ofey/djangoForum/django.ini /etc/uwsgi/vassals/
到 /home/ofey/djangoform/django.ini

[uwsgi]
project = djangoForum
base = /home/ofey

chdir = %(base)/%(project)
home = %(base)/djangoenv
module = crudProject.wsgi:application

master = true
processes = 2

socket = 127.0.0.1:3031
chmod-socket = 664
vacuum = true
我重新开始了所有的工作

$ sudo systemctl daemon-reload
$ sudo systemctl restart nginx.service
$ sudo systemctl retart uwsgi.service
最后一个命令给出

Job for uwsgi.service failed because the control process exited with error code. See "systemctl status uwsgi.service" and "journalctl -xe" for details.

$ sudo systemctl status uwsgi.service

● uwsgi.service - uWSGI Emperor
   Loaded: loaded (/etc/systemd/system/uwsgi.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Dec 07 23:56:28 ofeyspi systemd[1]: Starting uWSGI Emperor...
Dec 07 23:56:28 ofeyspi uwsgi[7834]: [uWSGI] getting INI configuration from /etc/uwsgi/emperor.ini
Dec 07 23:56:28 ofeyspi systemd[1]: uwsgi.service: Main process exited, code=exited, status=1/FAILURE
Dec 07 23:56:28 ofeyspi systemd[1]: Failed to start uWSGI Emperor.
Dec 07 23:56:28 ofeyspi systemd[1]: uwsgi.service: Unit entered failed state.
Dec 07 23:56:28 ofeyspi systemd[1]: uwsgi.service: Failed with result 'exit-code'.
Dec 07 23:56:28 ofeyspi systemd[1]: uwsgi.service: Service hold-off time over, scheduling restart.
Dec 07 23:56:28 ofeyspi systemd[1]: Stopped uWSGI Emperor.
Dec 07 23:56:28 ofeyspi systemd[1]: uwsgi.service: Start request repeated too quickly.
Dec 07 23:56:28 ofeyspi systemd[1]: Failed to start uWSGI Emperor.
我不明白为什么uwsgi.service不能运行

uwsgi在我没有通过systemd而是使用

$sudo--ini django.ini

建议将
RuntimeDirectory=uwsgi
添加到您的服务文件中。试着加上这个

[uwsgi]
project = djangoForum
base = /home/ofey

chdir = %(base)/%(project)
home = %(base)/djangoenv
module = crudProject.wsgi:application

master = true
processes = 2

socket = 127.0.0.1:3031
chmod-socket = 664
vacuum = true
还要检查
/tmp/uwsgi.log
,查看是否在那里生成了日志记录

建议将
RuntimeDirectory=uwsgi
添加到您的服务文件中。试着加上这个


还要检查
/tmp/uwsgi.log
,查看是否在那里生成了日志记录

最可能的原因是皇帝不能:

  • 创建.pid文件以写入processID
  • 为附庸创建unix套接字文件(似乎不是您的情况,因为您使用的是:3031端口)
  • 写入
    --logto
    选项指定的日志文件(/tmp/uwsgi.log)
  • 当这些文件中的任何一个存在并且由另一个用户(很可能是root用户)拥有,或者位于启动服务的用户无法写入的目录中时,通常会发生这种情况

    Systemd的状态日志对此主题的信息不多。因此,识别案例的最快方法是从systemd的服务中运行
    ExecStart
    命令,而不是以root身份运行,并查看输出:

    $ /home/ofey/djangoenv/bin/uwsgi --ini /etc/uwsgi/emperor.ini
    
    如果输出显示问题是权限问题,请尝试以下操作

    由于您将代表
    www-data
    用户运行服务器,正如前面所建议的,请确保:

    [Service]
    User=www-data
    Group=www-data
    RuntimeDirectory=uwsgi
    
    在您的systemd单元配置中。然后,通过将其添加到vassals.ini文件中,确保在该目录下(即/run/uwsgi下)创建.pid文件和unix套接字文件(如果有):

    runtime_dir = /run/uwsgi
    pidfile=%(runtime_dir)/%n.pid
    
    # if you prefer using unix-socket instead of a port
    socket = %(runtime_dir)/%n.sock
    
    # trying to chmod-socket is useless with a port, by the way
    chmod-socket    = 664
    
    给定示例中的
    %n
    变量表示vassal的.ini文件名,不带扩展名(请参阅)

    最后,确保皇帝和诸侯国的配置中指定的
    --logto
    文件可以通过这样的方式写入


    请注意,如果您以root用户身份运行
    uwsgi--ini/etc/uwsgi/employer.ini
    ,然后使用ctrl+D终止procecc,则会使上述临时文件存在,并且归root用户所有,这将阻止其他所有者(如www数据)向其写入,直到您删除这些文件或再次删除它们。

    最可能的原因是皇帝无法:

  • 创建.pid文件以写入processID
  • 为附庸创建unix套接字文件(似乎不是您的情况,因为您使用的是:3031端口)
  • 写入
    --logto
    选项指定的日志文件(/tmp/uwsgi.log)
  • 当这些文件中的任何一个存在并且由另一个用户(很可能是root用户)拥有,或者位于启动服务的用户无法写入的目录中时,通常会发生这种情况

    Systemd的状态日志对此主题的信息不多。因此,识别案例的最快方法是从systemd的服务中运行
    ExecStart
    命令,而不是以root身份运行,并查看输出:

    $ /home/ofey/djangoenv/bin/uwsgi --ini /etc/uwsgi/emperor.ini
    
    如果输出显示问题是权限问题,请尝试以下操作

    由于您将代表
    www-data
    用户运行服务器,正如前面所建议的,请确保:

    [Service]
    User=www-data
    Group=www-data
    RuntimeDirectory=uwsgi
    
    在您的systemd单元配置中。然后,通过将其添加到vassals.ini文件中,确保在该目录下(即/run/uwsgi下)创建.pid文件和unix套接字文件(如果有):

    runtime_dir = /run/uwsgi
    pidfile=%(runtime_dir)/%n.pid
    
    # if you prefer using unix-socket instead of a port
    socket = %(runtime_dir)/%n.sock
    
    # trying to chmod-socket is useless with a port, by the way
    chmod-socket    = 664
    
    给定示例中的
    %n
    变量表示vassal的.ini文件名,不带扩展名(请参阅)

    最后,确保皇帝和诸侯国的配置中指定的
    --logto
    文件可以通过这样的方式写入


    请注意,如果您以root用户身份运行
    uwsgi--ini/etc/uwsgi/employer.ini
    ,然后使用ctrl+D终止procecc,则会使上述临时文件存在,并且归root用户所有,这将阻止其他所有者(如www数据)向其写入,直到您删除这些文件或再次删除它们。

    注释掉
    KillSignal=SIGQUIT

    它可能会导致问题,请参阅


    还导致Centos 7出现问题

    注释掉
    KillSignal=SIGQUIT

    它可能会导致问题,请参阅


    如果您
    stat
    项目所在的文件夹,则在Centos 7上也会导致问题,该文件夹的所有者是谁?是www数据、根用户还是其他用户?当您使用sudo运行它时,它会工作,这让我想知道它是否基于权限。如果您
    stat
    项目所在的文件夹,谁拥有它?是www数据、根用户还是其他用户?当你用sudo运行它时,它会工作,这让我怀疑它是否基于权限。我已经添加了这一点,谢谢。但是ExecStart=/root/uwsgi/uwsgi--ini/etc/uwsgi/employer.ini应该引用virtualenv或系统中的uwsgi文件吗?那么应该是/usr/local/share/applications/test_project/bin,它是virtualenv还是我位于/usr/bin/uwsgi的系统上的uwsgi二进制文件?我已经在新的virtualenv中重新安装了Django,地址是/usr/local/share/applications/test_project/也在你提到的uwsgi systemd文档中说“小心一些systemd版本(例如Debian Jessie中的215),因为SIGQUIT信号会破坏systemd服务。在那里使用KillSignal=SIGTERM+“die on term”uwsgi选项。”我想知道这是否也是一个问题?我已经补充了,谢谢。但是ExecStart=/root/uwsgi/uwsgi--ini/etc/uwsgi/employer.ini呢