簡體   English   中英

502 Bad Gateway - django + nginx + gunicorn - sock 失敗(13:權限被拒絕)

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

我正在關注本教程: https ://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-14-04

我相信我的設置中的其他所有內容都是正確的。 文件 /var/log/nginx/error.log 有很多如下錯誤:

2015/12/19 18:41:58 [暴擊] 10850#0: *23 connect() 到 unix:/home/root/myproject/myproject.sock 連接到上游時失敗(13:權限被拒絕) ,客戶端:[ [我的 ip]],服務器:[[服務器 ip]],請求:“GET/HTTP/1.1”,上游:“ http://unix:/home/root/myproject/myproject.sock:/ ”,主機: “[[服務器 IP]]”

命令:

/home/root/myproject ls -l /home/root/classNote/classNote.sock

輸出:

srwxrwxrwx 1 root www-data 0 Dec 19 18:17 /home/root/myproject/myproject.sock

編輯:安德烈的評論回應:

命令:

ps ax | grep gunicorn

輸出:

  847 ?        Ss     0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
  921 ?        S      0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
  923 ?        S      0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
  928 ?        S      0:00 /home/root/myproject/myprojectEnv/bin/python myprojectEnv/bin/gunicorn --workers 3 --bind unix:/home/root/myproject/myproject.sock myproject.wsgi:application
 1136 pts/0    S+     0:00 grep gunicorn

鏈接到類似的問題

我剛遇到這個問題。 我能夠創建 gunicorn 套接字文件,但 nginx 抱怨權限被拒絕。 問題是我的套接字文件位於子文件夾中,而根文件夾沒有讀取或執行權限。 因此,即使子文件夾具有正確的權限,根文件夾也會阻止 nginx 進入子文件夾。

解決方案是為根文件夾添加讀取和執行權限:

chmod o+rx /example_root_folder

似乎有權限問題以 root 身份啟動你的 nginx 服務,因為 root 有權訪問你的 my project.sock

sudo service nginx stop

然后

 sudo service nginx start

但是以 root 身份啟動 nginx 並不是一個好主意。 您可以嘗試更改當前用戶的權限

我可以向您推薦一個效果很好的替代方案。 讓 shell 腳本處理所有這些。 像這樣創建一個shell腳本(*表示注釋中需要)

#!/bin/bash

NAME=""                              #Name of the application (*)
DJANGODIR=/path/to/django/project            # Django project directory (*)
SOCKFILE=/path/to/socket/file/myproject.sock        # we will communicate using this unix socket (*)
USER=                                      # the user to run as (*)
GROUP=                                     # the group to run as (*)
NUM_WORKERS=1                                     # how many worker   processes should Gunicorn spawn (*)
DJANGO_SETTINGS_MODULE=yourproject.settings             # which settings file should Django use (*)
DJANGO_WSGI_MODULE=yourproject.wsgi                     # WSGI module name (*)

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /path/to/virtualenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /path/to/virtualenv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user $USER \
  --bind=unix:$SOCKFILE

我以前遇到過與您非常相似的問題(也是根據 digitalocean.com 上提到的教程進行的),我的意思是套接字無法正常工作,而且我收到了 502 錯誤。

我的解決方案是從套接字綁定轉變為綁定普通 IP 地址。

在 virtualenv 中(在“manage.py”旁邊)我有一個 gunicorn.py 文件:(注意:我使用的是 3.4 版本)

#!/usr/bin/python3.4

"""
Run Gunicorn (Django) on a specific IP addr
"""

import os

# Change directory to the virtualenv folder
os.chdir("/home/your_path/name_of_env/")

# Run Gunicorn
os.system("bin/gunicorn -w 3 -b 127.0.0.1:8000 your_project.wsgi:application &")

該腳本在不激活 virtualenv(命令“bin/gunicorn”)和后台(“&”)的情況下運行 Gunicorn。

注意:如果您不使用 virtualenv,請從上面的腳本中刪除“bin/”。

要在啟動 PC 和登錄后調用該腳本,請將此行添加到末尾的“.profile”文件中。 (它在你的主目錄中)

python3.4 path/to/the/file/gunicorn.py

在 nginx 文件中你應該有這部分代碼:

location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
}

請記住,IP 地址 127.0.0.1:8000 是保留的。 所以如果你想運行 Django 開發服務器,你有兩個選擇:

  1. 通過命令“ps aux | grep gunicorn”和“kill -9 [PID]”關閉 Gunicorn,然后正常運行命令“python3.4 manage.py runserver”
  2. 或者在不同的 IP 和端口上運行 Django 開發服務器,例如“python3.4 manage.py runserver 0.0.0.0:8001”

這個解決方案對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM