我刚刚将一组网站移至一台全新的服务器,该服务器运行 Apache 2.2.3、PHP 5.3 和 Plesk 10.1.1。我在 PHP 会话中的文件权限方面遇到了问题,这些会话存储在 中/var/lib/php/session
。
我最初为该文件夹设置了如下权限:
drwxrwx--- 2 apache psacln 8192 Mar 22 23:25 session
这很有效,因为HTTP会话。文件被保存在该文件夹中,并且具有以下权限:
-rw------- 1 client1 psacln 0 Mar 22 23:24 sess_507...
-rw------- 1 client2 psacln 0 Mar 22 23:25 sess_8o1...
但问题是,通过 HTTPS 访问的 PHP 脚本似乎不是由同一个用户运行的client1
。client2
我删除了会话目录中的文件,并通过 HTTPS 访问了登录页面,以查看通过此协议启动时会话是如何保存的:
-rw------- 1 apache apache 0 Mar 22 23:25 sess_507...
因此,无论出于何种原因,使用 HTTPS 浏览的客户端发起的会话都由 保存apache:apache
,而来自 HTTP 客户端的会话则由 保存someclient:psacln
。
我想要问的是:
- 如何避免此会话权限问题?当通过未加密的 HTTP 创建会话并且客户端访问站点的 HTTPS 部分时,会显示权限错误,因为
apache:apache
尝试访问 创建的会话保存someclient:psacln
。反之亦然。- 我可以通过 Plesk 或命令行更改运行 Apache HTTPS 服务器的用户吗?
- 如果没有,我可以让 PHP 会话保存
rw-rw----
权限,然后添加apache
到psacln
组中吗? - 关于如何解决此问题还有其他建议吗?
答案1
更改您的/etc/php.ini
文件:
session.save_path = "0;0660;/var/lib/php/session"
PHP 5.3.5 可能会保存您的会话文件,如果-rw-r--
确实如此,那么您需要编辑您的应用程序,仅使用代码start_session()
:
usermod(0);
start_session();
然后它将以-rw-rw--
权限保存会话文件。
您还需要将您的 apache 组更改为 psacln(您的服务器可能以 apache:apache 的身份运行,因为 apache 的某些更新已覆盖配置文件)。
编辑您的httpd.conf
更改自:
user = apache
group = apache
到:
user = apache
group = psacln
现在,如果您从 mod_php 更改为 FastCGI 并返回,则不会与您的会话权限发生冲突。
更改后不要忘记重新启动 Apache 服务器/etc/init.d/httpd restart
如果你使用的是 Debian 发行版,你的守护进程命令将是/etc/init.d/apache restart
,而你的配置文件将位于同义文件夹中,如/etc/php/apache/php.ini
和/etc/apache/httpd.conf
或/etc/apache/apache.conf