Nginx: stat () ล้มเหลว (13: ปฏิเสธการอนุญาต)


103

ฉันใช้การกำหนดค่าเริ่มต้นในขณะที่เพิ่มไดเร็กทอรีเฉพาะที่ติดตั้ง nginx บนเครื่อง ubuntu 12.04 ของฉัน

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
เป็นไปได้ไหมว่า / ชื่อผู้ใช้อยู่ในการเข้ารหัสลับ ฉันมีปัญหาเดียวกันกับโฟลเดอร์ / home / username ซึ่งเป็นที่ตั้งของไซต์ของฉัน ถ้าฉันย้ายออกจาก encryptfs ทุกอย่างก็ใช้ได้ดี ยังไม่มีทางออกสำหรับฉัน ...
Georgi

คำตอบ:


194

Nginx ทำงานภายในไดเร็กทอรีดังนั้นหากคุณไม่สามารถcdไปยังไดเร็กทอรีนั้นจากผู้ใช้ nginx ได้ก็จะล้มเหลว (เช่นเดียวกับ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 ในไดเร็กทอรีใหม่หรือไม่?
Qian Chen

2
@ElgsQianChen โปรดทราบว่านี่เป็นระบบอนุญาตระดับ OS ดังนั้นในระบบ POSIX จึงขึ้นอยู่กับumaskไฟล์. หากคุณต้องการโซลูชันทั่วไปที่ไม่จำเป็นต้องมีchmodไดเร็กทอรีใหม่ทุกรายการก็มีวิธีแก้ปัญหา ต้องมีการเชื่อมโยงกลุ่มย้อนกลับ ( usernameเพื่อwww-dataจัดกลุ่ม) และการใช้setgid. อย่าลังเลที่จะโพสต์คำถามใหม่สำหรับคำอธิบายที่ละเอียดยิ่งขึ้นเรายินดีที่จะตอบ
Maciej Sz

จะเกิดอะไรขึ้นถ้าพา ธ ของฉันอยู่ในไดเร็กทอรี / root /? การทำ chmod g + x บน / root ปลอดภัยหรือไม่? และเพิ่ม www-data ไปยัง root group?
Oleg Abrazhaev

ใน Fedora 24 ปัญหาของฉันมาพร้อมกับ ... สิทธิ์ ACL ... อีกชั้น ... เย้!
Ray Foss

1
nginxผู้ใช้ของฉันสามารถเข้าถึงไดเร็กทอรีเว็บไซต์ของฉันได้ แต่ยังคงบอกว่าการอนุญาตถูกปฏิเสธในบันทึกข้อผิดพลาด
Rahil Wazir

89

ฉันเพิ่งมีปัญหาเดียวกันกับกล่อง CentOS 7

ดูเหมือนว่าฉันจะตี Selinux การทำให้ Selinux เข้าสู่โหมดอนุญาต ( setenforce permissive) ได้แก้ปัญหาไปแล้วในตอนนี้ ฉันจะพยายามกลับไปแก้ไขอย่างเหมาะสม


4
นี่คือพฤติกรรมที่ "ไม่ได้จัดทำเป็นเอกสาร" ที่ฉันพยายามทำความเข้าใจในช่วง 3 วันที่ผ่านมานี้ ...
Achilles

2
นี่คือโพสต์เกี่ยวกับพฤติกรรมนี้: axilleas.me/en/blog/2013/…
Achilles

2
ดังนั้นฉันพบว่าตัวเองกลับมาที่นี่ ... คราวนี้ฉันพบว่าฉันคัดลอกไฟล์ที่เป็นปัญหาจากโฮมไดเร็กทอรีไปยังไดเร็กทอรี html และอัปเดตความเป็นเจ้าของ ปัญหาเดียวกับปี 2015 ... Better fix: ls -Z myFile.jsจะแสดงบริบท SELinux: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js ใช้chcon -v --type=httpd_sys_content_t myFileเพื่อเปลี่ยนเนื้อหา SELinux
Andrew Richard Miller

2
ได้; ฉันมีปัญหาเดียวกัน sudo setenforce 0แก้ไขให้ฉัน
Overload119

1
โปรดทราบว่าหากคุณต้องการปิดการใช้งาน Selinux อย่างสมบูรณ์คุณจะต้องเปลี่ยนSELINUXค่าเป็นdisabledin /etc/selinux/configตามด้วยการรีบูต เมื่อตั้งค่าเป็นpermissiveก็ยังสามารถเรียกใช้การตรวจสอบเบื้องหลัง (โดยใช้ CPU ที่มีค่า) แต่ไม่ต้องดำเนินการใด ๆ
Oliver Tappin

76

Nginx ต้องมีการเข้าถึง + x ในไดเรกทอรีทั้งหมดที่นำไปสู่ไดเรกทอรีรากของไซต์

ตรวจสอบให้แน่ใจว่าคุณมี + x ในไดเร็กทอรีทั้งหมดในพา ธ ที่นำไปสู่รูทของไซต์ ตัวอย่างเช่นหากรูทของไซต์คือ / home / username / siteroot:

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

13
หลังจาก 6 ชั่วโมงของการค้นหา ... พบศพพูดถึงสิ่งนี้ แต่คุณ! ขอบคุณ!
Walid Ammar

3
ขอบคุณมาก! ใช้เวลาหลายชั่วโมงในการทำให้สิ่งนี้ได้ผลและพบคำตอบทุกประเภทไม่อยากจะเชื่อเลยว่ามันง่ายมาก!
Eric Groom

2
งานนี้ดีสำหรับฉัน centos 7, php fpm 7.2 (selinux ปิดแล้ว)
anhduc.bkhn

1
ขอบคุณ! ไม่อยากจะเชื่อเลยว่านี่คือทั้งหมดที่ฉันต้องทำตลอดเวลา!
exciteabletom

1
ขอบคุณสมบูรณ์แบบ!.
Softsofter

32

ใน CentOS 7.0 ฉันพบAccess Deinedปัญหานี้ที่เกิดจาก SELinux และขั้นตอนเหล่านี้สามารถแก้ไขปัญหาได้:

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

ปรับปรุง:เพียงด้านโน้ตจากสิ่งที่ผมได้เรียนรู้ในขณะที่ใช้ Linux เซิร์ฟเวอร์เสมือน DigitalOcean หรือที่พวกเขาเรียกพวกเขาหยด การใช้ SELinux ต้องใช้ RAM ในปริมาณที่เหมาะสม เป็นไปได้มากว่าคุณจะไม่สามารถเรียกใช้และจัดการ SELinux บนหยดที่มี RAM น้อยกว่า 2GB


2
ขอบคุณมากสำหรับสิ่งนี้ มันไม่ได้แก้ปัญหาของฉัน (ยัง CentOS 7) จะเริ่มต้นด้วย แต่แล้วฉันถูกบล็อกโดยปฏิเสธที่สองอื่น ๆ ดังนั้น resorted setenforce 0ไป อย่างไรก็ตามเมื่อมองย้อนกลับไปว่าโซลูชันนี้ใช้งานได้จริงฉันรู้ว่าฉันจำเป็นต้องเรียกใช้คำสั่งอีกครั้งเพื่ออัปเดตสิทธิ์สำหรับผู้ใช้ nginx ดูเหมือนจะได้ผลและฉันสามารถตั้งค่า SELinux ให้กลับมาบังคับใช้
danj1974

อาจจะสายเกินไปหน่อย ถึงกระนั้นก็ควรค่าแก่การกล่าวถึงว่าเมื่อคุณบังคับใช้ SELinux จำเป็นที่จะต้องจำไว้ว่าซอฟต์แวร์เช่น Nginx จะใส่ชุดของกฎของตนเองเช่นพอร์ตเริ่มต้นเส้นทางเริ่มต้นการเข้าถึงเส้นทางอ่าน / เขียน ฯลฯ ใน SELinux หากคุณไม่ต้องการให้เกิดปัญหาใด ๆ คุณต้องปฏิบัติตามกฎเหล่านั้น (เช่นการใส่ไฟล์ HTML / PHP ของคุณลงใน / var / www) มิฉะนั้นเตรียมที่จะเอาชนะปัญหาที่เกิดขึ้นในบริบท SELinux สิ่งนี้มีประโยชน์ [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

คุณอาจมี Security-Enhanced Linux ทำงานอยู่ดังนั้นให้เพิ่มกฎสำหรับสิ่งนั้น ฉันได้รับอนุญาต 13 ข้อผิดพลาดแม้ว่าจะมีการตั้งค่าสิทธิ์และมีผู้ใช้อยู่ ..

chcon -Rt httpd_sys_content_t /username/test/static


ขอบคุณ! ทำงานบน CentOS รีลีส 6.10 (ขั้นสุดท้าย)
marw

1
ทำงานบน CentOS 7.5.1804 (Core)
Niek

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>

ใน ngix.conf (หรือ / etc / nginx / sites-available / default)

สิ่งนี้ใช้ได้กับฉันใน ubuntu แต่ฉันคิดว่ามันไม่น่าจะแตกต่างกันมากสำหรับ distros อื่น ๆ

หวังว่าจะช่วยได้


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

ในกรณีของฉันโฟลเดอร์ที่ให้บริการไฟล์เป็นลิงก์สัญลักษณ์ไปยังโฟลเดอร์อื่นที่สร้างด้วยไฟล์

ln -sf /origin /var/www/destination

แม้ว่าสิทธิ์ (ผู้ใช้และกลุ่ม) ที่ถูกต้องในโฟลเดอร์ปลายทาง (ลิงก์สัญลักษณ์) ฉันยังคงมีข้อผิดพลาดเนื่องจาก Nginx จำเป็นต้องมีสิทธิ์ในลำดับชั้นทั้งหมดของโฟลเดอร์ต้นทางด้วย


1

ในที่สุดฉันก็พบทางผ่าน ในระยะสั้นสมมติว่าชื่อผู้ใช้ของคุณและคุณถือเว็บไซต์ภายใต้ระบบแฟ้มส่วนตัวของคุณjoe/home/joe/path/to/website

คุณต้องบอกระบบที่nginxเป็นเพื่อนของคุณอย่างแท้จริง
วางnginxในjoeกลุ่ม:

sudo gpasswd -a nginx joe

หลังจากนั้นหากยังใช้งานไม่ได้ให้ตรวจสอบสิทธิ์การเข้าถึง/home/joeไดเรกทอรี นั่นอาจเป็นเหตุผลว่าทำไม nginx ไม่สามารถเข้าถึงไฟล์ได้เพราะแม้ว่าเขาจะเป็นเพื่อนของคุณตอนนี้คุณก็ต้องเปิดประตูบ้านให้เขา:

sudo chmod g+x /home/joe

แค่นั้นแหละ. นั่นคือทั้งหมดที่คุณต้องทำเพื่อให้ nginx เข้าถึงไฟล์ในเครื่องของคุณ :)

ฉันไม่คิดว่าจะมีข้อกังวลด้านความปลอดภัยกับวิธีนี้เนื่องจากnginxเป็นผู้มีอำนาจสูงและมีเพียงผู้ดูแลระบบเท่านั้นที่สามารถเปลี่ยนกลุ่มได้ nginxตอนนี้สามารถอ่านสิ่งที่อยู่ในjoeไดเร็กทอรี เป็นเพียงการละเมิดความปลอดภัยหากเจ้าของnginxบัญชีแตกต่างจากผู้ใช้ที่คุณเปิดการเข้าถึงไดเรกทอรี แต่ในกรณีของฉันฉันเป็นเจ้าของทั้งสองฝ่ายซึ่งอยู่ในบริบทของท้องถิ่น


0

ฉันมีปัญหาเดียวกันฉันใช้ Plesk Onyx 17 กับ Centos7 ฉันเห็นข้อผิดพลาดนี้ใน proxy_error_log ภายใต้บันทึกของโดเมนที่ได้รับผลกระทบ ไฟล์ / ไฟล์ทั้งหมดใน / var / www / vhosts / เป็นของผู้ใช้ที่เกี่ยวข้อง (เจ้าของโดเมน) และคุณจะเห็นว่าไฟล์ทั้งหมดอยู่ในกลุ่ม psacln ดังนั้นวิธีแก้ปัญหาคือเพิ่ม nginx ลงในกลุ่มนี้ด้วยเพื่อให้เขาเห็นสิ่งที่ต้องการ:

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

นี่เป็นปัญหาสิทธิพิเศษ ... สำหรับฉันมันเป็นเพราะฉันใช้ / root / ** เป็นรูท nginx จึงต้องการสิทธิ์ที่สูงกว่า วิธีง่ายๆเพียงแค่ย้ายโปรเจ็กต์ไปไว้ในไดเร็กทอรีที่สร้างขึ้นเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.