Django gunicorn sock文件不是由wsgi创建的

2024-04-28 19:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数字海洋服务器(Ubuntu 16.04)中有一个基本的django-rest应用程序,带有一个本地虚拟环境。 基本wsgi.py是:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "workout_rest.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

# Apply WSGI middleware here.
# from helloworld.wsgi import HelloWorldApplication
# application = HelloWorldApplication(application)

我已经循序渐进地学习了本教程: https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04

当我用这个命令测试Gunicorn为项目服务的能力时: gunicorn—绑定0.0.0.0:8000 myproject.wsgi:application 一切正常。

所以我试着设置Gunicorn来使用systemd服务文件。 我的/etc/systemd/system/gunicorn.service文件是:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ben
Group=www-data
WorkingDirectory=/home/ben/myproject
ExecStart=/home/ben/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/ben/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target

我的Nginx配置是:

server {
    listen 8000;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ben/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ben/myproject/myproject.sock;
    }
}

我已将侦听端口从80更改为8000,因为80给了我一个err_connection_拒绝的错误。 使用此命令启动服务器后:

sudo systemctl restart nginx

当我试图运行我的网站,我得到一个502坏网关错误。 我试过这些命令(可以在教程注释中找到):

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl restart nginx

但什么都没变。 当我使用这个命令查看Nginix日志时:

sudo tail -f /var/log/nginx/error.log

我可以看到sock文件不存在:

2016/10/07 09:00:18 [crit] 24974#24974: *1 connect() to unix:/home/ben/myproject/myproject.sock failed (2: No such file or directory) while connecting to upstream, client: 86.197.20.27, server: 139.59.150.116, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ben/myproject/myproject.sock:/", host: "server_ip_adress:8000"

为什么不创建这个sock文件?如何配置django/gunicorn来创建此文件? 我已经在我的Django项目中的INSTALLED_应用程序中添加了gunicorn,但它没有任何改变。

编辑:

当我用nginx -t测试nginx配置文件时,得到一个错误:open() "/run/nginx.pid" failed (13: Permission denied)。 但如果我使用sudo:sudo nginx -t运行该命令,则测试成功。这是否意味着我必须允许“ben”用户运行Ngnix?

关于gunicorn日志文件,我找不到读取它们的方法。它们存放在哪里?

当我使用ps aux | grep gunicorn检查gunicorn是否正在运行时:

ben      26543  0.0  0.2  14512  1016 pts/0    S+   14:52   0:00 grep --color=auto gunicorn

下面是在运行gunicorn的systemctl enable和start命令时发生的情况:

sudo systemctl enable gunicorn
Synchronizing state of gunicorn.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable gunicorn

sudo systemctl start gunicorn
I get no output with this command

sudo systemctl is-active gunicorn
active

sudo systemctl status gunicorn
● gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
   Active: active (exited) since Thu 2016-10-06 15:40:29 UTC; 23h ago

Oct 06 15:40:29 DevUsine systemd[1]: Started gunicorn.service.
Oct 06 18:52:56 DevUsine systemd[1]: Started gunicorn.service.
Oct 06 20:55:05 DevUsine systemd[1]: Started gunicorn daemon.
Oct 06 20:55:17 DevUsine systemd[1]: Started gunicorn daemon.
Oct 06 21:07:36 DevUsine systemd[1]: Started gunicorn daemon.
Oct 06 21:16:42 DevUsine systemd[1]: Started gunicorn daemon.
Oct 06 21:21:38 DevUsine systemd[1]: Started gunicorn daemon.
Oct 06 21:25:28 DevUsine systemd[1]: Started gunicorn daemon.
Oct 07 08:58:43 DevUsine systemd[1]: Started gunicorn daemon.
Oct 07 15:01:22 DevUsine systemd[1]: Started gunicorn daemon.

Tags: wsgihomeserverapplicationmyprojectsudonginxoct
3条回答

我已经给出了项目外部sock文件的路径。我只需要创建目录,这样gunicorn就可以在该目录中创建文件,正如我在.services文件中提到的那样。基本上,我确保根据.services文件中的路径存在所有目录。无需更改权限或所有权

我必须更改sock文件夹的权限:

sudo chown ben:www-data /home/ben/myproject/

另一件事是,在阅读了很多文章后,我已经更改了sock的位置,认为在django项目中保存sock文件不是一个好的做法。 我的新位置是:

/home/ben/run/

不要忘记更改权限:

sudo chown ben:www-data /home/ben/run/

要确保刷新gunicorn,请运行以下命令:

pkill gunicorn
sudo systemctl daemon-reload
sudo systemctl start gunicorn

这将扼杀gunicorn进程并启动新的进程。

您可以运行此命令使进程在服务器启动时启动:

sudo systemctl enable gunicorn

现在一切正常。

虽然接受的答案有效,但它有一个(imo的主要)问题,即gunicorn web服务器(可能)以根用户身份运行,这是不推荐的。您最终需要改变套接字的原因是它由root:root拥有,因为这是您的init作业默认假定的用户/组。有多种方法可以让你的工作承担另一个角色。在我看来,到目前为止(使用gunicorn 19.9.0),最简单的解决方案是使用作为gunicorn命令的一部分提供的--user--group标志。这意味着您的服务器可以从您指定的用户/组开始。就你而言:

exec gunicorn --user ben --group www-data --bind unix:/home/ben/myproject/myproject.sock -m 007 wsgi

将在ben:www-data用户下启动gunicorn,并创建一个由ben:www-data拥有的套接字,该套接字具有770权限,或用户ben和组www-data的读/写/执行权限,这正是您在本例中所需要的。

相关问题 更多 >