Вопрос или проблема
Каждый раз, когда я обновляю PHP (через yum upgrade
) на моем сервере CentOS, владение папкой /var/lib/session
становится root:apache
с правами 600
. Я использую nginx в качестве веб-сервера. Это ломает мой сайт и мешает сохранению сессий.
Решение простое — выполнить chown nginx:nginx
для папки. Но мне приходится делать это вручную каждый раз, когда yum обновляет PHP.
Я полагаю, проблема возникла из-за того, что при первоначальной настройке я использовал apache. Где я могу изменить эту конфигурацию на nginx
, чтобы решить эту проблему? Я просмотрел php.ini
, но не нашел ничего подходящего. Директория сессий указана, но ничего о пользователе.
Лучший способ — использовать отдельную директорию сессий для каждого пользователя/пула.
В php-fpm.d/www.conf (уже изменено для смены пользователя), как объясняется в комментарии.
user = foo
; Установить путь к сессиям в директорию, принадлежащую пользователю процесса
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/foo/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/foo/wsdlcache
Таким образом, эти новые директории не будут изменяться при следующем обновлении.
Кстати, нет никакой необходимости менять пользователя, вы можете использовать nginx и оставить fpm работающим как apache (особенно, так как большинство упакованных веб-приложений полагаются на это)
Ответ или решение
Обновление версии PHP может затруднить администрирование системы, особенно когда речь идет о настройках прав доступа к папкам сессий. В рассматриваемом случае каждая установка обновления PHP через yum upgrade
на сервере CentOS приводит к тому, что папка /var/lib/session
, отвечающая за хранение сессий, изменяет свои права собственности на root:apache
с правами доступа 600
. Это препятствует правильному функционированию сайта, поскольку невозможно сохранить сессии. Владельцем веб-сервера является nginx, и для восстановления работы сайта необходимо вручную менять владельца папки сессий на nginx:nginx
.
Теория
Обновление PHP мешает работе сайта по причине изменения владельцем и группой файлов и папок PHP. По умолчанию, при установке или обновлении PHP, скрипты настраивают рабочие директории сессий с правами, соответствующими Apache, так как это частая конфигурация. Это поведение особенно характерно для систем, которые изначально настроены с использованием Apache и позже переведены на nginx.
Одна из причин такой проблемы заключается в том, что пакетные менеджеры настройки PHP (например, yum
) опираются на конфигурации, заданные по умолчанию, которые редко изменяются в процессе обновления. В результате, если изначально сервер настраивался с Apache, это может продолжать влиять на последующие обновления, даже после переключения на другой веб-сервер.
Пример
Допустим, у вас есть система, которая изначально была настроена с использованием Apache, и в процессе эксплуатации была изменена на nginx. Однако, при обновлениях PHP, конфигурация для директории сессий остаётся прежней, соответствующей Apache. Поскольку nginx работает под другим пользователем, необходимо каждый раз вручную изменять владельца и группу каталогов сессий для работоспособности сайта.
Применение
Чтобы решить эту проблему кардинально, есть несколько подходов, которые можно применять в зависимости от вашей специфики:
- Изменение конфигурации php-fpm: Один из наиболее эффективных методов — настроить отдельные директории сессий, которые принадлежат nginx, для каждого пула PHP-FPM (FastCGI Process Manager). Это позволит избежать изменения прав доступа при обновлениях.
В файле конфигурации /etc/php-fpm.d/www.conf
можно изменить настройки следующим образом:
user = nginx
group = nginx
; Установка пути хранения сессий
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/nginx/session
Это позволяет создать пути, которые не будут затронуты обновлениями, защищая процесс от изменения прав доступа.
- Скрипт автоматизации: Вы можете создать скрипт, который автоматически восстанавливает нужные права доступа после обновления PHP. Этот скрипт можно запускать автоматически после выполнения
yum upgrade
. Например:
#!/bin/bash
chown -R nginx:nginx /var/lib/php/session
chmod -R 700 /var/lib/php/session
- Альтернативные способы хранения сессий: В качестве альтернативного подхода можно рассмотреть использование базы данных для хранения сессий или использование Memcached или Redis, что исключит необходимость в изменении прав на файловой системе.
Заключение
Обновление PHP, затрагивающее права на директорию сессий, представляет собой частую проблему для серверов, где сменяются веб-серверы. Конфигурация отдельных директорий по пользователям, использование скриптов автоматизации, а также рассмотрение альтернатив методов хранения сессий могут значительно упростить управление сервером и отказаться от ручных правок после каждого обновления. Надлежащее управление правами и конфигурацией серверов существенно влияет на надежность и безопасность вашего веб-сервера и в целом системы.