2015-01-15 4 views
6

के रूप में चलाने के दौरान भी मेरे पास nginx के पीछे uWSGI के तहत चल रहा एक फ्लास्क ऐप है।अपस्ट्रीम पढ़ने के दौरान nginx अनुमति अस्वीकार की गई - यहां तक ​​कि रूट

*1 readv() failed (13: Permission denied) while reading upstream, client: 10.0.3.1, server: , request: "GET /some/path/constants.js HTTP/1.1", upstream: "uwsgi://unix:/var/uwsgi.sock:", host: "dev.myhost.com" 

सॉकेट पर अनुमतियों को ठीक (666, और nginx रूप में एक ही उपयोगकर्ता के लिए सेट), वास्तव में, यहां तक ​​कि जब मैं रूट के रूप में चलाने के nginx मैं अभी भी इस त्रुटि मिलती है।

फ्लास्क ऐप/uwsgi अनुरोध को ठीक से भेज रहा है। लेकिन यह सिर्फ Nginx द्वारा पढ़ा नहीं जा रहा है। यह उबंटू यूटोपिक यूनिकॉर्न पर है।

कोई विचार जहां अगर nginx प्रक्रिया में सॉकेट तक पूर्ण पहुंच हो तो अनुमति अस्वीकार हो सकती है?

एक जटिल कारक के रूप में यह सर्वर एक कंटेनर में चल रहा है जिसमें उबंटू 14.04 स्थापित है। और यह सेटअप काम करने के लिए प्रयोग किया जाता था ... लेकिन मैंने हाल ही में मेजबान को 14.10 तक अपग्रेड किया ... मैं पूरी तरह से समझ सकता हूं कि यह समस्या का कारण हो सकता है। लेकिन इससे पहले कि मैं मेजबान को डाउनग्रेड करें या कंटेनर को अपग्रेड करें, मैं समझना चाहता हूं कि क्यों।

जब मैं एक कार्यकर्ता जो इस त्रुटि मैं कॉल यह बना रहा है देखते हैं पैदा कर रहा है पर strace चलाने कुछ इस तरह है:

readv(14, 0x7fffb3d16a80, 1)   = -1 EACCES (Permission denied) 

14 फ़ाइल वर्णनकर्ता इस सिस्टम कॉल के द्वारा बनाया जा रहा है

socket(PF_LOCAL, SOCK_STREAM, 0)  = 14 

तो यह स्थानीय सॉकेट से नहीं पढ़ा जा सकता है जिसे उसने अभी बनाया है?

उत्तर

4

ठीक है! तो समस्या, मुझे लगता है, this bug से संबंधित था। ऐसा लगता है कि भले ही कंटेनर के अंदर सॉकेट तक पहुंच को रोकने के लिए एपर्मर कॉन्फ़िगर नहीं किया गया था, फिर भी वास्तव में उनसे पढ़ने से रोकने के लिए कुछ कर रहा था (हालांकि सृजन नहीं ...) ताकि कंटेनर के लिए एपर्मर बंद कर दिया जा सके (following these instructions) इसे ठीक करने के लिए काम किया ।

दो प्रासंगिक लाइनों थे:

sudo apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start 

sudo ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/

और जोड़ने

lxc.aa_profile = unconfined 

कंटेनर कॉन्फ़िगरेशन फ़ाइल में।

एनबी: ये त्रुटियां किसी भी एपर्मर लॉग में दर्ज नहीं की गई थीं।

+0

क्या आप फिक्स के बारे में अधिक जानकारी जोड़ सकते हैं? मेरे मामले में काम नहीं लग रहा है। –

+0

मैंने अपने उत्तर में दो प्रासंगिक रेखाएं जोड़ दी हैं।लेकिन अगर वे आपके लिए समस्या को ठीक नहीं कर रहे हैं तो आपके पास एक असंबंधित समस्या हो सकती है :( – aychedee

+0

दुर्भाग्य से मेरे सिस्टम पर usr.bin.lxc-start फ़ाइल नहीं है, केवल /etc/apparmor.d/docker है। और जब मैं डॉकर फ़ाइल के साथ वर्णित प्रक्रिया करें, डॉकर सेवा अब 'डेमॉन से त्रुटि प्रतिक्रिया के साथ शुरू नहीं होती है: कंटेनर डेटाबेस शुरू नहीं कर सकता: एपर्मर प्रोफाइल डॉकर-डिफॉल्ट सेट करें: ऐसी कोई फ़ाइल या निर्देशिका FATA [0000] त्रुटि: एक प्रारंभ करने में विफल रहा है या अधिक कंटेनर –

1

यह समस्या शायद कर्नेल 3.16 में पेश की गई थी, क्योंकि यह 3.13 कर्नेल के साथ 14.04 पर पुन: उत्पन्न नहीं होती है। अजीब apparmor बग वास्तव में इसके लिए जिम्मेदार था।

दुर्भाग्यवश @ एइचेडी का समाधान मेरे लिए काम नहीं करता था। किसी के बारे में पता है इस मुद्दे की वर्तमान स्थिति क्या है

docker run --security-opt apparmor:unconfined ... 

हैं, तो क्या यह उत्तर :)

के तहत टिप्पणी जोड़ने पर विचार करें: मेरे मामले में मैं docker run आदेश के लिए निम्न पैरामीटर जोड़ने का मुद्दा से छुटकारा पाने के लिए किया था
+0

खुशी है कि आपने इसे हल किया है। – aychedee

+1

मुख्य अंतर यह है कि आप डॉकर का उपयोग कर रहे हैं, जबकि मैं लिनक्स कंटेनर का उपयोग कर रहा था। वही समस्या, लेकिन अलग कंटेनर तकनीक ताकि कॉन्फ़िगर एक अलग जगह पर हो। – aychedee

संबंधित मुद्दे