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

В чем дело?

yegor256
источник
2
SELinux применяется? Что ls -lZпоказывает? Попробуйте setenforce 0и посмотрите, работает ли это.
yaegashi
Действительно, setenforce 0помогло. Пожалуйста, отправьте это как ответ, я приму это
yegor256

Ответы:

19

Когда вы получаете permission deniedошибки при доступе к файлу и т. Д. По неизвестной причине, это может быть связано с SELinux. Особенно, когда вы видите период, следующий за разрешениями, такими как drwxr-xr-x.показано ls -lдля рассматриваемого файла / каталога, они могут быть неправильно помечены (вы можете видеть это по ls -Z) и вызвать проблему.

Сначала вы должны проверить текущий режим SELinux, запустив getenforce. Если это говорит Enforcing, то временно установите режим Permissive, запустив setenforce 0, и посмотрите, работает ли ваше приложение впоследствии.

Пожалуйста, обратитесь к руководству по вашему дистрибутиву SELinux для постоянного исправления, включая настройку режима SELinux при запуске, перемаркировку файлов или каталогов, политику обновления и т. Д. Вот Howto для CentOS .

yaegashi
источник
2

Изменение всего SElinux не всегда правильный ответ. Я не эксперт, но я бы сравнил его с отключением брандмауэра, если порт недоступен.

Другим быстрым решением может быть «восстановление контекста SE» файлов, особенно если они скопированы откуда-то.

См. 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:[...].
Накилон
0

Лучший способ, чем отключить selinux, - использовать команду

semanage permissive -a httpd_t

Это позволит пройти службу nginx без полного отключения selinux

Более подробная информация на https://www.nginx.com/blog/using-nginx-plus-with-selinux/

Тем не менее, для меня работает, command chcon -v --type=httpd_sys_content_t /etc/nginx/*и он работал правильно, без необходимости исключать httpd_t

Кибер Топор
источник