Nginx พูดว่า open ()“ /etc/nginx/conf.d/foo.conf” ล้มเหลว (13: ปฏิเสธการอนุญาต)


11

นี่คือสิ่งที่ฉันมีในls -al /etc/nginx:

total 52
drwxr-xr-x.  4 root root 4096 Jul 28 04:16 .
drwxr-xr-x. 78 root root 8192 Jul 28 03:37 ..
drwxr-xr-x.  2 root root   26 Jul 28 03:55 conf.d
drwxr-xr-x.  2 root root    6 May 10 09:21 default.d
-rw-r--r--.  1 root root 1034 May 10 09:21 fastcgi.conf
-rw-r--r--.  1 root root  964 May 10 09:21 fastcgi_params
-rw-r--r--.  1 root root 2837 May 10 09:21 koi-utf
-rw-r--r--.  1 root root 2223 May 10 09:21 koi-win
-rw-r--r--.  1 root root 3957 May 10 09:21 mime.types
-rw-r--r--.  1 root root 1033 Jul 28 03:43 nginx.conf
-rw-r--r--.  1 root root  596 May 10 09:21 scgi_params
-rw-r--r--.  1 root root  623 May 10 09:21 uwsgi_params
-rw-r--r--.  1 root root 3610 May 10 09:21 win-utf

นี่คือสิ่งที่ฉันเห็น/var/log/nginx/error.logหลังจากsudo service nginx start:

[emerg] 20360#0: open() "/etc/nginx/conf.d/foo.conf" failed
(13: Permission denied) in /etc/nginx/nginx.conf:33

นี่คือสิ่งที่ฉันมีในls -al /etc/nginx/conf.d/:

$ ls -al /etc/nginx/conf.d/
total 8
drwxr-xr-x. 2 root root   26 Jul 28 03:55 .
drwxr-xr-x. 4 root root 4096 Jul 28 04:16 ..
-rw-r--r--. 1 root root  230 Jul 28 03:50 foo.conf

เกิดอะไรขึ้น


2
บังคับใช้ SELinux หรือไม่ อะไรls -lZแสดง ลองsetenforce 0ดูว่าใช้ได้ไหม
ชิ

แน่นอนsetenforce 0ช่วยด้วย กรุณาส่งมันเป็นคำตอบฉันจะยอมรับมัน
yegor256

คำตอบ:


19

เมื่อคุณได้รับpermission deniedข้อผิดพลาดในการเข้าถึงไฟล์และอื่น ๆ โดยไม่ทราบสาเหตุอาจเกี่ยวข้องกับ SELinux โดยเฉพาะอย่างยิ่งเมื่อคุณเห็นช่วงเวลาต่อการอนุญาตเช่นdrwxr-xr-x.แสดงโดยls -lไฟล์ / dir ที่มีปัญหาพวกเขาอาจติดป้ายกำกับผิด (คุณสามารถดูได้ls -Z) และทำให้เกิดปัญหา

ครั้งแรกที่คุณควรตรวจสอบโหมด SELinux getenforceปัจจุบันโดยการเรียกใช้ หากมีข้อความว่าEnforcingให้ตั้งค่าโหมดชั่วคราวเป็นPermissiveโดยเรียกใช้setenforce 0และดูว่าแอปพลิเคชันของคุณทำงานในภายหลังหรือไม่

โปรดปรึกษาแนะนำการจัดจำหน่ายของคุณใน SELinux สำหรับการแก้ไขอย่างถาวรรวมถึงการตั้งโหมด SELinux ที่เริ่มต้นขึ้น, relabeling ไฟล์หรือไดเรกทอรีปรับปรุงนโยบาย ฯลฯ นี่คือHowto สำหรับ CentOS


2

การปรับเปลี่ยนทั้ง SElinux ไม่ใช่คำตอบที่ถูกต้องเสมอไป ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันจะเปรียบเทียบกับการปิดใช้งานไฟร์วอลล์หากพอร์ตไม่สามารถเข้าถึงได้

วิธีแก้ปัญหาอย่างรวดเร็วอื่น ๆ อาจเป็น "กู้คืนบริบทของไฟล์" โดยเฉพาะอย่างยิ่งหากคัดลอกมาจากที่อื่น

ดูhttps://www.thegeekstuff.com/2017/05/restorecon-examples/สำหรับรายละเอียดเพิ่มเติม

คำสั่งเหล่านี้ควรลองก่อนที่จะปิดการใช้งาน SElinux

sudo restorecon  /etc/nginx/conf.d/
sudo restorecon  /etc/nginx/conf.d/*

คำสั่งนี้ให้ฉันFull path required for exclude: net:[...].
Nakilon

0

วิธีที่ดีกว่าการปิดใช้งาน selinux คือการใช้คำสั่ง

semanage permissive -a httpd_t

ซึ่งจะช่วยให้บริการ toe nginx สามารถส่งผ่านได้โดยไม่ต้องปิดใช้งาน selinux อย่างสมบูรณ์

ข้อมูลเพิ่มเติมเกี่ยวกับhttps://www.nginx.com/blog/using-nginx-plus-with-selinux/

อย่างไรก็ตามสำหรับฉันที่ทำงานcommand chcon -v --type=httpd_sys_content_t /etc/nginx/*และทำงานอย่างถูกต้องโดยไม่จำเป็นต้อง excempt httpd_t

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