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

Posted

技术标签:

【中文标题】django gunicorn sock 文件不是由 wsgi 创建的【英文标题】:django gunicorn sock file not created by wsgi 【发布时间】:2017-02-16 13:26:18 【问题描述】:

我的数字海洋服务器 (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 --bind 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_refused 错误。 使用此命令启动服务器后:

sudo systemctl restart nginx

当我尝试运行我的网站时,我收到 502 Bad Gateway 错误。 我已经尝试过这些命令(在教程 cmets 中找到):

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_APP 中添加了 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.

【问题讨论】:

以下是否出现错误? 1.用nginx -t测试nginx配置文件。 2. 检查 gunicorn 日志文件。 3. 使用ps aux | grep gunicorn检查gunicorn是否在运行。如果其中任何一个出现错误,请添加到您的问题中。 当您为 gunicorn 运行 systemctl enable 和 start 命令时会发生什么?当您执行sudo systemctl is-active gunicornsudo systemctl status gunicorn 时,您会看到什么? @Ben 在/var/log/syslog 发布您所看到的内容。您是否使用sudo ufw delete allow 8000sudo ufw allow 'Nginx Full' 正确设置了防火墙?您发布的 nginx 文件是否正确符号链接到 /etc/nginx/sites-enabled @YPCrumble /var/log/syslog 为空。是的,我已经使用sudo ufw delete allow 8000sudo ufw allow 'Nginx Full' 正确设置了防火墙。我的 nginx 文件正确符号链接到/etc/nginx/sites-enabled。 (如果我运行此命令ls -l /etc/nginx/sites-enabled myproject 文件以黄色突出显示。) 【参考方案1】:

我不得不更改我的 sock 文件夹的权限:

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

另一件事是我在阅读许多帖子后更改了 sock 位置,将 sock 文件保留在 django 项目中不是一个好习惯。 我的新位置是:

/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

现在一切正常。

【讨论】:

谢谢!!我一直在学习本教程,我花了两个小时设置了一个 azure VM,无论如何,并不断收到 502 Bad Gateway。教程在这里digitalocean.com/community/tutorials/…sudo chown user:www-data 解决了!! 应在上述教程中添加的重要说明。谢谢分享。 重要的是要注意,如果您需要这样做,这意味着 gunicorn 以 root 身份运行,不建议这样做。您可以在 gunicorn 命令中使用标志--user--group 指定组和用户。以下是您的情况:exec gunicorn --user ben --group www-data --bind unix:/home/ben/myproject/myproject.sock -m 007 wsgi【参考方案2】:

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

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在套接字上的读/写/执行权限,这这正是你在这种情况下所需要的。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

尝试运行

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl status gunicorn.service

最后一行帮助我重新创建了 .scok 文件

【讨论】:

未知操作 gunicorn.service。最后一行的语法不正确。

以上是关于django gunicorn sock 文件不是由 wsgi 创建的的主要内容,如果未能解决你的问题,请参考以下文章

Django 错误:无效的 HTTP_HOST 标头:u'/run/myprojectname/gunicorn.sock:'

什么是 gunicorn.sock?

Gunicorn 不在 AWS EC2 上创建 .sock 文件

502 Bad Gateway - django + nginx + gunicorn - sock failed (13: Permission denied)

错误:无效的 HTTP_HOST 标头:'/webapps/../gunicorn.sock'

如何使用 Nginx 和 GUnicorn 在单个服务器上部署多个 Django 应用程序?