Nginx 403 dilarang untuk semua file

192

Saya telah menginstal nginx dengan PHP-FPM pada kotak CentOS 5, tetapi saya berjuang untuk mendapatkannya untuk melayani semua file saya - apakah PHP atau tidak.

Nginx berjalan sebagai www-data: www-data, dan situs "Selamat datang di nginx di EPEL" default (dimiliki oleh root: root dengan izin 644) dimuat dengan baik.

File konfigurasi nginx memiliki perintah include untuk /etc/nginx/sites-enabled/*.conf, dan saya memiliki file konfigurasi example.com.conf , dengan demikian:

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;
 }
}

Meskipun public_html dimiliki oleh www-data: www-data dengan 2777 izin file, situs ini gagal menyajikan konten apa pun -

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

Saya telah menemukan banyak posting lain dengan pengguna mendapatkan 403 dari nginx, tetapi sebagian besar yang saya lihat melibatkan pengaturan yang lebih kompleks dengan Ruby / Penumpang (yang sebelumnya saya benar-benar berhasil) atau hanya menerima kesalahan ketika PHP upstream -FPM terlibat, sehingga mereka tampaknya tidak banyak membantu.

Apakah saya melakukan sesuatu yang konyol di sini?

Angus Irlandia
sumber
periksa jawaban ini stackoverflow.com/questions/16808813/…
sandes

Jawaban:

333

Salah satu persyaratan izin yang sering diabaikan adalah kebutuhan pengguna x izin di setiap direktori induk file untuk mengakses file itu. Periksa izin pada /, / home, / home / demo, dll. Untuk www-data x akses. Dugaan saya adalah / home mungkin 770 dan www-data tidak dapat chdir melaluinya untuk sampai ke subdir. Jika ya, coba chmod o + x / home (atau dir apa pun yang menolak permintaan).

EDIT: Untuk dengan mudah menampilkan semua izin di jalur, Anda dapat menggunakan namei -om /path/to/check

kolbyjack
sumber
6
Sama disini. Pada instalasi CentOS 6 saya, dir / home / user diatur ke 700 secara default.
jjt
2
Orang ini juga membicarakannya: ( chmod -4 +x /mypathbekerja untuk saya) nginxlibrary.com/403-forbidden-error
Peter Ehrlich
1
Dapatkah seseorang menjelaskan mengapa perilaku ini berbeda dari apache yang TIDAK mengharuskan setiap direktori induk memiliki izin "x"?!?
JoshuaDavid
3
Tidak ada bedanya. Satu-satunya alasan apache juga tidak memerlukan izin x pada direktori induk adalah jika itu dijalankan sebagai root.
kolbyjack
Saya akhirnya menambahkan pengguna data-www ke grup pengguna pribadi saya dan melakukan chmod 710 ke folder pengguna root saya. Bekerja seperti pesona. (Pada distro berbasis debian)
basicdays
299

Jika Anda masih melihat permission deniedsetelah memverifikasi izin folder induk, itu mungkin SELinux membatasi akses.

Untuk memeriksa apakah SELinux sedang berjalan:

# getenforce

Untuk menonaktifkan SELinux hingga reboot berikutnya:

# setenforce Permissive

Mulai ulang Nginx dan lihat apakah masalahnya masih ada. Untuk mengizinkan nginx untuk melayani direktori www Anda (pastikan Anda mengaktifkan SELinux kembali sebelum menguji ini. Yaitu, setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

Lihat jawaban saya di sini untuk perincian lebih lanjut

Kurt
sumber
1
Saya tidak tahu mengapa setiap kali saya mulai nginx katanya open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)setelah saya memeriksa izin dan memastikan itu dimulai sebagai root. Saya menemukan ini dan menemukan SELinux diaktifkan. Saya menonaktifkannya dan sekarang tidak ada masalah. Terima kasih!
ub3rst4r
1
Terima kasih! Aku masih memiliki masalah dengan izin ditolak untuk pengguna yang memiliki soket FPM mereka sendiri sehingga saya bisa memperbaiki satu yang dengan mengubah userdari nginx ke akar di /var/nginx/nginx.conf- mungkin itu akan membantu orang lain yang datang di masalah ini. S / O ke DataPsyche untuk bagian kedua.
Musim dingin
11
Ini adalah perilaku default pada CentOS 7 juga.
timss
4
Saya dengan semua orang yang berkomentar. Saya siap untuk membuang komputer saya ke luar jendela. Nginx sudah dikonfigurasi dengan benar, izin mana diatur dengan benar, saya bahkan pergi jauh untuk membuat semuanya 777 dan masih mendapat izin ditolak kesalahan.
Efisien
2
Pada Centos 7 (SELinux diaktifkan), perbaikan paling sederhana bagi saya adalah setsebool httpd_read_user_content on(Untuk file statis yang di-host dari direktori home, chmod'ed menjadi dapat dibaca dunia) - Meskipun saya kira metode @ KapiteinWitbaard di atas lebih aman.
TimStaley
61

Saya memecahkan masalah ini dengan menambahkan pengaturan pengguna.

di nginx.conf

worker_processes 4;
user username;

ubah 'username' dengan nama pengguna linux.

Anderson
sumber
4
Saya percaya jawaban ini lebih baik dari segi keamanan daripada jawaban yang diterima. Anda tidak harus bermain-main dengan izin di folder rumah Anda (yang bisa berisi informasi sensitif) dan jika Anda melakukan pengembangan dengan nginx, itu akan menyelamatkan Anda dari keharusan mengunggah izin file aneh ke SCM.
CamelBlues
Izin yang ditambahkan pada direktori home dijalankan, tidak dibaca, sehingga tidak ada informasi sensitif (dalam teori) terungkap (kecuali, dalam hal ini, mungkin ke skrip PHP berbahaya yang berulang ke atas dan mengetahui lokasi file sensitif dalam direktori lain dapat diakses oleh www-data). Anda juga akan melihat bahwa dalam pertanyaan awal, nginx saya berjalan sebagai "www-data" - nilai konfigurasi di sini sudah ditetapkan sesuai keinginan.
Angus Ireland
2
Harus menambahkan usergroup juga: user usegroup.
Gabriel A. Zorrilla
Bekerja untuk saya juga (sama seperti chmodding dir ke nginx: nginx). Saya lebih suka solusi ini sehingga saya dapat memiliki root dokumen yang dimiliki oleh pengguna lain daripada nginx. Terima kasih Anderson untuk menunjukkan ini.
kvdv
menyelamatkan hari saya. omong-omong bagaimana jika mesin memiliki banyak pengguna dan setiap pengguna memiliki situs web sendiri, bagaimana cara menghadapinya?
psychok7
38

Saya mendapatkan kesalahan ini dan saya akhirnya menyelesaikannya dengan perintah di bawah ini.

restorecon -r /var/www/html

Masalah ini disebabkan ketika Anda memindahkan sesuatu dari satu tempat ke tempat lain. Ini mempertahankan konteks selinux dari aslinya ketika Anda memindahkannya, jadi jika Anda menghapus sesuatu di / home atau / tmp itu akan diberikan konteks selinux yang cocok dengan lokasinya. Sekarang Anda mv ke / var / www / html dan dibutuhkan konteks mengatakan itu milik / tmp atau / home dengannya dan httpd tidak diizinkan oleh kebijakan untuk mengakses file-file itu.

Jika Anda cp file bukan mv mereka, konteks selinux ditugaskan sesuai dengan lokasi Anda menyalin, bukan dari mana asalnya. Menjalankan restorecon mengembalikan konteks ke default dan memperbaikinya juga.

jsina
sumber
1
Terima kasih @jsina, ini banyak membantu saya
Pankaj Garg
1
Sial, +1 , aku juga.
jww
24

Saya sudah mencoba berbagai kasus dan hanya ketika pemiliknya diatur ke nginx ( chown -R nginx:nginx "/var/www/myfolder") - mulai berfungsi seperti yang diharapkan.

Andron
sumber
1
Bekerja untuk saya juga. Saya menduga ini terjadi karena walaupun nginx dimulai sebagai root, ia memunculkan proses di bawah pengguna yang ditentukan dalam file nginx.conf, yang merupakan "pengguna nginx;" secara default. Mengubah pengguna menjadi pengguna yang memiliki root dokumen Anda juga harus berfungsi seperti yang disarankan Anderson.
kvdv
Pak Anderson? Tidak! Andron;)
Andron
Maaf Pak Andron;) Sepertinya saya tidak bisa mengedit komentar sebelumnya lagi ...
kvdv
Tentu tidak masalah. Sekarang saya adalah sebagai Anderson :) dan perlu menulis beberapa dongeng ...
Andron
1
Bukankah ini masalah keamanan?
gontard
6

Jika Anda menggunakan SELinux, ketikkan:

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

Ini akan memperbaiki masalah izin.

David Ding
sumber
1

Pertanyaan lama, tetapi saya memiliki masalah yang sama. Saya mencoba setiap jawaban di atas, tidak ada yang berhasil. Apa yang diperbaiki untuk saya adalah menghapus domain, dan menambahkannya lagi. Saya menggunakan Plesk, dan saya menginstal Nginx SETELAH domain sudah ada di sana.

Meskipun demikian, lakukan backup lokal ke / var / www / backup. Jadi saya bisa dengan mudah menyalin kembali file.

Masalah aneh ....

David
sumber
1

Kami memiliki masalah yang sama, menggunakan Plesk Onyx 17. Alih-alih mengacaukan hak dll, solusinya adalah menambahkan pengguna nginx ke dalam grup psacln, di mana semua pemilik domain (pengguna) lainnya adalah:

usermod -aG psacln nginx

Sekarang nginx memiliki hak untuk mengakses .htaccess atau file lain yang diperlukan untuk menampilkan konten dengan benar.

Di sisi lain, pastikan juga bahwa Apache ada di grup psaserv, untuk menyajikan konten statis:

usermod -aG psaserv apache

Dan jangan lupa untuk me-restart Apache dan Nginx di Plesk sesudahnya! (dan muat ulang halaman dengan Ctrl-F5)

Slavomir Miskovec
sumber
Ini adalah jawaban yang benar dan kemungkinan besar usermod -aG username www-datadi sebagian besar pengaturan.
Dario Zadro
0

Saya menggali sedikit tentang masalah ini dengan menjalankan setfaclperintah secara salah. Saya berlari:

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

Aku ditinggalkan rute ini mendukung menambahkan nginxke fookelompok, tetapi bahwa kebiasaan ACL itu menggagalkan upaya nginx untuk mengakses file. Saya membersihkannya dengan menjalankan:

sudo setfacl -b /home/foo/bar

Dan kemudian nginx dapat mengakses file.

danvk
sumber
0

Jika Anda menggunakan PHP, pastikan indexarahan NGINX di blok server berisi index.php:

index index.php index.html;

Untuk info lebih lanjut, periksa petunjuk indeks dalam dokumentasi resmi.

Francisco Zanatta
sumber
0

Saya menghadapi masalah yang sama tetapi solusi di atas tidak membantu.

Jadi, setelah banyak perjuangan saya menemukan bahwa sestatus ditetapkan untuk menegakkan yang memblokir semua pelabuhan dan dengan mengatur agar permisif semua masalah diselesaikan.

sudo setenforce 0

Semoga ini bisa membantu orang seperti saya.

Harvey
sumber
Meskipun itu mungkin telah memperbaiki masalah Anda - selamat! - itu agak menyedihkan :-( Lihat stopdisablingselinux.com - dapatkah Anda menemukan solusi yang berbeda?
Angus Ireland