| 
 | 
 
1、环境说明 
AMH面板虚拟主机有两种运行模式,有安全模式与兼容模式。 
新建主机默认情况是安全模式,用户可以使用AMChroot模块进行切换。 
 
AMH安全模式是Chroot模拟Linux环境,运行虚拟主机、防跨站安全性很高。 
由于是模拟环境,兼容性不太好。 
虽然是安全模式兼容性不好,但一直没放弃安全模式,安全方面还是很重要,能增强就增强。 
所以一直再改善安全模式的兼容问题。 
 
 
2、环境影响 
其中数据库连接地址就为一很好的例子。 
php mysql_connect连接MySQL地址127.0.0.1与localhost是有区别的, 
PHP官方提示: 
只要将 server 指定为 "localhost" 或 "localhost:port",MySQL 客户端库会越过此值并尝试连接到本地套接字(Windows 中的名字管道)。如果想用 TCP/IP,应该用 "127.0.0.1" 代替 "localhost"。如果 MySQL 客户端库试图连接到一个错误的本地套接字,则应该在 PHP 配置中设定 的正确路径并把 server 留空。 
 
也就是说明localhost是使用套接字(socket)连接, 
AMH MySQL配置是: 
socket = /tmp/mysql.sock 
(mysql.sock位置于系统根/tmp目录) 
 
# file /tmp/mysql.sock 
/tmp/mysql.sock: socket 
 
所以如果AMH虚拟主机使用安全模式,MySQL连接地址只允许使用127.0.0.1,因为防跨站不能越过主机目录读取系统根/tmp目录,实际读到的是虚拟主机根目录/tmp。 
 
这也是AMH3.2或是以下版本虚拟主机安全模式只允许使用127.0.0.1的原因,需要使用localhost地址需要切换兼容模式。 
 
 
3、解决方案 
AMH4.0针对这一兼容问题做了改进, 
使用ln硬链接 /tmp/mysql.sock 到每个虚拟主机根目录/tmp,解决防跨站不能读取系统根/tmp/mysql.sock目录的问题。 
[ -w /tmp/mysql.sock ] && find /home/wwwroot/*/tmp -maxdepth 0 -exec ln -f /tmp/mysql.sock {} \; 
每次MySQL 重启系统做一次硬链接即可。 
因此解决了安全模式不能使用localhost地址问题,兼容了127.0.0.1、localhost。 
 
 
4、需要改进 
ln硬链接只允许同一分区内建立,不可跨分区建立(Inode位置不同)。 
这意味着如果用户手动挂载/home目录为一独立分区,ln硬链接将会失败。 
目前没用好的解决方法,用户可改进/etc/my.cnf配置把socket指定到/home目录,可以避免分区问题。 
但这样需要增加php配置,建立虚拟主机/home目录等,相对比较麻烦。 
 
 
 
5、默认MySQL连接地址总结 
安全模式 ------------- 
1) 无分区挂载/home 
localhost、127.0.0.1都支持。 
 
2) 有分区挂载/home 
127.0.0.1 支持。 
 
兼容模式 ------------- 
localhost、127.0.0.1都支持。 
 
 
--------------------- 
 
http://amysql.com/bbs/post-667-1-1.htm 
 |   
 
 
 
 |