PHP не может читать сеансы из общего ресурса NFS

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

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

На том же сервере, где PHP имеет эту проблему, я могу создавать / писать / читать файлы в тех же каталогах, где сеансы сохраняются (протестированы с использованием root, non-root и специально для пользователей www-data).

Я использую PHP 5.5.12, Apache 2.4.9 и NFS v3 на Ubuntu 12.04 LTS

Мой php.ini

session.save_handler = files session.save_path = "2;/mnt/cache/sessions" session.use_cookies = 1 session.use_only_cookies = 0 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 2592000 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 2592000 session.bug_compat_42 = Off session.bug_compat_warn = Off session.referer_check = session.entropy_length = 0 session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 

Мой / etc / fstab

 nfs-srv.local:/export/cache /mnt/cache nfs rw,hard,intr 0 0 

Мой / etc / exports на nfs-srv.local

 /export/cache 10.1.10.0/24(rw,nohide,insecure,no_subtree_check,async,all_squash,anonuid=33,anongid=33) 

Файлы сеанса

 ls /mnt/cache/sessions/ -l drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 0 drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 1 drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 2 ... ls /mnt/cache/sessions/m -l drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 0 drwxrwxrwx 2 nobody nogroup 4096 May 16 12:18 1 drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 2 drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 3 drwxrwxrwx 2 nobody nogroup 4096 May 16 12:16 4 drwxrwxrwx 2 nobody nogroup 4096 May 16 12:14 5 ... ls /mnt/cache/sessions/m/5 -l -rw------- 1 nobody nogroup 0 May 16 12:14 sess_m5ifehvhkjdisp7dgtiuu601e2 

Related of "PHP не может читать сеансы из общего ресурса NFS"

Я думаю, что я нашел основную причину этой проблемы, с которой я столкнулся при обновлении с PHP 5.5.10 до 5.6.5.

В списке изменений PHP 5.5.12 приведено следующее исправление :

Когда session.save_path – это каталог, в который каждый может писать (например, на Debian), даже если невозможно найти идентификаторы существующих сеансов, локальный злоумышленник может просто создать новый файл сеанса со вредоносными данными сеанса, chmod it to 666 и получить доступ к любому webapp, размещенному в системе, с идентификатором сеанса, который он выбрал. Затем Webapp открывает файл сеанса и обрабатывает его так, как если бы он его создал. Мое исправление: fstat () сеанс, проверьте uid, который создал файл. Если это не результат getuid () или uid 0, игнорируйте существующий файл.

В двух словах они перестают записывать данные сеанса, если они обнаруживают, что вновь созданный файл сеанса не принадлежит учетной записи пользователя, работающей с Apache или root. Что довольно смешно, так как NFS реализует свою безопасность на разных уровнях, но обычно развертывается с удаленными сопоставлениями UID / GID и часто сжимается. Таким образом, пользователь Apache больше не владеет файлом с микросекунды, которую он создал. Это означает, что начиная с PHP 5.5.12 (или 5.4.28, который содержит одно и то же «исправление») становится невозможным хранить данные сеанса на большинстве NFS-серверов.

При использовании службы idmapd все сопоставления выполняются, сначала определяя имя пользователя / имя группы через /etc/nsswitch.conf . Если ваши машины NFS фактически не имеют имени пользователя / группы, idmapd не завершит сопоставление.

В этом случае кажется, что вам понадобится пользователь www-данных как на клиентском компьютере NFS, так и на сервере NFS. Если вы не хотите редактировать локальные файлы /etc/passwd /etc/group чтобы обеспечить, чтобы серверы имели запись для www-данных, вы можете настроить ldap или nis-системы для управления доменами пользователя / группы через /etc/nsswitch.conf .

Смотрите мой длинный ответ.