2015-03-30 27 views
9

Próbuję zainstalować opartą na PHP software package w instancji Red Hat 7 Amazon EC2 (ami-8cff51fb), która miała Apache 2.4.6 i PHP 5.4. 16 zainstalowany na nim przy użyciu yum. Instalacja nie powiedzie się, ponieważ mówi, że dany katalog musi być zapisywalny przez serwer WWW z uprawnieniami 0755 lub 0775.Funkcja PHP is_writable() zawsze zwraca wartość false dla zapisywalnego katalogu

Ten katalog ma 0775 uprawnień z właścicielem root:apache. Sprawdziłem, że proces httpd jest uruchamiany przez użytkownika apache i że użytkownik apache jest członkiem grupy Apache.

Gdybym edytować /etc/passwd tymczasowo dać użytkownikowi Apache powłokę logowania i następnie su do tego konta, jestem w stanie ręcznie tworzyć pliki jako użytkownik apache w katalogu używając komendy touch.

Przyjrzałem się kodowi źródłowemu skryptu instalatora i stwierdziłem, że się nie powiódł, ponieważ funkcja is_writable() w PHP zwraca false dla danego katalogu. Stworzyłem osobny testowy skrypt PHP, aby wyizolować i zweryfikować zachowanie, które widzę:

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

Powoduje to wypisanie komunikatu NOT do zapisu. Jeśli zmienię $dir powyżej na /tmp, to poprawnie wypisze, że /tmp jest zapisywalny.

Po zmianie uprawnień do katalogu na 0777 i/lub zmianie prawa własności na apache:apache, PHP nadal zgłasza, że ​​katalog nie jest zapisywalny. Próbowałem nawet utworzyć katalog w wersji /test z tymi samymi uprawnieniami i prawem własności, a mój skrypt testowy nadal zgłasza, że ​​nie można go zapisać.

Naprawdę nie jestem w stanie wyjaśnić tego zachowania, więc wszelkie pomysły byłyby mile widziane!

Z góry dziękuję.


Wykaz aukcji dla /var/www/html/limesurvey podano poniżej. Katalogi tmp i mają uprawnienia 0775 zgodnie z installation instructions. test.php to mój skrypt testowy wspomniany powyżej.

[[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 

Running namei -l /var/www/html/limesurvey/tmp daje:

[[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

To może być głupie pytanie, ale czy zweryfikowałeś, że katalog istnieje? – Flosculus

+0

@ Flosculus To wcale nie głupie pytanie, ale tak, katalog zdecydowanie istnieje. –

+0

Zaimplementowałem twój przykład katalogu '/ test' z' 0777', użył twojego kodu i działał dobrze. Czy możesz wydrukować 'ls -al' dla tego katalogu? – Flosculus

Odpowiedz

17

Po wielu drapaniach głowy okazało się, że SELinux uniemożliwił zapisanie katalogu. Znalazłem good tutorial that explains what's going on. Udało mi się go naprawić, uruchamiając polecenie:

sudo chcon -R -t httpd_sys_rw_content_t tmp 
0

zapisu do katalogu, trzeba także wykonywać uprawnienia do powyższych katalogów.

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

powinien pokazywać, do którego kroku nie masz odpowiednich uprawnień.

+0

Edytowałem pytanie, aby dołączyć dane wyjściowe 'namei'. Jak widać, całe drzewo katalogów ma uprawnienia do wykonywania właściciela i grupy. –

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 

pobierane bezpośrednio z instrukcją instalacji Symfony2, to rozwiązuje problem z dzielenie dostępu cache zapisu między narzędzi Apache i CLI. Może to również działać dla twojego katalogu tmp.

+0

Dzięki. Właśnie próbowałem tego (i ponownie uruchomiłem usługę Apache), ale niestety to nie pomogło. –

0

is_writable domyślnie sprawdza tylko użytkownika, a nie grupę. Nawet jeśli grupa jest zgodna i ma uprawnienia is_writable, zwróci false. Aby odpocząć tę kontrolę, trzeba będzie ustawić

safe_mode_gid = On 

w konfiguracji PHP lub zmienić użytkownika odpowiednio.

+0

Dzięki, ale to nie zadziałało. Według [docs] (http://php.net/manual/en/ini.sect.safe-mode.php) ta opcja została usunięta w PHP 5.4.0. Używam PHP 5.4.16. –

Powiązane problemy