Невозможно создать текстовый файл или добавить его в NGINX без CHMOD 777 - PullRequest
0 голосов
/ 13 апреля 2019

Использование экземпляра Lightsail NGINX и получение одной строки в файле PHP, которая не будет делать то, что мне нужно

$s = 'Hello world';
$myfile = file_put_contents('log.txt', $s.PHP_EOL , FILE_APPEND | LOCK_EX);

Я хочу, чтобы он создал файл log.txt, если его там нет.Если оно есть, я хочу добавить его.Он также не работает.

Если я создаю файл, он не работает.Только если я изменю файл на 777 через SSH, он будет работать.

Однако будущая часть работы будет заключаться в том, чтобы сделать файл таким, что по причинам, не связанным с безопасностью 777, этот ручной подход не будет осуществим.

Я понимаю, что это связано с настройками безопасности, но на самом деле не уверен, что нужно сделать, чтобы сделать его настолько безопасным, насколько я могу, и при этом предоставить PHP доступ для создания / добавления в текстовый файл

Этопоявляется у меня пользователь с именем www-data.Я пытался:

sudo chown -R www-data:www-data html
sudo chmod -R g+s html

Все еще не могу создать файл.

Если я добавляю сообщение об ошибке, я получаю:

file_put_contents(log.txt): failed to open stream: Permission denied

Спасибо

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

Мне действительно интересно, как люди советуют делать chmod или chown, при этом не хватает подробностей настройки сервера OP.

Исходя из всего, что упомянуто до сих пор, я могу предположить , что у OP все работает так:

  • NGINX работает как www-data.
  • PHP-FPM работает под другим именем пользователя (таким образом, проблема с разрешениями). Допустим, имя пользователя пула PHP-FPM - foo.

Давайте наметим лучшие практики для такого рода установки. После этого вы будете в порядке, без проблем с разрешениями, в кратчайшие сроки.

Кто должен владеть файлами

Обычно (многосайтовый сервер или нет) вам нужен один конкретный пользователь, которому принадлежат файлы сайта. Этот пользователь должен никогда быть www-data. Это должен быть отдельный пользователь, которого вы создали для этой цели: foo.

Как правило, этот же пользователь foo будет тем, кто настроен для запуска пула PHP-FPM.

Итак, установите правильное владение для пользователя foo:

chown -R foo:foo /path/to/your/site/html

Поскольку сценарии PHP-FPM работают как foo, теперь, когда каталог и все файлы внутри него принадлежат тому же foo, PHP-FPM может выполнять свою работу там без каких-либо проблем. Таким образом, у вас никогда не будет даже возможности, что PHP не сможет создать / получить доступ к вещам.

Предоставить доступ к веб-серверу

Помните, что в настройке участвуют два пользователя: один - веб-сервер (www-data), а другой - PHP-FPM (foo).

Теперь, когда файлы должным образом принадлежат foo, нам нужно предоставить права на чтение их www-data. Почему только читать? Потому что NGINX не имеет ничего общего с записью в файловую систему в этой настройке. Нужно только читать файлы и просматривать каталоги.

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

Допустим, есть файл сайта data.txt, который теперь принадлежит foo:foo - владение в Linux является двойным: файл принадлежит foo пользователю и foo группе.

В настоящее время в группе foo есть только один участник: foo пользователь.

Нам нужно добавить еще одного члена в группу foo: пользователя www-data.

Таким образом:

usermod -a -G foo www-data

После этого в группу foo входят следующие члены: foo пользователь, www-data пользователь.

И теперь мы можем перейти к разрешениям:)

Какие разрешения должны быть

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

  • каталоги должны разрешать обход (+x) для группы
  • файлы должны разрешать чтение (+r) для группы

Эти разрешения необходимы для www-data, чтобы иметь возможность читать каждый файл и каталог веб-сайта.

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

Но если вам нужно починить вещи, вы можете сделать:

chmod -R g+rX /path/to/your/site/html

Прописные буквы X гарантируют, что +x установлен только для каталогов.

Идти в безопасности

После настройки правильного владельца файла и группы для этого вида настройки вы можете пойти дальше и установить более строгие ограничения chmod.

Например, Magento secure chmod следует соглашениям этой установки, так что вы можете быть в порядке с chmod разрешениями 0400 для файлов PHP и 0640 для медиафайлов:)

Последний бит chmod должен всегда быть 0, если вы не имеете дело с действительно странным вариантом использования.

0 голосов
/ 14 апреля 2019

Попробуйте сменить владельца на пользователя nginx.

chown nginx: log.txt

0 голосов
/ 13 апреля 2019

Я думаю, что лучший способ достичь своей цели - это команда chown. Это меняет владельца файла.

Попробуйте запустить

chown username yourfile

Вы также можете использовать это для папки

chown -R username yourfolder

В вашем случае вам, вероятно, понадобится сменить владельца файла log.txt

...