Nginx 403 tüm dosyalar için yasak


192

Ben bir CentOS 5 kutusunda PHP-FPM ile yüklü nginx var, ama PHP olsun ya da olmasın benim dosyaları herhangi birini hizmet almak için mücadele ediyorum.

Nginx www-data: www-data olarak çalışıyor ve varsayılan "EPEL'de nginx'e hoş geldiniz" sitesi (root'un sahibi: root 644 izinli) iyi yükler.

Nginx yapılandırma dosyası /etc/nginx/sites-enabled/*.conf için bir içerme yönergesine sahiptir ve example.com.conf yapılandırma dosyasına sahibim , böylece:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

Public_html, www-data'ya ait olmasına rağmen: 2777 dosya izinli www-data, bu site herhangi bir içerik sunamıyor -

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

Kullanıcıların nginx'ten 403s almasıyla çok sayıda başka yayın buldum, ancak gördüğüm çoğu Ruby / Passenger ile daha karmaşık kurulumlar içeriyor (ki geçmişte gerçekten başardım) veya yalnızca yukarı akım PHP olduğunda hata alıyoruz -FPM işin içinde, bu yüzden çok az yardımcı görünüyorlar.

Burada aptalca bir şey yaptım mı?


Yanıtlar:


334

Genellikle gözden kaçan bir izin gereksinimi, kullanıcının o dosyaya erişmek için dosyanın her üst dizininde x iznine gereksinim duymasıdır. Www-data x erişimi için /, / home, / home / demo vb. İzinlerini kontrol edin. Benim tahminim / home muhtemelen 770 ve www-data herhangi bir alt dizine ulaşmak için içinden geçemez. Öyleyse, chmod o + x / home (veya isteği reddeden herhangi bir yön) deneyin.

DÜZENLEME: Bir yoldaki tüm izinleri kolayca görüntülemek için aşağıdakileri kullanabilirsiniz: namei -om /path/to/check


6
Burada aynı. CentOS 6 kurulumumda, / home / user dizinleri varsayılan olarak 700 olarak ayarlanmıştır.
jjt

2
Bu adam da bunun hakkında konuşuyor: ( chmod -4 +x /mypathbenim için çalıştı) nginxlibrary.com/403-forbidden-error
Peter Ehrlich

1
Birisi bu davranışın neden her üst dizinin "x" izinleri olmasını gerektirmeyen apache'den farklı olduğunu açıklayabilir mi?
JoshuaDavid

3
Farklı değil. Apache'nin üst dizinlerde x izni gerektirmemesinin tek nedeni, root olarak çalıştırılmasıdır.
kolbyjack

Www-data kullanıcısını kişisel kullanıcı grubuma ekledim ve kök kullanıcı klasörüme chmod 710 yaptım. Bir cazibe gibi çalıştı. (Debian merkezli bir dağıtımda)
basicdays

299

permission deniedÜst klasörlerin izinlerini doğruladıktan sonra hala görüyorsanız , SELinux erişimi kısıtlıyor olabilir .

SELinux'un çalışıp çalışmadığını kontrol etmek için:

# getenforce

SELinux'u bir sonraki yeniden başlatmaya kadar devre dışı bırakmak için:

# setenforce Permissive

Nginx'i yeniden başlatın ve sorunun devam edip etmediğine bakın. Nginx'in www dizininize hizmet vermesine izin vermek için (bunu test etmeden önce SELinux'u tekrar açtığınızdan emin olun. Yani, setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

Daha fazla ayrıntı için cevabımı buraya bakın


1
Nginx'i her başlattığımda open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)izinleri kontrol ettikten ve kök olarak başlatıldığından emin olduktan sonra neden olduğunu anlayamadım . Buna rastladım ve SELinux'un etkinleştirildiğini öğrendim. Devre dışı bıraktım ve şimdi sorun yok. Teşekkürler!
ub3rst4r

1
Teşekkürler! Ben değiştirerek Şunu düzeltmek başardı yüzden hala kendi FPM yuvalarını sahip kullanıcılar için engellendi izni ile bir sorunu vardı userden nginx için root içinde /var/nginx/nginx.conf- belki de bu bu konuda rastlar başka irade yardım birisi. İkinci bölüm için DataPsyche'e S / O.
Kış

11
Bu, CentOS 7'de de varsayılan davranıştır.
timss

4
Yorum yapan herkesle beraberim. Bilgisayarımı pencereden dışarı atmaya hazırdım. Nginx düzgün bir şekilde yapılandırıldı, izinler düzgün bir şekilde ayarlandığında, her şeyi 777 yapmak için bile gittim ve hala izinleri reddedildi.
Resmi

2
Centos 7'de (SELinux etkin), benim için en basit düzeltme setsebool httpd_read_user_content on(Bir ana dizinden barındırılan statik dosyalar için, dünya tarafından okunabilir chmod'ed) - Sanırım @ KapiteinWitbaard'ın yukarıdaki yöntemi daha güvenli.
TimStaley

63

Kullanıcı ayarlarını ekleyerek bu sorunu çözdüm.

nginx.conf içinde

worker_processes 4;
user username;

'kullanıcı adını' linux kullanıcı adıyla değiştirin.


4
Bu cevabın kabul edilen cevaptan daha iyi bir güvenlik olduğuna inanıyorum. Ana klasörünüzdeki (hassas bilgiler içerebilir) izinlerle uğraşmak zorunda değilsiniz ve nginx ile geliştirme yapıyorsanız, SCM'ye garip dosya izinleri yüklemek zorunda kalmazsınız.
CamelBlues

Giriş dizinindeki eklenen izinler yürütülür, okunmaz, dolayısıyla hiçbir hassas bilgi (teoride) ortaya çıkmaz (bu durumda, belki de yukarı doğru çağıran ve hassas dosyaların başka bir dizin içindeki yerini bilen kötü amaçlı bir PHP betiği hariç) www-data için erişilebilir). Orijinal soruda, nginx'imin "www-data" olarak çalıştığını da fark edeceksiniz - buradaki yapılandırma değerleri zaten istendiği gibi ayarlanmış.
Angus Ireland

2
Kullanıcı grubunu da eklemek zorunda kaldım: kullanıcı kullanım grubu.
Gabriel A. Zorrilla

Benim için de çalıştı (tıpkı direni nginx: nginx'e chmodding gibi). Doküman kökümün nginx'ten başka bir kullanıcıya ait olabilmesi için bu çözümü tercih ederim. Bunu gösterdiğin için teşekkürler Anderson.
kvdv

günümü kurtardım. Bu arada, makinenin birden fazla kullanıcısı varsa ve her kullanıcının kendi web sitesi varsa, bununla nasıl başa çıkabilirim?
psychok7

38

Bu hatayı aldım ve sonunda aşağıdaki komutla çözdüm.

restorecon -r /var/www/html

Bir yerden bir yere bir şey mv yaptığınızda sorun oluşur. Orijinali taşıdığınızda selinux içeriğini korur, bu nedenle / home veya / tmp dosyasında bir şeyin yıldız işaretini kaldırırsanız, konumuyla eşleşen bir selinux içeriği verilir. Şimdi mv bunu / var / www / html olarak ve / tmp veya / home'a ​​ait olduğunu söyleyen bağlamı alırsınız ve httpd'nin ilke tarafından bu dosyalara erişmesine izin verilmez.

Dosyaları mv yerine cp yaparsanız, selinux bağlamı, nereden geldiğine değil, kopyaladığınız konuma göre atanır. Restorecon'u çalıştırmak bağlamı varsayılan değerine döndürür ve düzeltir.


1
Teşekkürler @jsina, bu bana çok yardımcı oldu
Pankaj Garg

1
Lanet olsun, +1 , ben de.
jww

24

Farklı durumlarda denedim ve sadece sahibi nginx ( chown -R nginx:nginx "/var/www/myfolder") olarak ayarlandığında - beklendiği gibi çalışmaya başladı.


1
Benim için de çalıştı. Bunun nginx kök olarak başlatılmış olmasına rağmen, "user nginx;" varsayılan olarak. Kullanıcıyı belge kökünüzün sahibi olan kullanıcı olarak değiştirmek, Anderson'ın önerdiği gibi çalışmalıdır.
kvdv

Bay Anderson? Hayır! Andron;)
Andron

Özür dilerim Bay Andron;) Yine de önceki yorumu düzenlemek gibi görünmüyor ...
kvdv

Tabii, sorun değil. Şimdi Anderson gibiydim :) ve bazı masallar yazmalıyım ...
Andron

1
Bu bir güvenlik sorunu değil mi?
gontard

6

SELinux kullanıyorsanız, şunu yazın:

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

Bu izin sorununu çözecektir.


1

Eski bir soru, ama aynı sorunu yaşadım. Yukarıdaki her cevabı denedim, hiçbir şey işe yaramadı. Benim için düzelten, alan adını kaldırıp tekrar eklemektir. Plesk kullanıyorum ve etki alanı zaten vardı SONRASI Nginx yükledim.

İlk önce / var / www / backups için yerel bir yedekleme yaptım. Böylece dosyaları kolayca kopyalayabilirim.

Garip bir sorun ....


1

Plesk Onyx 17'yi kullanarak da aynı sorunu yaşadık. Çözüm, haklar vb.

usermod -aG psacln nginx

Artık nginx, içeriği düzgün bir şekilde göstermek için .htaccess veya başka bir dosyaya erişim haklarına sahiptir.

Öte yandan, statik içeriğin sunulması için Apache'nin psaserv grubunda olduğundan da emin olun:

usermod -aG psaserv apache

Ve sonra Plesk'te hem Apache'yi hem de Nginx'i yeniden başlatmayı unutmayın! (ve sayfaları Ctrl-F5 ile yeniden yükle)


Bu doğru cevap ve usermod -aG username www-dataçoğu kurulumda büyük olasılıkla .
Dario Zadro

0

Yanlışlıkla setfaclkomutu çalıştırarak kendimi bu sorun üzerinde hafif bir varyant içine kazdım . Koştum:

sudo setfacl -m user:nginx:r /home/foo/bar

Gruba eklemek nginxiçin bu rotayı terk ettim foo, ancak bu özel ACL, nginx'in dosyaya erişme girişimlerini engelliyordu. Koşarak temizledim:

sudo setfacl -b /home/foo/bar

Ve sonra nginx dosyalara erişebildi.


0

PHP kullanıyorsanız index, sunucu bloğundaki NGINX yönergesinin bir index.php içerdiğinden emin olun :

index index.php index.html;

Daha fazla bilgi için resmi belgelerdeki dizin yönergesine bakın.


0

Aynı sorunla karşı karşıya kaldım ancak yukarıdaki çözümler yardımcı olmadı.

Bu yüzden, birçok mücadeleden sonra sestatus'un tüm limanları engelleyen ve tüm konulara izin verecek şekilde ayarlayarak çözüldüğünü öğrendim .

sudo setenforce 0

Umarım bu benim gibi birine yardımcı olur.


Bu sorununuzu çözmüş olsa da - tebrikler! - bu biraz üzücü :-( Bkz. stopdisablingselinux.com - farklı bir çözüm bulabilir misiniz?
Angus Ireland
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.