nginx не может открывать (и, таким образом, обслуживать) файлы, несмотря на соответствующие разрешения файловой системы [дубликат]

На этот вопрос уже есть ответ:

После новой установки nginx 1.4.7 в Fedora 20 Я добавил два дополнительных местоположения к местоположению по умолчанию:

user  neradis; # I also tried the 'root' user here and commenting this directive out, to no avail
worker_processes  1;

[...]
http {

include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;

[...]

index   index.html index.htm;

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html;
autoindex    on;

    location /music/ {
        root    /home/neradis/audio;
    autoindex    on;     
}

location /nginx_test/ {
        root /;  
    autoindex on;
}


    error_page  404              /404.html;
    location = /40x.html {
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    }
}
}

nginx без проблем обслуживает файлы из местоположения по умолчанию / usr / share / nginx / html , но выдает ошибки, запрещающие разрешения для операций файловой системы ( open () , opendir () ) для добавленных местоположений. Я знаю, что каждый родительский каталог должен быть «исполняемым файлом» для пользователя, используемого nginx, поэтому я убедился, что, используя namei -l :

f: /nginx_test/file.txt
drwxr-xr-x root    root    /
drwxrwxrwx neradis neradis nginx_test
-rwxrwxrwx neradis neradis file.txt

, тем не менее, я все равно получаю ответ 403 на wget localhost / nginx_test / file.txt , обнаружив эту ошибку в журналах:

[error] 6950#0: *1 open() "/nginx_test/file.txt" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /nginx_test/file.txt HTTP/1.1", host: "localhost"

Я получаю те же ошибки для / home / neradis / audio / music . Я озадачен, в чем принципиальное отличие рабочего функционирующего корневого каталога по умолчанию / usr / share / nginx / html :

f: /usr/share/nginx/html/index.html
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxr-xr-x root root html
-rw-r-xr-x root root index.html

Есть идеи, что еще может помешать nginx получить доступ к файлам?

edit (решение ): Комментарии направили меня в правильном направлении.С разрешениями файлов у нас все в порядке, но SELinux запретил чтение файлов в новых местах, поскольку у них были (SELinux) типы default_t и user_home_t , которые нам запрещены для httpd_t . Я написал свой собственный модуль selinux для разрешения файлов default_t и разрешил доступ к домашним файлам с помощью setsebool -P http_read_user_content .

0
задан 14 September 2014 в 22:53
2 ответа

По умолчанию nginx использует / должен быть пользователем www-data, а не root. Вы также можете создать другого пользователя и добавить его в www-data.

При добавлении других местоположений я предлагаю вам:

  • создать несколько других виртуальных хостов и не использовать виртуальный хост по умолчанию.
  • поместите свой данные в каталогах, доступных для чтения / записи с помощью www-data, например / var / www.
0
ответ дан 5 December 2019 в 13:21

Находятся ли файлы для / music / в каталоге / home / neradis / audio / music ? Если нет, то вам следует использовать псевдоним:

location /music {
    alias /home/neradis/audio;
}

Это одна из наиболее распространенных ошибок в конфигурации nginx, то есть директива root используется внутри местоположений, когда псевдоним является

nginx добавляет совпадающий URI местоположения после корневого каталога, указанного внутри местоположения, а с псевдонимом URI удаляется.

0
ответ дан 5 December 2019 в 13:21

Теги

Похожие вопросы