我将我的PHP会话文件存储在NFS共享上。问题是,PHP总是创建一个空的会话文件,但不能从中读取/写入,因此对于每个页面重新加载,都会创建一个新文件。
如果我将会话存储路径移动到本地文件夹,会话将正常保存。此外,我正在运行另一个具有相同配置的环境,它运行正常。
在PHP遇到此问题的同一台服务器上,我能够在保存会话的相同目录中创建/写入/读取文件(使用root,非root用户,特别是www-data用户进行测试)。 / p>
我在Ubuntu 12.04 LTS上使用PHP 5.5.12,Apache 2.4.9和NFS v3
我的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
答案 0 :(得分:5)
我想我找到了这个问题的根本原因,我在从PHP 5.5.10升级到5.6.5时遇到了这个问题。
PHP 5.5.12更改日志列出了following bugfix:
当session.save_path是每个人都可以写入的目录时 (就像在Debian上一样),即使它无法找到ID 现有会话,本地攻击者可以只创建一个新的会话文件 使用恶意会话数据,chmod到666并访问任何webapp 在他选择的会话ID的系统上托管。然后是webapp 打开会话文件并将其视为已创建它。我的修复: fstat()会话,检查创建该文件的uid。如果是的话 getuid()和uid 0的结果都不会忽略现有文件。
简而言之,如果他们发现新创建的会话文件不是运行Apache或root用户帐户所拥有,他们就会停止编写会话数据。这是相当荒谬的,因为NFS在不同级别实现其安全性,但通常使用远程 UID / GID映射进行部署,并且不会被压缩。因此,Apache用户不再从它创建的微秒中拥有该文件。这意味着,从PHP 5.5.12开始(或包含相同'修复'的5.4.28),在大多数股票NFS服务器上存储会话数据变得不可能。
答案 1 :(得分:0)
使用idmapd服务时,首先通过/etc/nsswitch.conf
查找用户名/组名来执行所有映射。如果您的NFS计算机实际上没有可访问的用户名/组名,则idmapd将无法完成映射。
在这种情况下,您似乎需要NFS客户端计算机和NFS服务器上的www-data用户。如果您不想编辑本地/etc/passwd /etc/group
文件以确保服务器具有www-data条目,则可以配置ldap或nis系统以通过/etc/nsswitch.conf
管理用户/组域。
请参阅我冗长的回答here。