Nginx: stat () başarısız oldu (13: izin reddedildi)


103

Ubuntu 12.04 makinemde kurulu nginx ile belirli dizini eklerken varsayılan yapılandırmayı kullanıyorum.

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

Ben sadece basit bir statik nginx sunucusunun dosyaları bu dizinden sunmasını istiyorum. Ancak, error.loggörüyorum

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

Zaten yaptım chown -R www-data:www-data, /username/test/staticonları ayarladım chmod 755. Başka neyin ayarlanması gerektiğini bilmiyorum.


3
Kontrol eğer www-datakullanıcı kutu cdiçin /username/test/staticdizindeki:sudo -u www-data cd /username/test/static
Maciej Sz

İzin verilmedi, ancak ls -l yaptığımda, www-data kullanıcısı olarak ayarlandığını gösteriyor
user299709

2
/ Username, encryptfs üzerinde olabilir mi? Sitemin bulunduğu / home / username klasörüyle tamamen aynı sorunları yaşıyorum. Şifrelerin dışına çıkarırsam, her şey yolunda gider. Benim için hala çözüm yok ...
Georgi

Yanıtlar:


194

Nginx, dizin içinde çalışır, bu nedenle cd, nginx kullanıcısından o dizine ulaşamazsanız, başarısız olur ( statgünlüğünüzdeki komut gibi ). Emin olun www-usercan cdtüm yolu /username/test/static. statÇalıştırarak başarısız olacağını veya başarılı olacağını onaylayabilirsiniz.

sudo -u www-data stat /username/test/static

Sizin durumunuzda muhtemelen /usernameburadaki sorun dizindir. Genellikle diğer kullanıcıların ana dizinlerine erişim www-dataizni yoktur cd.

Bu durumda en iyi çözüm, gruba eklemek www-dataolacaktır username:

gpasswd -a www-data username

ve usernamegrubun yol boyunca tüm dizinleri girebileceğinden emin olun :

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

Değişikliklerinizin işe yaraması için nginx'i yeniden başlatın

nginx -s reload

Kök altına eklenen her yeni dizin için chmod'un yeni dizinlere yapılması gerektiği anlamına mı geliyor?
Qian Chen

2
@ElgsQianChen, bunun işletim sistemi düzeyinde izin sistemi olduğunu unutmayın, bu nedenle POSIX sistemlerinde bu sizin umask. chmodHer yeni dizini gerektirmeyen daha genel bir çözüme ihtiyacınız varsa , o zaman bir çözüm var. Bu ters grubu (birleşmesini gerektirir usernameiçin www-databir grup) ve kullanımı setgid. Daha ayrıntılı bir açıklama için yeni bir soru göndermekten çekinmeyin, cevaplamaktan memnuniyet duyarım.
Maciej Sz

Ya yolum / root / dizinindeyse? / Root üzerinde chmod g + x yapmak güvenli midir? Ve www verilerini kök gruba eklemek?
Oleg Abrazhaev

Fedora 24'te sorunum ... ACL izinleri ... başka bir katman ... YEY!
Ray Foss

1
Eh benim nginxkullanıcı muktedir Web sitem dizine erişmek için olabilir ama yine de hata günlükleri izin vermedi diyor.
Rahil Wazir

89

CentOS 7 kutusunda da aynı sorunu yaşadım.

Selinux'u vurmuşum gibi görünüyor. Selinux'u permissive mode ( setenforce permissive) haline getirmek şimdilik problemi çözdü. Düzgün bir düzeltmeyle geri dönmeye çalışacağım.


4
Bu son 3 gündür anlamaya çalıştığım tam "belgelenmemiş" davranış ...
Achilles

2
İşte bu davranışla ilgili bir gönderi: axilleas.me/en/blog/2013/…
Achilles

2
Bu yüzden kendimi burada buldum ... Bu sefer söz konusu dosyayı ana dizinimden html dizinine kopyaladığımı ve sahipliğini güncellediğimi buldum. 2015 ile aynı sorun ... Daha iyi düzeltme: ls -Z myFile.jsSELinux içeriğini gösterecek: SELinux içeriğini değiştirmek için -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js kullanın chcon -v --type=httpd_sys_content_t myFile.
Andrew Richard Miller

2
Evet; Ben de aynı sorunu yaşadım. sudo setenforce 0benim için düzeltti.
Overload119

1
Sadece bir not, selinux'un tamamen devre dışı bırakılmasını istiyorsanız, SELINUXdeğeri disabledin olarak değiştirmeniz ve /etc/selinux/configardından yeniden başlatmanız gerekir. Olarak ayarlandığında permissive, yine de arka planda kontroller çalıştırabilir (değerli CPU kullanarak), ancak hiçbir işlem yapmaz.
Oliver Tappin

77

Nginx'in sitenin kök dizinine giden tüm dizinlerde + x erişimine sahip olması gerekir.

Sitenin kök dizinine giden yoldaki tüm dizinlerde + x'in bulunduğundan emin olun. Örneğin, site kökü / home / username / siteroot ise:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot

13
6 saatlik çaresiz aramadan sonra ... ceset bundan bahsetti ama siz! teşekkür ederim!
Velid Ammar

3
Çok teşekkür ederim! Bunun işe yaraması için saatler harcadım ve her türlü cevapla karşılaştım, bu kadar basit olduğuna inanamıyorum!
Eric Groom

2
bu benim için iyi çalışıyor, centos 7, php fpm 7.2 (selinux zaten kapalı)
anhduc.bkhn

1
Teşekkür ederim! Bunca zamandır yapmam gereken tek şeyin bu olduğuna inanamıyorum!
exciteabletom

1
Teşekkür ederim, mükemmel !.
Softsofter

32

CentOS 7.0'da Access DeinedSELinux'un neden olduğu bir sorun vardı ve şu adımlar sorunu çözdü:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

Güncelleme: Digitalocean'ın sanal Linux sunucularını kullanırken öğrendiklerimden veya onlara Damlacıklar dedikleri gibi bir yan not . SELinux'u kullanmak, makul miktarda RAM gerektirir. Muhtemelen SELinux'u 2GB'den daha az RAM içeren bir damlacık üzerinde çalıştıramaz ve yönetemezsiniz .


2
Bunun için çok teşekkürler. Başlamak için sorunumu çözdü (ayrıca CentOS 7'de), ancak daha sonra başka bir yerde ikinci bir inkarla bloke edildim, bu yüzden başvurdum setenforce 0. Bununla birlikte, bu çözümün gerçekte ne yaptığına baktığımda, nginx kullanıcısının izinlerini güncellemek için komutları yeniden çalıştırmam gerektiğini fark ettim. Bu işe yaradı ve SELinux'u tekrar uygulamaya koyabilirim.
danj1974

Bu biraz geç olabilir. Yine de, SELinux'u uygulatmaya devam ettiğinizde; Nginx gibi yazılımların SELinux'a varsayılan bağlantı noktaları, varsayılan yollar, yollara okuma / yazma erişimi vb. gibi kendi kural kümelerini eklediklerini hatırlamak zorunludur. Herhangi bir sorun istemiyorsanız, bu kurallara uymalısınız (HTML / PHP dosyalarınızı / var / www içine koymak gibi) veya SELinux bağlamından kaynaklanan sorunların üstesinden gelmek için hazırlanmalısınız. Bu yardımcı olabilir [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

Güvenliği Geliştirilmiş Linux çalıştırıyor olabilirsiniz, bu nedenle bunun için bir kural ekleyin. İzinlerin ayarlanmış olmasına ve kullanıcı var olmasına rağmen 13 hata iznim vardı ..

chcon -Rt httpd_sys_content_t /username/test/static


Teşekkürler! CentOS 6.10 sürümünde (Final) çalıştı.
marw

1
CentOS 7.5.1804 (Core) üzerinde çalıştı.
Niek

4

Belirti:

WordPress Ortam Kitaplığı'na resimler yüklenemedi.

Sebep olmak:

(CentOS) yum update

Hata:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

Çözüm:

chown -R www-data:www-data /var/lib/nginx


2

Varsayılan olarak, nginx'i kurduğunuzda statik veriler / var / www / html içinde olacaktır. Böylece statik klasörünüzü / var / html / içine kopyalayabilir ve

root /var/www/<your static folder>

ngix.conf dosyasında (veya / etc / nginx / sites-available / default)

Bu benim için ubuntu'da çalıştı ama sanırım diğer dağıtımlar için çok farklı olmamalı.

Umarım yardımcı olur.


2

Senin değiştirin nginx.conf userMülkü www-staticdosyaları owener.

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config

1

Bu sorunla karşılaştım, nginx kullanıcısına izinler vermek ve şunun gibi bir şeyi gruplamak için çözdüm:

chown -R nginx:nginx /username/test/static

1

Benim durumumda, dosyaları sunan klasör başka bir klasöre sembolik bir bağlantıydı.

ln -sf /origin /var/www/destination

Hedef klasörde (sembolik bağlantı) doğru olan izinler (kullanıcı ve grup) olmasına rağmen, Nginx'in tümünün hiyerarşisine de kaynak klasörünün izinlerine sahip olması gerektiğinden hala hatayı aldım.


1

Sonunda yolumu buldum. Kısaca, diyelim ki kullanıcı adınız joeve kişisel dosya sisteminizin altında bir web siteniz var /home/joe/path/to/website.

Sisteme tam anlamıyla nginxarkadaşın olduğunu söylemelisin .
Yeri nginxde joegrubun:

sudo gpasswd -a nginx joe

Bundan sonra hala çalışmıyorsa, /home/joedizine doğru erişimi kontrol edin . Muhtemelen nginx'in dosyaya ulaşamamasının nedeni budur çünkü artık arkadaşınız olsa bile ona evinizin kapısını açmanız gerekir:

sudo chmod g+x /home/joe

Bu kadar. Yerel dosyalarınıza nginx erişimi sağlamak için yapmanız gereken tam anlamıyla bu :)

Bu yöntemde güvenlik endişeleri olduğunu sanmıyorum çünkü nginxyüksek otorite ve sadece bir yönetici grubu değiştirebilir. nginxartık joedizinlerdekileri okuyabilir . Yalnızca nginxhesabın sahibinin dizin erişimini açtığınız kullanıcıyla farklı olması bir güvenlik ihlalidir , ancak benim durumumda yerel bağlamda her iki tarafın da sahibiyim.


0

Ben de aynı sorunu yaşadım, Centos7 ile Plesk Onyx 17 kullanıyorum. Bu hatayı, etkilenen etki alanının günlükleri altındaki proxy_error_log'da görebiliyordum. / Var / www / vhosts / içindeki tüm dizinler / dosyalar ilgili kullanıcılara (etki alanı sahipleri) aittir ve hepsinin psacln grubunda olduğunu görebilirsiniz. Çözüm, nginx'i bu gruba da eklemekti, böylece neye ihtiyacı olduğunu görebilsin:

usermod -aG psacln nginx

Ve gerçekten, nginx'i yeniden başlatın ve sayfayı Ctrl + F5 ile yeniden yükleyin.


0

Bir iş buldum: "/ etc / nginx / my-web-app" benim durumumda klasörü nginx yapılandırma klasörüne taşıdım. Ve sonra izinleri kök kullanıcı "sudo chown -R root: root" my-web-app "olarak değiştirdi.


0

Ayrıca nginx'i hangi kullanıcının çalıştıracağını da ekleyebilirsiniz. Nginx.conf dosyasında aşağıdaki değişiklikleri yapın:

user root;

Yukarıdaki satırı nginx conf'inize ilk satır olarak ekleyebilirsiniz. Bu dizine yazma izni olan herhangi bir kullanıcının adını yazabilirsiniz.


0

Bu genellikle ayrıcalık sorunudur ... Benim için, nginx kökü olarak / root / ** kullandığım için daha yüksek ayrıcalığa ihtiyacı var. Kolay bir yol, projeyi kendi oluşturduğunuz bir dizine taşımaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.