Перезапустите Nginx через скрипт PHP

В настоящее время я работаю над тем, чтобы плагин 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"); ?>