В настоящее время я работаю над тем, чтобы плагин MyPoker WordPress совместим с nginx. Этот плагин требует доступа к .conf
файлу в каталоге wp-content/uploads
, чтобы он мог добавлять необходимые правила. В настоящее время он обновляет файл .htaccess
в том же каталоге, и изменения вступают в силу немедленно без вмешательства. Поскольку nginx требует service nginx reload
для разрешения изменений конфигурации, я ищу способ сделать это в своем скрипте. Я не уверен, что даже exec()
будет работать для этого, так как service nginx reload
требуется для запуска с правами root или с использованием sudo. Я искал всюду на StackExchange, Google и везде, где я знаю, и я даже не могу найти начальное место.
Меры безопасности, было бы очень плохо, чтобы дать пользователю, который запускает доступ к веб-серверу sudo / root. Скорее, вы можете использовать файл семафора и выполнять задание cron от root, которое выполняется каждые 5 минут (или, если необходимо, более высокая частота), которая ищет наличие этого файла. Если он присутствует, он выдает команду service nginx reload
и удаляет файл.
В целом я думаю, что лучшим решением было бы, чтобы ваш плагин создал конкретные инструкции для пользователя, чтобы отредактировать любую конфигурацию Nginx вручную, а затем перезагрузить Nginx самостоятельно.
Я считаю, что, поскольку PHP дает возможность запускать команду, которая обычно требует sudo, необходимо открыть большое отверстие безопасности.
Кроме того, методы, которые пользователь должен был бы сделать, чтобы позволить PHP запускать команду service nginx reload
– это не то, что вы можете выполнить только на одном PHP, и может быть в равной степени, если не более, сложнее, чем обновлять их Конфигурация Nginx и перезагрузка. Пользователю необходимо выполнять дополнительную работу независимо от этого!
Если вы по-прежнему решите отказаться от этого курса действий, я предлагаю, чтобы пользователи плагина редактировали файл /etc/sudoers
сервера, который может разрешать пользовательским www-data
(или любому другому пользователю) выполнять эту конкретную команду с использованием sudo без требуя пароль. Это также означает, что у пользователя (возможно, www-data) НЕ было бы разрешения на запуск любой другой команды, которая, по крайней мере, более безопасна.
Используйте команду
sudo visudo
для редактирования файла/etc/sudoers
. Не редактируйте его напрямую.
Вот строка для добавления в этот файл для пользовательских www-data
:
www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service nginx reload
Ниже приведен пример, позволяющий пользователю (группе) запускать подобные команды с дополнительным объяснением. Подробнее о Sudoers и о том, как работает / etc / sudoers .
Наконец, обратите внимание, что пользовательские www-data
специфичны для установки Nginx в дистрибутивах Debian / Ubuntu Linux. Другие распространенные дистрибутивы (centos, redhat, fedora, arch и т. Д. И т. Д.) Могут не запускать Nginx / PHP-FPM в качестве пользовательских www-data
если только sysadmin не создает эти пользователи вручную.
Короткий ответ: Плохая идея. Не делай этого.
Длинный ответ: то, что вы пытаетесь сделать, не может сравниться с редактированием файла .htaccess
просто потому, что он работает не так. Файлы .htaccess
создаются для редактирования и перезагрузки «на лету» и могут быть созданы и доступны почти в каждом каталоге внутри вашего общего каталога.
Это не относится к конфигурациям Nginx. Файлы конфигурации создаются для загрузки при запуске Nginx или при необходимости вручную. Их расположение связано с конфигурацией, определенной администратором.
Даже если бы вы знали, где находится файл, было бы невозможно обновить его или написать в этом конкретном каталоге.
Более того, вам нужно выяснить, что пользователь может писать и читать, где находятся файлы конфигурации.
В конце концов, есть так много вещей, которые могут пойти не так. По моему скромному мнению, идея действительно плохая.
Большинство плагинов отображает конфигурацию Nginx, которая должна быть включена, чтобы администратор веб-сайта мог ее скопировать и вставить. Или они создают файл .conf
который администратор веб-сайта должен скопировать где-то перед перезапуском Nginx.
То, что вы пытаетесь достичь, выполнимо. Он может быть закодирован. Не поймите меня неправильно. НО ваш плагин станет обрабатывать каждую специфику каждой конфигурации Nginx там. Вы действительно этого не хотите.
Поскольку вы не знаете каждой конфигурации (и, честно говоря, вы не хотите знать), я бы посоветовал вам сосредоточиться на разработке отличного плагина и предоставлении правильной конфигурации Nginx через плагин. Последняя часть (где администратор веб-сайта копирует ее в нужное место и перезагружает конфигурацию) является его работой.
Другие ответы, которые я прочитал в этом вопросе, предполагают способы «попытаться» добиться того, что вы просите. Я думаю, что они создадут больше проблем, чем они помогут. Изменяя разрешения и управляя crons, оно может работать. Но вы также откроете дверь для уязвимостей безопасности, так как пользователь или пользователь сайта www-data
теперь будет считаться root
и может запускать те вещи, которые не должны запускаться. Я бы не советовал вам это делать.
Вы должны добавить правильные разрешения для учетной записи www-data, которая используется для выполнения команд на веб-серверах Linux. Вы видите, какая учетная запись выполняет скрипт с PHP, используя <?php echo exec("whoami"); ?>
<?php echo exec("whoami"); ?>