Nginx обслуживает статический файл и получил 403 запрещенных

Просто хочу помочь кому-нибудь. да, вы просто хотите обслуживать статический файл с помощью nginx, и вы все правильно поняли в nginx.conf:

location /static {
       autoindex on;
       #root /root/downloads/boxes/;
       alias /root/downloads/boxes/;
      }

Но, в конце концов, вы потерпели неудачу. Вы получили "403 запрещено" из браузера...

---------------------------------------- Ответ ниже: ------ ----------------------------------

Решение очень простое:


Способ 1: Запустите nginx как пользователь как владелец '/ root / downloads / boxes /'

В nginx.conf:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;

ДА, в первой строке " nouser noboy; " просто удалите " # " и измените " nobody " на свое собственное имя пользователя в Linux/OS X, т.е. измените на " root " для проверки. Перезапустите nginx.

Внимание, вам лучше не запускать nginx от имени root! Вот только для тестирования, это опасно для хакера.

Для получения дополнительной информации см. Nginx (двигатель X) - Какая боль в заднице! [13: В доступе отказано]


Способ 2: замените владельца / root / downloads / boxes / на "www-data" или "nobody"

В терминале:

ps aux | grep nginx

Получить имя пользователя для запуска nginx. Это должно быть "www-data" или "nobody", определяемое версией nginx. Затем нажмите "Терминал" (например, используйте "www-data"):

chown -R www-data:www-data /root/downloads/boxes/

------------------------------ Еще одна важная вещь: -------------- ----------------

Эти родительские каталоги "/", "/ root", "/ root / downloads" должны предоставлять полномочия exe cute(x) для www-data или nobody. т.е.

ls -al /root
chmod o+x /root
chmod o+x /root/downloads

Дополнительные сведения см. В разделе " Устранение ошибки"403 Forbidden" и Nginx 403, запрещенной для всех файлов".

13 ответов

Решение

Вы должны дать разрешения nginx для чтения файла. Это означает, что вы должны дать пользователю, который запускает процесс nginx, права на чтение файла.

Этот пользователь, который запускает процесс nginx, настраивается с помощью user директива в конфиге nginx, обычно находится где-то в верхней части nginx.conf:

user www-data

http://wiki.nginx.org/CoreModule

Второй аргумент, который вы даете user является группой, но если вы не укажете ее, она использует ту же самую, что и пользователь, поэтому в моем примере пользователь и группа оба www-data,

Теперь файлы, которые вы хотите использовать в nginx, должны иметь правильные права доступа. У Nginx должны быть права на чтение файлов. Вы можете дать группе www-data разрешения на чтение в файл, как это:

chown :www-data my-file.html

http://linux.die.net/man/1/chown

с chown Вы можете изменить пользователя и владельца группы файла. В этой команде я изменяю только группу, если вы также измените пользователя, вы должны указать имя пользователя ДО двоеточия, например chown www-data:www-data my-file.html, Но правильной установки прав доступа группы должно быть достаточно, чтобы nginx мог прочитать файл.

Поскольку Nginx обрабатывает статические файлы напрямую, ему необходим доступ к соответствующим каталогам. Нам нужно дать ему исполняемые разрешения для нашего домашнего каталога.

Самый безопасный способ сделать это - добавить пользователя Nginx в нашу собственную группу пользователей. Затем мы можем добавить исполняемое разрешение владельцам группы нашего домашнего каталога, предоставив Nginx достаточно доступа к файлам:

sudo usermod -a -G your_user nginx

chmod 710 / home /your_user

За принятый ответ

sudo chown -R :www-data static_folder

для изменения владельца группы всех файлов в этой папке

Я столкнулся с этой проблемой с проектом Django. Изменение прав пользователей и групп не помогло. Однако перенос всей статической папки из моего проекта в / var / www сделал.

Скопируйте статические файлы проекта в / var / www / static

      # cp -r /project/static /var/www/static

Укажите nginx в правильном каталоге

      # sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        location /static/ {
                root /var/www;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/run/gunicorn.sock;
        }

}

Протестируйте конфигурацию nginx и перезагрузите

      # sudo nginx -t
# sudo systemctl reload nginx

Для меня это был SElinux, мне пришлось запустить следующее: (RHEL/Centos на AWS)

sudo setsebool -P httpd_can_network_connect on 
chcon -Rt httpd_sys_content_t /var/www/

Покопавшись в очень полезных ответах, решил собрать все рецепты, связанные с разрешениями. В частности, самое простое решение с максимальной безопасностью (= минимальные разрешения).

  1. Предположим, мы развернули сайт как пользователь adminона владеет сайтом dir и всем внутри. Мы не хотим запускать nginx от имени этого пользователя (слишком много разрешений). Это нормально для тестирования, а не для прод.
  2. По умолчанию Nginx запускает рабочих как пользователь nginxто есть конфиг содержит строку user nginx
  3. По умолчанию пользователь nginx находится в группе с тем же именем: nginx,
  4. Мы хотим дать минимальные разрешения пользователю nginx без изменения владельца файла. Это кажется наиболее безопасным из наивных вариантов.
  5. Чтобы обслуживать статические файлы, минимальные необходимые разрешения в иерархии папок (см. Групповые разрешения) должны быть такими (используйте команду namei -l /home/admin/WebProject/site/static/hmenu.css):

    корень dr-xr-xr-x /
    drwxr-xr-x root root home
    drwxr-x --- admin nginx admin
    drwx - x --- admin nginx WebProject
    drwx - x --- admin сайт nginx
    drwx - x --- admin nginx static
    -rwxr ----- admin nginx hmenu.css

  6. Далее, как получить эту красивую картинку? Чтобы изменить групповое владение для dirs, мы сначала применяем sudo chown :nginx /home/admin/WebProject/site/static и затем повторите команду, убрав dirs справа налево.

  7. Чтобы изменить разрешения для dirs, мы применяем sudo chmod g+x /home/admin/WebProject/site/static и снова раздеваю реж.

  8. Измените группу для файлов в каталоге /static: sudo chown -R :nginx /home/admin/WebProject/site/static

  9. Наконец, измените разрешения для файлов в каталоге /static: sudo chmod g+r /home/admin/WebProject/site/static/*

(Конечно, можно создать отдельную группу и изменить имя пользователя, но это затеняет повествование неважными деталями.)

Установка пользователя root в nginx может быть очень опасной. Необходимость установки разрешений для всей файловой иерархии может быть громоздкой (представьте, что полный путь к папке находится в более чем 10 подпапках).

Что бы я сделал, это отразил папку, к которой вы хотите предоставить общий доступ, в /usr/share/nginx/any_folder_name с разрешениями для сконфигурированного пользователя nginx (обычно это www-data). Что вы можете сделать с bindfs.

В вашем случае я бы сделал:

sudo bindfs -u www-data -g www-data /root/downloads/boxes/ /usr/share/nginx/root_boxes

Он будет монтировать / root / downloads / boxes в /usr/share/nginx/root_boxes со всеми разрешениями для пользовательских www-данных. Теперь вы устанавливаете этот путь в конфигурации вашего блока местоположения

location /static {
   autoindex on;
   alias /usr/share/nginx/root_boxes/;
  }

Попробуйте принятый ответ @gitaarik, и если он все еще дает 403 Forbidden или 404 Not Found и ваше целевое местоположение / читать дальше.

У меня тоже возникла эта проблема, но ни одно из упомянутых выше изменений разрешений не решило мою проблему. Решилось добавлениемroot директиву, потому что я определял корневое местоположение (/) и случайно воспользовался alias директиву, когда я должен был использовать root директива.

Конфигурация принята, но дает 403 Forbidden, или 404 Not Found если автоиндексирование включено для /:

location / {
  alias /my/path/;
  index index.html;
}

Правильное определение:

location / {
  root /my/path/;
  index index.html;
}

Вы можете просто сделать то, что сделано:

ЦенОС/Федора

      sudo usermod -a -G your_user_name nginx

chmod 710 /home/your_user_name 

Убунту / Дебиан

      sudo usermod -a -G your_user_name www-data

sudo chown -R :www-data /path/to/your/static_folder

И в вашем файле nginx, который обслуживает ваш сайт, убедитесь, что ваше местоположение для staticвот так:

      location /static/ {
        root /path/to/your/static_folder;
    }

Тем, у кого заблокировали доступ по ssh , следуя ответу @sandes для Ubuntu. Вам нужно каким-то образом восстановить доступ в качестве пользователя с разрешениями и запустить эту команду

      sudo gpasswd -d www-data your_user

Это удалит пользователя www-data из группы и позволит вам снова войти в систему.

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

Я проверяю разрешение как пользователь nginx.

      su nginx -s /bin/bash

Я нашел, что мне нужно добавить группу для полного пути. Мой путь начинается с /root, поэтому мне нужно сделать следующее:

      chown -R :nginx /root

Я довольно долго бился головой об этой проблеме 403. Я использую CentOS от DigitalOcean.

Я думал, что исправить проблему, просто установив SELINUX=disabled в / etc / selinux / config, но я ошибался. Как-то у меня капелька облажалась.

У меня это работает! sudo chown nginx:nginx /var/www/mydir

Лучший вариант для этого — поместить статику в/var/www/static/

и изменить свой/etc/nginx/sites-available/projectnameк

       location /static/ {
        root /var/www;
    }

или

       location /static/ {
        alias /var/www/static;
    }
Другие вопросы по тегам