Apache + php -fpm :Правильные разрешения для каждого -пула, для -пользовательских проектов?

caffeinate ожидает выполнения команды в новом процессе.

Чтобы интерпретировать функцию zsh, вам нужна команда zsh.

И вам нужно будет передать ей определение этой функции (, а также других функций, которые могут понадобиться ), например, с помощью:

mysleep() {
  sleep 2
}
caffeinate zsh -c "$(functions mysleep);mysleep"

functions mysleepсбрасывает определение функции mysleep, которую мы передаем этой новой функции zshдля интерпретации перед вызовом функции, так что zsh, вызванная caffeinate, заканчивается интерпретацией:

mysleep() {
  sleep 2
};mysleep

Если сравнить с bash:

mysleep() {
  sleep 2
}
export -f mysleep
caffeinate bash -c "mysleep"

(, что на 2 символа короче, чем ), bashподойдет:

execve("/path/to/caffeinate",
  ["caffeinate", "bash", "-c", "mysleep"],
  ["BASH_FUNC_mysleep%%=() {  sleep 2\n}", rest-of-environment])

В то время как с zshмы получаем:

execve("/path/to/caffeinate",
  ["caffeinate", "zsh", "-c", "mysleep () {\n\tsleep 2\n};mysleep"],
  [rest-of-environment])

Я вижу несколько преимуществ последнего подхода:

  • у нас есть полный контроль :мы знаем, как мы передаем определение функции, как она используется. Здесь меньше возможностей для неприятных вещей вроде контузии.
  • поскольку имя переменной среды bash, которая содержит определение функции, содержит %символов (, и даже если это не так, подумайте о sudo, например ), мы не гарантируем, что caffeinateраспространит его на выполняемую команду bash.
  • если она распространяется, поскольку определение функции хранится в envp[] вместо argv[], это означает, что она загрязняет среду каждой другой команды, выполняемой в этой среде (, включая sleep, например, в этом примере ).
  • (minor )несмотря на то, что шелл-код bashкороче, в execve()передается больше данных, что вносит больший вклад в ограничение E2BIG для этого системного вызова.

Если вы хотите использовать среду, вы все равно можете:

FUNCS=$(functions mysleep) caffeinate zsh -c '
  eval "$FUNCS";mysleep'

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

mysleep | caffeinate cat

catбудет работать до тех пор, пока работает mysleep.mysleepпо-прежнему будет выполняться в отдельном процессе, и это влияет на стандартный вывод mysleep.

mysleep 3> {fd}>(caffeinate cat)

решит обе проблемы.

Как и выше, это создает канал между mysleepи cat. Но конец канала для записи теперь находится на вновь выделенном файловом дескрипторе выше 10 (, хранящемся в $fd), в который mysleepобычно не записывается. Таким образом, catничего не будет читать, но дождется конца -файла -в канале, что произойдет только тогда, когдаmysleep(и все дочерние процессы, наследующие этот fd ), завершатся.

0
03.09.2020, 03:03
1 ответ

Недавно я настраивал аналогичную конфигурацию и просто разрешил Apache читать глобально из соображений производительности. Я использую модуль mpm _event _.

Вы должны принять во внимание, что Apache и PHP -FPM — это два отдельных процесса. Эти два имеют отдельные настройки и среды и не влияют друг на друга с точки зрения того, что PHP -FPM заботится о разрешениях Apache.

Apache должен читать статические файлы или иметь права на запись, когда вы загружаете файлы с помощью форм по старинке. Если вы загружаете файлы с помощью PHP-кода, срабатывает PHP -FPM. PHP -FPM обрабатывает только код PHP.

listen.owner = site1
listen.group = www-data
listen.mode = 0660

Используется для процесса Apache, поэтому он может передавать (запись ).php файлов в PHP -Unix-сокет FPM.

user = site1
group = site1

В пуле находится реальный пользователь/группа, под которой запускается PHP-код. Пользователь site1не обязательно должен быть в группе www-data.

Решением вашей проблемы является apache -mpm -itk.

Если вы оставите Apache для глобального чтения, вы можете использовать любой MPM (Многофункциональный -Модуль обработки ). apache -mpm -itk не совместим с многопоточными MPM. Единственный вариант — модуль mpm _prefork _. Несмотря на свое название apache -mpm -itk технически не является MPM. Это модифицированный префорк.

Не забудьте установить директиву open _basedir для каждого пула в PHP -FPM.

Я рекомендую Debian 10 (buster )в 2020 году.

1
18.03.2021, 23:07

Теги

Похожие вопросы