2015-03-30 32 views
9

Sto tentando di installare uno software package basato su PHP in un'istanza di Amazon EC2 di Red Hat 7 (ami-8cff51fb) che ha avuto Apache 2.4.6 e PHP 5.4. 16 installato su di esso usando yum. L'installazione non riesce perché dice che una particolare directory deve essere scrivibile dal server web con le autorizzazioni 0755 o 0775.PHP La funzione is_writable() restituisce sempre false per una directory scrivibile

La directory in questione ha 0775 autorizzazioni con proprietà root:apache. Ho verificato che il processo httpd è eseguito dall'utente apache e che l'utente apache è un membro del gruppo apache.

Se modifico /etc/passwd per dare temporaneamente l'utente apache una shell di login e poi su a tale account, sono in grado di creare manualmente i file come utente apache all'interno della directory utilizzando il comando touch.

Ho dato un'occhiata al codice sorgente dello script di installazione e ho riscontrato che non funziona perché la funzione is_writable() di PHP restituisce false per la directory in questione. Ho creato uno script di test PHP separato per isolare e verificare il comportamento che sto vedendo:

<?php 
    $dir = '/var/www/html/limesurvey/tmp'; 
    if (is_writable($dir)) { 
    echo $dir, ' is writable'; 
    } else { 
    echo $dir, ' is NOT writable'; 
    } 
?> 

Questo emette il messaggio non scrivibile. Se cambio $dir sopra per essere /tmp, allora esso restituisce correttamente che /tmp è scrivibile.

Se cambio le autorizzazioni di directory su 0777 e/o modificando la proprietà su apache:apache, PHP segnala ancora che la directory non è scrivibile. Ho anche provato a creare una directory /test con le stesse autorizzazioni e proprietà e il mio script di test lo riporta ancora come non scrivibile.

Sono davvero in perdita per spiegare questo comportamento, quindi qualsiasi idea sarebbe gradita!

Grazie in anticipo.


L'elenco di directory per /var/www/html/limesurvey è indicato di seguito. Le directory tmp e upload dispongono di 0775 autorizzazioni come da Lime Survey installation instructions. test.php è il mio script di test menzionato sopra.

[[email protected] limesurvey]$ pwd 
/var/www/html/limesurvey 
[[email protected] limesurvey]$ ls -al 
total 80 
drwxr-xr-x. 20 root apache 4096 Mar 30 11:25 . 
drwxr-xr-x. 3 root root  23 Mar 25 14:41 .. 
drwxr-xr-x. 2 root apache 38 Mar 10 12:56 admin 
drwxr-xr-x. 16 root apache 4096 Mar 10 12:56 application 
drwxr-xr-x. 3 root apache 4096 Mar 10 12:56 docs 
drwxr-xr-x. 2 root apache 4096 Mar 10 12:56 fonts 
drwxr-xr-x. 19 root apache 4096 Mar 10 12:56 framework 
-rw-r--r--. 1 root apache 429 Mar 10 12:56 .gitattributes 
-rw-r--r--. 1 root apache 399 Mar 10 12:56 .gitignore 
-rw-r--r--. 1 root apache 296 Mar 10 12:56 .htaccess 
drwxr-xr-x. 4 root apache 4096 Mar 10 12:56 images 
-rw-r--r--. 1 root apache 6652 Mar 10 12:56 index.php 
drwxr-xr-x. 5 root apache 39 Mar 10 12:56 installer 
drwxr-xr-x. 89 root apache 4096 Mar 10 12:56 locale 
drwxrwxr-x. 2 root apache 39 Mar 25 14:41 logs 
drwxr-xr-x. 4 root apache 49 Mar 10 12:56 plugins 
-rw-r--r--. 1 root apache 61 Mar 10 12:56 README 
drwxr-xr-x. 4 root apache 4096 Mar 10 12:56 scripts 
-rw-r--r--. 1 root apache 380 Mar 10 12:56 .scrutinizer.yml 
drwxr-xr-x. 5 root apache 4096 Mar 10 12:56 styles 
drwxr-xr-x. 5 root apache 4096 Mar 10 12:56 styles-public 
drwxr-xr-x. 12 root apache 4096 Mar 10 12:56 templates 
-rw-r--r--. 1 root apache 159 Mar 30 11:11 test.php 
drwxr-xr-x. 3 root apache 20 Mar 10 12:56 themes 
drwxr-xr-x. 26 root apache 4096 Mar 10 12:56 third_party 
drwxrwxr-x. 5 root apache 80 Mar 26 13:45 tmp 
drwxrwxr-x. 6 root apache 79 Mar 10 12:57 upload 

Esecuzione namei -l /var/www/html/limesurvey/tmp dà:

[[email protected] ~]$ namei -l /var/www/html/limesurvey/tmp 
f: /var/www/html/limesurvey/tmp 
drwxr-xr-x root root /
drwxr-xr-x root root var 
drwxr-xr-x root root www 
drwxr-xr-x root root html 
drwxr-xr-x root apache limesurvey 
drwxrwxr-x root apache tmp 
+0

Questa potrebbe essere una domanda stupida, ma hai verificato che la directory esista? – Flosculus

+0

@Flosculus Non è una domanda stupida, ma sì, la directory esiste sicuramente. –

+0

Ho implementato il tuo esempio di directory '/ test' con' 0777', usato il tuo codice e ha funzionato bene. Potresti stampare il 'ls -al' per quella directory per favore? – Flosculus

risposta

17

Dopo aver grattato la testa, è emerso che SELinux impediva la scrittura della directory. Ho trovato un good tutorial that explains what's going on. Sono stato in grado di risolvere il problema eseguendo questo comando:

sudo chcon -R -t httpd_sys_rw_content_t tmp 
0

di scrivere in una directory è necessario anche i permessi di esecuzione per i dirs di cui sopra.

namei -l /var/www/html/limesurvey/tmp 

dovrebbe indicare per quale passaggio non si dispone delle autorizzazioni corrette.

+0

Ho modificato la domanda per includere l'output 'namei'. Come puoi vedere, l'intero albero delle directory ha permessi di esecuzione proprietario e di gruppo. –

0
HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1` 
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp 
sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX tmp 

prese direttamente dalla guida di installazione Symfony2, questo risolve il problema con la condivisione di accesso cache di scrittura tra gli strumenti Apache e CLI. Questo potrebbe funzionare anche per la tua directory tmp.

+0

Grazie. Ho appena provato (e riavviato il servizio Apache), ma sfortunatamente non è stato d'aiuto. –

0

is_writable di default controlla solo l'utente, non il gruppo. Quindi, anche se il gruppo è in corrispondenza e dispone delle autorizzazioni, is_writable restituirà false. per rilassarsi questo controllo è necessario impostare

safe_mode_gid = On 

nella configurazione PHP o cambiare l'utente di conseguenza.

+0

Grazie, ma non ha funzionato. Secondo [docs] (http://php.net/manual/en/ini.sect.safe-mode.php), questa opzione è stata rimossa in PHP 5.4.0. Sto usando PHP 5.4.16. –