Nginx: स्टेट () विफल (13: अनुमति अस्वीकृत)


103

मैं अपने ubuntu 12.04 मशीन पर स्थापित nginx के साथ विशिष्ट निर्देशिका जोड़ते हुए डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर रहा हूं।

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

...
}

मैं बस उस निर्देशिका से बाहर फ़ाइलों की सेवा के लिए एक साधारण स्थैतिक nginx सर्वर चाहता हूँ। हालाँकि, error.logमैं देख रहा हूँ

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

मैं पहले से ही किया है chown -R www-data:www-dataपर /username/test/static, मैं उन्हें करने के लिए निर्धारित किया है chmod 755। मुझे नहीं पता कि और क्या सेट करने की जरूरत है।


3
जाँचें कि www-dataउपयोगकर्ता निर्देशिका में जा सकता cdहै /username/test/static:sudo -u www-data cd /username/test/static
Maciej Sz

मुझे अनुमति से वंचित किया जा रहा है, लेकिन जब मैं ls -l करता हूं तो यह दिखाता है कि www-data उपयोगकर्ता को इसका सेट
user299709

2
क्या यह हो सकता है कि / यूजरनेम एन्क्रिप्टफोर्स पर हो? मैं / होम / उपयोगकर्ता नाम फ़ोल्डर के साथ बिल्कुल वही मुद्दे रख रहा हूं, जहां मेरी साइट स्थित है। अगर मैं इसे एनक्रिप्टफ से बाहर ले जाता हूं तो सभी ठीक काम करता है। फिर भी मेरे लिए कोई हल नहीं ...
जॉर्जी

जवाबों:


194

Nginx निर्देशिका के भीतर काम करता है, इसलिए यदि आप cdnginx उपयोगकर्ता से उस निर्देशिका में नहीं जा सकते हैं तो यह विफल हो जाएगा (जैसा कि statआपके लॉग में कमांड करता है )। सुनिश्चित करें कि www-userयह कर सकते हैं cdसब के लिए रास्ता /username/test/static। आप यह पुष्टि कर सकते हैं कि statदौड़ने से वसीयत विफल हो जाएगी या सफल हो जाएगी

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

आपके मामले में शायद /usernameनिर्देशिका यहाँ मुद्दा है। आमतौर पर अन्य उपयोगकर्ताओं के घर निर्देशिकाओं के लिए www-dataअनुमति नहीं है cd

उस मामले में सबसे अच्छा समाधान जोड़ने के लिए किया जाएगा www-dataकरने के लिए usernameसमूह:

gpasswd -a www-data username

और सुनिश्चित करें कि usernameसमूह पथ के साथ सभी निर्देशिकाओं को दर्ज कर सकता है:

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

अपने परिवर्तनों को काम करने के लिए, nginx को पुनरारंभ करें

nginx -s reload

क्या इसका मतलब है कि हर नई निर्देशिका को रूट के तहत जोड़ा जाता है, chmod को नई निर्देशिकाओं के लिए किया जाना है?
कियान चेन

2
@ElgsQianChen यह ध्यान रखें कि यह OS स्तर की अनुमति प्रणाली है, इसलिए POSIX प्रणालियों में यह आपके पर निर्भर करता है umask। यदि आपको अधिक सामान्य समाधान की आवश्यकता होती है, जिसमें chmodहर नई निर्देशिका को शामिल करने की आवश्यकता नहीं होती है , तो एक समाधान है। यह रिवर्स समूह संघ (की आवश्यकता usernameकरने के लिए www-dataसमूह) और के उपयोग setgid। अधिक विस्तृत विवरण के लिए एक नया प्रश्न पोस्ट करने के लिए स्वतंत्र महसूस करें और मुझे उत्तर देने में खुशी होगी।
मैकीज एसज

क्या होगा यदि मेरा रास्ता / रूट / निर्देशिका में है? क्या chmod g + x को / root करना सुरक्षित है? और www-data को root group में जोड़ना है?
ओलेग अब्राजेव

Fedora 24 पर मेरा मुद्दा ... एसीएल की अनुमति ... एक और परत ... के साथ आया!
रे फॉस

1
वैसे मेरा nginxउपयोगकर्ता मेरी वेबसाइट निर्देशिका का उपयोग करने में सक्षम है, लेकिन फिर भी यह कहता है कि त्रुटि लॉग पर अस्वीकृत अनुमति दी गई है।
राहिल वजीर

89

मैं अभी एक CentOS 7 बॉक्स पर एक ही समस्या है।

लगता है मैं selinux मारा जाएगा। सेलिनक्स को अनुमेय मोड ( setenforce permissive) में डालकर अभी के लिए समस्या का काम किया है। मैं कोशिश करूँगा और एक उचित फिक्स के साथ वापस आऊंगा।


4
यह सटीक "डॉक्यूमेंटेड नहीं" व्यवहार है जो मैं इन आखिरी 3 दिनों के लिए समझने की कोशिश कर रहा था ...
अकिलीस

2
यहाँ इस व्यवहार के बारे में एक पोस्ट है: axilleas.me/en/blog/2013/…
Achilles

2
इसलिए, मैंने खुद को यहां वापस पाया ... इस बार मुझे लगता है कि मैंने अपने होम डायरेक्टरी से HTML डायरेक्टरी में प्रश्न की फाइल कॉपी की, और स्वामित्व को अपडेट किया। 2015 के रूप में एक ही मुद्दा ... बेहतर तय: ls -Z myFile.jsSELinux संदर्भ दिखाएगा: SELinux सामग्री को बदलने के लिए -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js उपयोग करें chcon -v --type=httpd_sys_content_t myFile
एंड्रयू रिचर्ड मिलर

2
हाँ; मेरी भी यही समस्या थी। sudo setenforce 0यह मेरे लिए तय किया।
ओवरलोड ११

1
बस एक ध्यान दें, यदि आप SELinux पूरी तरह से अक्षम करना चाहते हैं, तो आप को बदलना होगा SELINUXकरने के लिए मूल्य disabledमें /etc/selinux/configएक रिबूट के बाद,। जब यह सेट हो जाता है permissive, तब भी यह पर्दे के पीछे (मूल्यवान सीपीयू का उपयोग करके) चेक चला सकता है, लेकिन कोई कार्रवाई नहीं करता है।
ओलिवर टैपिन

76

Nginx को साइट की रूट डाइरेक्टरी की ओर ले जाने वाले सभी डाइरेक्टरी पर + x एक्सेस की आवश्यकता है।

सुनिश्चित करें कि आपके पास साइट के रूट पर जाने वाले मार्ग के सभी निर्देशिकाओं पर x है। उदाहरण के लिए, यदि साइट रूट / घर / उपयोगकर्ता नाम / साइटरूट है:

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

13
6 घंटे की हताश खोज के बाद ... पाया शरीर ने यह उल्लेख किया है लेकिन आप! धन्यवाद!
वालिद अम्मार

3
आपको बहुत - बहुत धन्यवाद! इसे काम करने के लिए बिताए गए घंटे बिताए गए और सभी प्रकार के उत्तरों के साथ आया, विश्वास नहीं हो सकता कि यह इतना आसान था!
एरिक ग्रूम

2
मेरे लिए यह काम ठीक है, सेंटो 7, php fpm 7.2 (सेलिनक्स पहले से ही बंद)
anhduc.bkhn

1
धन्यवाद! विश्वास नहीं कर सकता यह सब मुझे पूरे समय करना था!
exciteabletom

1
थैंक्यू, एकदम सही !.
सोफ्त्सोफ़्टर

32

CentOS 7.0 पर मुझे Access DeinedSELinux के कारण यह समस्या हुई और इन कदमों ने इस समस्या को हल कर दिया:

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

अद्यतन: मैं DigitalOcean के वर्चुअल लिनक्स सर्वर का उपयोग कर, या वे उन्हें के रूप में, जबकि क्या सीखा है से सिर्फ अतिरिक्त नोट के बूंदों । SELinux का उपयोग करने के लिए एक अच्छी मात्रा में RAM की आवश्यकता होती है। यह संभवत: ऐसा है जैसे आप 2GB से कम रैम वाले ड्रॉपलेट पर SELinux को चलाने और प्रबंधित करने में सक्षम नहीं होंगे ।


2
इसके लिए बहुत - बहुत धन्यवाद। इसने मेरी समस्या (सैंटोस 7 पर भी) को शुरू करने के लिए हल किया था, लेकिन फिर मुझे एक दूसरे खंडन द्वारा कहीं और अवरुद्ध कर दिया गया था, इसलिए इसका सहारा लिया setenforce 0। हालांकि, जब यह समाधान वास्तव में क्या करता है, इसे देखते हुए, मुझे एहसास हुआ कि मुझे नगीन उपयोगकर्ता के लिए अनुमतियों को अपडेट करने के लिए कमांड को फिर से चलाने की आवश्यकता है। यह काम लग रहा था और मैं SELinux को वापस लागू करने के लिए सेट कर सकता था।
danj1974

खैर, यह थोड़ा बहुत देर हो सकती है। फिर भी, यह ध्यान देने योग्य है कि जब आप SELinux को लागू करते हैं; यह याद रखना अनिवार्य है, Nginx जैसे सॉफ़्टवेयर डिफ़ॉल्ट पोर्ट, डिफ़ॉल्ट पथ, पढ़ने / लिखने के पथ जैसे नियमों के अपने सेट को SELinux में सम्मिलित करते हैं। यदि आप कोई परेशानी नहीं चाहते हैं, तो आपको उन नियमों का पालन करना चाहिए (जैसे अपनी HTML / PHP फ़ाइलों को / var / www में डालना) या फिर SELinux संदर्भ में गहरी होने वाली समस्याओं को दूर करने के लिए तैयार रहें। यह मददगार हो सकता है [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

आपके पास सुरक्षा-संवर्धित लिनक्स चल सकता है, इसलिए उसके लिए नियम जोड़ें। मेरे पास 13 त्रुटियां थीं, भले ही अनुमतियाँ सेट की गई थीं और उपयोगकर्ता मौजूद था।

chcon -Rt httpd_sys_content_t /username/test/static


धन्यवाद! CentOS रिलीज 6.10 (अंतिम) पर काम किया।
शादी की

1
CentOS 7.5.1804 (कोर) पर काम किया।
नीक

4

लक्षण:

WordPress Media Library में चित्र अपलोड नहीं किया जा सका।

कारण:

(CentOS) yum update

त्रुटि:

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"

उपाय:

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


2

डिफ़ॉल्ट रूप से स्थैतिक डेटा, जब आप nginx स्थापित करते हैं, तो / var / www / html में होगा। तो आप बस अपने स्थिर फ़ोल्डर को / var / html / में कॉपी कर सकते हैं और सेट कर सकते हैं

root /var/www/<your static folder>

in ngix.conf (या / etc / nginx / साइट्स-उपलब्ध / डिफ़ॉल्ट)

इसने ubuntu पर मेरे लिए काम किया, लेकिन मुझे लगता है कि यह अन्य डिस्ट्रो के लिए बहुत अलग नहीं होना चाहिए।

आशा करता हूँ की ये काम करेगा।


2

अपनी nginx.conf userसंपत्ति को www-staticफाइलर को बदलें ।

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

user your_user_name;

# same other config

1

मुझे इस समस्या का सामना करना पड़ा, मैंने इसे nginx उपयोगकर्ता और कुछ इस तरह से समूह को अनुमति देने के लिए हल किया:

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

1

मेरे मामले में, जिस फोल्डर में फाइलें सेव की जाती हैं, वह किसी अन्य फ़ोल्डर का एक प्रतीकात्मक लिंक होता है, जिसके साथ बनाया जाता है

ln -sf /origin /var/www/destination

भले ही अनुमतियाँ (उपयोगकर्ता और समूह) जहां गंतव्य फ़ोल्डर (प्रतीकात्मक लिंक) पर सही हैं, फिर भी मुझे त्रुटि हुई क्योंकि नग्नेक्स को मूल फ़ोल्डर के पदानुक्रम के साथ-साथ अनुमतियों की भी आवश्यकता थी।


1

मैंने आखिरकार अपना रास्ता ढूंढ लिया। संक्षेप में, मान लें कि आपका उपयोगकर्ता नाम है joeऔर आप अपने व्यक्तिगत फाइल सिस्टम के तहत एक वेबसाइट रखते हैं /home/joe/path/to/website

आपको सचमुच उस सिस्टम को बताना होगा जो nginxआपका पाल है। समूह में
रखें :nginxjoe

sudo gpasswd -a nginx joe

उसके बाद अगर यह अभी भी काम नहीं करता है, तो /home/joeनिर्देशिका की सही पहुंच की जांच करें । शायद यही कारण है कि नाज़िनक्स फ़ाइल तक नहीं पहुँच सकता है क्योंकि भले ही वह आपका दोस्त हो, अब आपको उसे अपने घर का दरवाजा खोलना होगा:

sudo chmod g+x /home/joe

बस। यह शाब्दिक रूप से आप सभी को अपनी स्थानीय फ़ाइलों को nginx एक्सेस देने के लिए करना है :)

मुझे नहीं लगता कि इस पद्धति के साथ सुरक्षा चिंताएं हैं क्योंकि nginxउच्च प्राधिकरण है और केवल एक व्यवस्थापक ही समूह को बदल सकता है। nginxअब joeनिर्देशिका में क्या पढ़ सकते हैं । यह केवल एक सुरक्षा उल्लंघन है यदि nginxखाते का धारक उस उपयोगकर्ता के साथ अलग है जिसे आप से निर्देशिका एक्सेस खोलते हैं, लेकिन मेरे मामले में मैं दोनों पक्षों का धारक हूं, जो कि स्थानीय संदर्भ में है।


0

मैं एक ही मुद्दा था, मैं Centos7 के साथ Plesk गोमेद 17 का उपयोग कर रहा हूँ। मैं प्रभावित डोमेन के लॉग के तहत प्रॉक्सी_error_log में इस त्रुटि को देख सकता था। सभी dirs / files in / var / www / vhosts / संबंधित उपयोगकर्ताओं (डोमेन मालिकों) के स्वामित्व में हैं और आप देख सकते हैं कि ये सभी psacln समूह में हैं। इसलिए समाधान इस समूह में नग्नेक्स को भी जोड़ना था, ताकि वह देख सके कि उसे क्या चाहिए:

usermod -aG psacln nginx

और वास्तव में, nginx को पुनः आरंभ करें और Ctrl + F5 के साथ पृष्ठ पुनः लोड करें।


0

मुझे चारों ओर एक काम मिला: फ़ोल्डर को nginx कॉन्फ़िगरेशन फ़ोल्डर में ले जाया गया, मेरे मामले में "/ etc / nginx / my-web-app"। और फिर उपयोगकर्ता को "sudo chown -R root: root" my-web-app "रूट करने के लिए अनुमतियाँ बदल दीं।


0

आप यह भी जोड़ सकते हैं कि कौन सा उपयोगकर्ता nginx चलाएगा। Nginx.conf फ़ाइल में, निम्नलिखित परिवर्तन करें:

user root;

आप उपरोक्त रेखा को अपने nginx conf में पहली पंक्ति के रूप में जोड़ सकते हैं। आप किसी भी उपयोगकर्ता का नाम लिख सकते हैं जिसे उस निर्देशिका में लिखने की अनुमति है।


0

यह आमतौर पर विशेषाधिकार की समस्या है ... मेरे लिए, क्योंकि मैं nginx रूट के रूप में / रूट / ** का उपयोग करता हूं, इसे उच्च विशेषाधिकार की आवश्यकता है। एक आसान तरीका यह है कि परियोजना को स्वयं द्वारा बनाई गई निर्देशिका में स्थानांतरित करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.