На этот вопрос уже есть ответ:
После новой установки 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
.
По умолчанию nginx использует / должен быть пользователем www-data, а не root. Вы также можете создать другого пользователя и добавить его в www-data.
При добавлении других местоположений я предлагаю вам:
Находятся ли файлы для / music /
в каталоге / home / neradis / audio / music
? Если нет, то вам следует использовать псевдоним:
location /music {
alias /home/neradis/audio;
}
Это одна из наиболее распространенных ошибок в конфигурации nginx, то есть директива root
используется внутри местоположений, когда псевдоним
является
nginx добавляет совпадающий URI местоположения после корневого
каталога, указанного внутри местоположения, а с псевдонимом
URI удаляется.