簡體   English   中英

連接到上游時,Nginx + uWsgi + Django'權限被拒絕'(套接字)

[英]Nginx+uWsgi+Django 'Permission denied while connecting to upstream' (socket)

我已經在SO上看到了很多關於這個主題的問題,我嘗試了盡可能多的方法,但它仍然沒有為我解決問題所以我希望這篇文章可能會有所幫助。

我正在關注本網站的教程,以便在uWSGI上建立關於Nginx的Django: http ://www.oliverelliott.org/article/computing/tut_setup_nginx_django/

uwsgi.ini文件

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/home/ec2-user/project/awssite/awssite.socket
chmod-socket=666
vacuum=true

等/ nginx的/啟用的站點 - / awssite_nginx.conf

upstream django {
    server unix:///home/ec2-user/project/awssite/awssite.socket;
}
server {
listen          8080;
    server_name     localhost;
    charset utf-8;

    #max upload size
    client_max_body_size 75M;

    #Django media
    location /media {
            alias /home/ec2-user/project/awssite/awssite/media;
    }

    location /static {
            alias /home/ec2-user/project/awssite/awssite/static; 
    }

    location /favicon.ico {
            log_not_found off;
    }

    location / {
            uwsgi_pass django;
            include /home/ec2-user/project/awssite/uwsgi_params;
    }
}

這是/var/log/nginx/error.log的錯誤代碼

2016/02/15 01:21:22 [crit] 22159#0: *3 connect() to unix:///home/ec2-user/project/awssite/awssite.socket failed (13: Permission denied) while connecting to upstream, client: CLIENT_IP, server: localhost, request: "GET /menu/ HTTP/1.1", upstream: "uwsgi://unix:///home/ec2-user/project/awssite/awssite.socket:", host: "HOST_IP:8080"

注意:CLIENT_IP和HOST_IP是ip地址值。

這些是我嘗試過但沒有奏效的
1. chmod 755主目錄並運行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666

2.將用戶nginx添加到我的用戶組並運行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3.通過添加這些新行來更改ini文件
chown-socket=ec2-user:nginx uid=nginx gid=nginx然后運行uwsgi --ini uwsgi.ini這返回'允許拒絕chown'但是當我用sudo運行命令時,我得到sudo: uwsgi: command not found (uWSGI已在系統范圍內安裝)

4.將所有文件放在不同的目錄中(在用戶ec2-user ),但這不允許我訪問它們,除非我以root身份運行,即使它不起作用

5.運行uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666帶參數--uid nginx --gid nginx --chown-socket=nginx:nginx注意: 664/666含義我嘗試了兩種權限

6.重命名nginx.conf.default和nginx.conf.rpmnew文件(以便nginx讀取的唯一conf文件是nginx.conf

請問有人可以解釋我如何解決這個問題? 我將繼續添加我嘗試過的方法,而不是在我處理這個問題時沒有解決這個問題。 謝謝 :)

編輯:感謝@GwynBleidD的回答,我終於得到了它的工作。 這是有效的:

將我的套接字文件保存在/tmp
等/ nginx的/啟用的站點 - / awssite_nginx.conf

upstream django {
    server unix:///tmp/djangosocket/awssite.socket;
}
....

uwsgi.ini文件

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/tmp/djangosocket/awssite.socket
chmod-socket=666
vacuum=true

我將ec2-user (登錄用戶)添加到組nginx
我相應地更改了文件權限
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket

如果您的nginx服務器無法訪問uWSGI套接字,請嘗試執行以下步驟:

  1. 不要把你的socked放在你系統中任何用戶的主目錄中, 尤其是root! 對於除該目錄的所有者和root之外的任何人,某些unix操作系統默認訪問主目錄。 將nginx用戶添加到該用戶的私有組(對於大多數系統,每個用戶都擁有自己的主組)可以提供幫助,但它幾乎不會對root用戶起作用。

  2. 檢查您的nginx服務器(或您正在使用的任何其他http服務器)運行的用戶和組。 有時是www-data ,有時是nginx ,有時是其他東西。 創建套接字時,請確保用戶名將匹配運行uWSGI服務器的用戶名和uWSGI運行時的組名匹配組(或者您可以交換它)。

  3. 檢查您的套接字權限是否至少為660.沒有必要為任何人授予權限,所以不要這樣做。

  4. 檢查您的nginx和uWSGI是否都有權訪問放置套接字的目錄以及所有父目錄。

套接字文件的好地方是/var/run目錄(對於某些系統,它是/run或兩者)。 它通常作為ramdisk(tmpfs)安裝,並且對於系統中的任何人都是可寫的,因此每個用戶都可以在這里創建套接字(並訪問它們)。 如果由於某種原因在您的系統中無法訪問,您也可以嘗試/tmp目錄。

如果您還要從主目錄中直接從nginx提供靜態文件,請考慮將nginx添加到您的個人組,這樣它就可以對您的主目錄和靜態文件具有讀取權限。

暫無
暫無

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

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