2016-02-15 9 views
5

Ho visto molte domande su SO riguardo questo argomento e ho provato quanti più metodi possibile ma non risolve ancora il problema per me quindi spero che questo post possa essere utile.Nginx + uWsgi + Django 'Autorizzazione negata durante il collegamento a monte' (presa)

Sto seguendo il tutorial da questo sito per configurare Django su Nginx wtih uWSGI: http://www.oliverelliott.org/article/computing/tut_setup_nginx_django/

file di 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 

etc/nginx/sites-enabled/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; 
    } 
} 

Questo è il codice di errore nella /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" 

Nota: CLIENT_IP & HOST_IP sono valori di indirizzo IP.

Si tratta di ciò che ho provato e non lavorato:
1. chmod 755 home directory e funzionante uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666

2. Aggiunta utente nginx al mio gruppo di utenti e funzionante uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3. cambiamento ini file aggiungendo queste nuove righe
chown-socket=ec2-user:nginx uid=nginx gid=nginx e quindi eseguito ing uwsgi --ini uwsgi.ini Questo ritorna con 'Permesso negato a chown', ma quando ho eseguito il comando con sudo, ottengo sudo: uwsgi: command not found (uWSGI è installato a livello di sistema)

4. Mettere tutti i file in una directory diversa (al di fuori di utente ec2-user) ma che non mi permette di accedervi a meno che non corro come root e anche allora non funziona

5. esecuzione uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666 con i parametri --uid nginx--gid nginx--chown-socket=nginx:nginx Nota: 664/666 significato ho provato entrambi i permessi

6. nginx Rinominato. conf.default e nginx.conf.rpmnew file (così che l'unico file conf per nginx da leggere è nginx.conf)

Qualcuno potrebbe far luce su come posso risolvere questo problema? Continuerò ad aggiungere metodi che ho provato e non ho lavorato a questa domanda mentre ci lavoro. Grazie :)

EDIT: Grazie alla risposta @GwynBleidD, ho finalmente funzionato. Questo è ciò che funziona:

mantenuto il mio file di socket in /tmp
etc/nginx/sites-enabled/awssite_nginx.conf

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

uwsgi.file 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 

ho aggiunto il mio ec2-user (utenti registrati) al gruppo nginx.
ho cambiato i permessi dei file di conseguenza
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket

+0

Puoi provare a cambiare il tuo chdir in 'chdir =/home/ec2-user/project'? – Selcuk

+0

@Selcuk no che non ha funzionato. per quanto ne so, 'chdir' è il percorso per l'app nel progetto, non il progetto stesso. –

+0

Mi chdir sempre alla dir del progetto ma non includo l'argomento home. – Selcuk

risposta

6

Se il server nginx non può accedere presa uWSGI, cercare di soddisfare le seguenti fasi:

  1. non mettere il socked in casa directory di qualsiasi utente nel tuo sistema, specialmente root! Alcuni dei sistemi operativi UNIX stanno bloccando l'accesso predefinito alla directory home per chiunque eccetto il proprietario di tale directory e root. Aggiungendo l'utente nginx al gruppo privato di quell'utente (per la maggior parte dei sistemi, ogni utente ha il proprio gruppo principale) può esserci d'aiuto, ma non funzionerà quasi mai per root.

  2. controllare su quale utente e gruppo il server nginx (o qualsiasi altro server http che si sta utilizzando) viene eseguito. A volte è www-data, a volte nginx, a volte qualcosa di altro. Quando crei un socket, assicurati che quel nome utente corrisponda al nome utente su cui viene eseguito il server uWSGI e il gruppo di corrispondenza del nome gruppo su uWSGI sia in esecuzione (o lo si possa scambiare).

  3. Verificare che le autorizzazioni del socket siano almeno 660. Non è necessario concedere autorizzazioni a nessuno, quindi non farlo.

  4. Verificare che sia nginx che uWSGI dispongano dell'autorizzazione per accedere alla directory su cui viene inserito il socket e a tutte le directory padre.

Buon posto per il file del socket è /var/run directory (per alcuni sistemi è /run o entrambi). È spesso montato come ramdisk (tmpfs) ed è scrivibile per chiunque nel sistema, quindi ogni utente può creare qui i socket (e accedervi). Se per qualche motivo non è accessibile nel tuo sistema, puoi anche provare la directory /tmp.

Se stai servendo file statici direttamente da nginx dalla tua directory home, considera l'aggiunta di nginx al tuo gruppo personale, in modo che abbia accesso in lettura alla tua home directory e ai file statici.

+0

Funziona! La directory '/ var/run' sfortunatamente non forniva accesso in scrittura ma inserendo il socket in'/tmp' funzionava. Ho anche dovuto aggiungere 'nginx' al mio gruppo utente' ec2-user' in modo che potesse accedere alla directory in cui è inserito il socket. Domanda veloce: c'è un modo per farlo funzionare senza avere 'nginx' nel mio gruppo utente' ec2-utente'? (solo così nginx non avrà accesso a tutti gli altri file e directory a cui 'ec2-user' ha accesso) –

+1

Sì, ma è necessario chownire le directory e il file socket, in modo che l'utente o il gruppo corrispondano a nginx uno. – GwynBleidD

+0

ho aggiunto l'utente 'ec2-user' nel gruppo' nginx'.e ho eseguito 'chown -R nginx: nginx/tmp/testfolder' e ho aggiunto questa riga nel mio file uwsgi.ini' sudo chown-socket = nginx: nginx'. questo è l'errore che sto ottenendo. 'errore nella rimozione di unix socket, unlink(): Autorizzazione negata [core/socket.c line 198] bind(): Autorizzazione negata [core/socket.c line 230]' (Sto ricevendo questo quando provo a eseguire ' uwsgi --ini uwsgi.ini') qualche idea? –

Problemi correlati