[英]nginx connet to .sock failed (13:Permission denied) - 502 bad gateway
[英]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 開發服務器,你有兩個選擇:
這個解決方案對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.