Nginx: stat () gagal (13: izin ditolak)

103

Saya menggunakan konfigurasi default sambil menambahkan direktori tertentu dengan nginx diinstal pada mesin ubuntu 12.04 saya.

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

...
}

Saya hanya ingin server nginx statis sederhana untuk melayani file dari direktori itu. Namun, memeriksa error.logsaya mengerti

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

Saya sudah melakukan chown -R www-data:www-datapada /username/test/static, saya telah menetapkan mereka untuk chmod 755. Saya tidak tahu apa lagi yang perlu disetel.

pengguna299709
sumber
3
Periksa apakah www-datapengguna dapat cdke /username/test/staticdirektori:sudo -u www-data cd /username/test/static
Maciej Sz
Saya mendapatkan izin ditolak, tetapi ketika saya melakukan ls -l itu menunjukkan bahwa disetel ke pengguna data-www
user299709
2
Mungkinkah / username ada di encryptfs? Saya mengalami masalah yang persis sama dengan folder / home / nama pengguna, tempat situs saya berada. Jika saya memindahkannya dari encryptfs maka semuanya berfungsi dengan baik. Masih tidak ada solusi bagi saya ...
Georgi

Jawaban:

194

Nginx beroperasi di dalam direktori, jadi jika Anda tidak bisa cdke direktori itu dari pengguna nginx maka itu akan gagal (seperti halnya statperintah di log Anda). Pastikan www-userbisa cdsemua jalan ke /username/test/static. Anda dapat memastikan bahwa keinginan statakan gagal atau berhasil dengan menjalankan

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

Dalam kasus Anda mungkin /usernamedirektori masalahnya di sini. Biasanya www-datatidak memiliki izin ke cddirektori home pengguna lain.

Solusi terbaik dalam hal itu adalah menambahkan www-datake usernamegrup:

gpasswd -a www-data username

dan pastikan usernamegrup tersebut dapat masuk ke semua direktori di sepanjang jalur:

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

Agar perubahan Anda berfungsi, mulai ulang nginx

nginx -s reload
Maciej Sz
sumber
Apakah ini berarti untuk setiap direktori baru yang ditambahkan di bawah root, chmod harus dilakukan ke direktori baru?
Qian Chen
2
@ElgsQianChen ingatlah bahwa ini adalah sistem izin tingkat OS, jadi dalam sistem POSIX itu tergantung pada Anda umask. Jika Anda membutuhkan solusi yang lebih umum, yang tidak memerlukan chmodsetiap direktori baru, maka ada solusinya. Ini membutuhkan asosiasi kelompok terbalik ( usernameke www-datakelompok) dan penggunaan setgid. Jangan ragu untuk memposting pertanyaan baru untuk deskripsi yang lebih terperinci dan saya akan dengan senang hati menjawabnya.
Maciej Sz
Bagaimana jika jalur saya ada di / root / direktori? Apakah aman melakukan chmod g + x on / root? Dan menambahkan www-data ke grup root?
Oleg Abrazhaev
Pada Fedora 24 masalah saya muncul dengan ... izin ACL ... lapisan lain ... YA!
Ray Foss
1
nginxPengguna saya dapat mengakses direktori situs web saya tetapi tetap dikatakan izin ditolak di log kesalahan.
Rahil Wazir
89

Saya baru saja mengalami masalah yang sama pada kotak CentOS 7.

Sepertinya saya akan menekan selinux. Menempatkan selinux ke mode permisif ( setenforce permissive) telah mengatasi masalah untuk saat ini. Saya akan mencoba dan kembali dengan perbaikan yang tepat.

Andrew Richard Miller
sumber
4
Ini adalah perilaku "tidak terdokumentasi" persis yang saya coba pahami selama 3 hari terakhir ini ...
Achilles
2
Berikut adalah posting tentang perilaku ini: axilleas.me/en/blog/2013/…
Achilles
2
Jadi, saya menemukan diri saya kembali ke sini ... Kali ini saya menemukan saya menyalin file yang dipermasalahkan dari direktori home saya ke direktori html, dan memperbarui kepemilikan. Masalah yang sama seperti 2015 ... Perbaikan yang lebih baik: ls -Z myFile.jsakan menampilkan konteks SELinux: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js Gunakan chcon -v --type=httpd_sys_content_t myFileuntuk mengubah konten SELinux.
Andrew Richard Miller
2
Ya; Saya memiliki masalah yang sama. sudo setenforce 0memperbaikinya untuk saya.
Overload119
1
Sekadar catatan, jika Anda ingin selinux dinonaktifkan sepenuhnya, Anda perlu mengubah SELINUXnilainya menjadi disabledin /etc/selinux/config, diikuti dengan reboot. Jika disetel ke permissive, itu masih dapat menjalankan pemeriksaan di belakang layar (menggunakan CPU yang berharga), tetapi tidak mengambil tindakan.
Oliver Tappin
76

Nginx harus memiliki + x akses pada semua direktori yang mengarah ke direktori root situs tersebut.

Pastikan Anda memiliki + x pada semua direktori di jalur yang mengarah ke root situs. Misalnya, jika root situs adalah / home / username / siteroot:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
Sairam Krish
sumber
13
Setelah 6 jam pencarian putus asa ... tubuh yang ditemukan menyebutkan ini tetapi Anda! Terima kasih!
Walid Ammar
3
Terima kasih banyak! Menghabiskan waktu berjam-jam mencoba membuat ini bekerja dan menemukan berbagai macam jawaban, tidak percaya itu sesederhana itu!
Eric Groom
2
ini berfungsi dengan baik untuk saya, centos 7, php fpm 7.2 (selinux sudah mati)
anhduc.bkhn
1
Terima kasih! Tidak percaya hanya ini yang harus saya lakukan sepanjang waktu!
exciteabletom
1
Terima kasih, sempurna !.
Softsofter
32

Di CentOS 7.0 saya mengalami Access Deinedmasalah ini yang disebabkan oleh SELinux dan langkah-langkah ini menyelesaikan masalah:

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

Pembaruan: Hanya catatan tambahan dari apa yang saya pelajari saat menggunakan server Linux virtual digitalocean, atau mereka menyebutnya Droplets . Menggunakan SELinux membutuhkan RAM yang lumayan. Kemungkinan besar Anda tidak akan bisa menjalankan dan mengelola SELinux pada tetesan dengan RAM kurang dari 2GB.

Achilles
sumber
2
Terimakasih banyak untuk ini. Itu memang menyelesaikan masalah saya (juga di CentOS 7) untuk memulai, tetapi kemudian saya diblokir oleh penolakan kedua di tempat lain, jadi terpaksa setenforce 0. Namun, ketika melihat kembali apa yang sebenarnya dilakukan solusi ini, saya menyadari bahwa saya perlu menjalankan kembali perintah untuk memperbarui izin untuk pengguna nginx. Sepertinya itu berhasil dan saya dapat mengatur SELinux kembali ke penerapan.
danj1974
Nah, ini mungkin agak terlambat. Namun, perlu disebutkan bahwa saat Anda terus menerapkan SELinux; Sangat penting untuk diingat, perangkat lunak seperti Nginx memasukkan seperangkat aturan mereka sendiri seperti port default, jalur default, akses baca / tulis ke jalur, dll. ke SELinux. Jika Anda tidak ingin ada masalah, Anda harus mengikuti aturan tersebut (seperti meletakkan file HTML / PHP Anda ke / var / www) atau bersiap untuk mengatasi masalah yang berasal dari dalam konteks SELinux. Ini dapat membantu [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles
27

Anda mungkin menjalankan Linux yang Ditingkatkan Keamanan, jadi tambahkan aturan untuk itu. Saya mengalami kesalahan izin 13, meskipun izin ditetapkan dan pengguna ada ..

chcon -Rt httpd_sys_content_t /username/test/static

Artjom Kurapov
sumber
Terima kasih! Bekerja pada rilis CentOS 6.10 (Final).
marw
1
Bekerja pada CentOS 7.5.1804 (Core).
Niek
4

Gejala:

Tidak dapat mengunggah gambar ke Perpustakaan Media WordPress.

Sebab:

(CentOS) yum update

Kesalahan:

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"

Larutan:

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

PJ Brunet
sumber
2

Secara default, data statis, saat Anda menginstal nginx, akan berada di / var / www / html. Jadi Anda cukup menyalin folder statis Anda ke / var / html / dan mengatur

root /var/www/<your static folder>

di ngix.conf (atau / etc / nginx / sites-available / default)

Ini berfungsi untuk saya di ubuntu tetapi saya kira itu tidak jauh berbeda untuk distro lain.

Semoga membantu.

Patrik Bego
sumber
2

Ubah nginx.conf userproperti Anda menjadi www-staticfile owener.

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

user your_user_name;

# same other config
lonnyzhang423
sumber
1

Saya menghadapi masalah ini, saya menyelesaikannya untuk memberikan izin kepada pengguna nginx dan mengelompokkan sesuatu seperti ini:

chown -R nginx:nginx /username/test/static
julian salas
sumber
1

Dalam kasus saya, folder yang menyajikan file adalah tautan simbolis ke folder lain, dibuat dengan

ln -sf /origin /var/www/destination

Meskipun izin (pengguna dan grup) di mana benar di folder tujuan (tautan simbolis), saya masih mengalami kesalahan karena Nginx perlu memiliki izin ke seluruh hierarki folder asal juga.

Santiago Martí Olbrich
sumber
1

Saya akhirnya menemukan jalan saya. Singkatnya, katakanlah nama pengguna Anda adalah joedan Anda memiliki situs web di bawah sistem file pribadi Anda /home/joe/path/to/website.

Anda benar-benar harus memberi tahu sistem bahwa itu nginxadalah teman Anda.
Tempatkan nginxdalam joegrup:

sudo gpasswd -a nginx joe

Setelah itu jika masih tidak berhasil, periksa akses /home/joedirektori yang benar. Mungkin itulah alasan mengapa nginx tidak dapat menjangkau file tersebut karena meskipun dia adalah teman Anda sekarang Anda harus membukanya pintu ke rumah Anda:

sudo chmod g+x /home/joe

Itu dia. Hanya itu yang harus Anda lakukan untuk memberikan akses nginx ke file lokal Anda :)

Saya tidak berpikir ada masalah keamanan dengan metode ini karena nginxmerupakan otoritas tinggi dan hanya admin yang dapat mengubah grup. nginxsekarang dapat membaca apa yang ada di joedirektori. Ini hanya pelanggaran keamanan jika pemegang nginxakun berbeda dengan pengguna tempat Anda membuka akses direktori, tetapi dalam kasus saya, saya adalah pemegang kedua belah pihak, yang dalam konteks lokal.

vdegenne.dll
sumber
0

Saya memiliki masalah yang sama, saya menggunakan Plesk Onyx 17 dengan Centos7. Saya bisa melihat kesalahan ini di proxy_error_log di bawah log domain yang terpengaruh. Semua dirs / file di / var / www / vhosts / dimiliki oleh masing-masing pengguna (pemilik domain) dan Anda dapat melihat bahwa semuanya ada di grup psacln. Jadi solusinya adalah menambahkan nginx juga ke grup ini, sehingga dia dapat melihat apa yang dia butuhkan:

usermod -aG psacln nginx

Dan memang, restart nginx dan muat ulang halaman dengan Ctrl + F5.

Slavomir Miskovec
sumber
0

Saya menemukan solusi: Pindahkan folder ke folder konfigurasi nginx, dalam kasus saya "/ etc / nginx / my-web-app". Dan kemudian mengubah hak akses ke pengguna root "sudo chown -R root: root" my-web-app ".

Dheeraj
sumber
0

Anda juga dapat menambahkan pengguna mana yang akan menjalankan nginx. Di file nginx.conf, lakukan perubahan berikut:

user root;

Anda dapat menambahkan baris di atas sebagai baris pertama di conf nginx Anda. Anda dapat menulis nama pengguna mana pun yang memiliki izin untuk menulis di direktori itu.

Rajat Bhatnagar
sumber
0

Ini biasanya masalah hak istimewa ... Bagi saya, karena saya menggunakan / root / ** sebagai root nginx, maka perlu hak istimewa yang lebih tinggi. Cara yang mudah adalah dengan memindahkan proyek ke direktori yang Anda buat sendiri.

bodoh
sumber