[unix] Nginx는 open ()“/etc/nginx/conf.d/foo.conf”가 실패했다고 말합니다 (13 : 권한이 거부되었습니다)

여기 내가 가진 것입니다 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.logsudo 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

뭐가 문제 야?



답변

permission denied알 수없는 이유로 파일 액세스 등에 오류 가 발생하면 SELinux와 관련이있을 수 있습니다. 특히 문제의 파일 / 디렉토리에 대해 drwxr-xr-x.표시된 것과 같은 권한 뒤에 마침표 ls -l가 표시되면 레이블이 잘못되어 (로 표시 될 수 있음 ls -Z) 문제가 발생할 수 있습니다.

먼저을 실행하여 현재 SELinux 모드를 확인해야합니다 getenforce. 이 표시되면 을 실행 Enforcing하여 모드를 일시적으로 설정하고 나중에 응용 프로그램이 작동하는지 확인하십시오.Permissivesetenforce 0

시작시 SELinux 모드 설정, 파일 또는 디렉토리 레이블 지정, 정책 업데이트 등을 포함하여 영구적으로 수정 된 내용은 SELinux의 배포 안내서를 참조하십시오 . CentOS 용 Howto입니다 .


답변

SElinux 전체를 변경하는 것이 항상 정답은 아닙니다. 나는 전문가가 아니지만 포트에 액세스 할 수없는 경우 방화벽을 비활성화하는 것과 비교하고 싶습니다.

다른 빠른 해결책은 파일이 “어딘가에서 복사 된 경우”파일의 “SE 컨텍스트를 복원”하는 것입니다.

자세한 내용은 https://www.thegeekstuff.com/2017/05/restorecon-examples/ 를 참조하십시오.

다음은 SElinux를 비활성화하기 전에 시도해 볼만한 명령입니다.

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


답변

selinux를 비활성화하는 것보다 나은 방법은 다음 명령을 사용하는 것입니다

semanage permissive -a httpd_t

그러면 selinux를 완전히 비활성화하지 않고 발가락 nginx 서비스를 통과시킬 수 있습니다.

https://www.nginx.com/blog/using-nginx-plus-with-selinux/에 대한 자세한 정보

그러나 나를 실행하면 command chcon -v --type=httpd_sys_content_t /etc/nginx/*httpd_t를 면제 할 필요없이 제대로 작동했습니다.


답변