我已经使用 Nginx + PHP5-FPM 配置了一个 Ubuntu 网络服务器。我创建了一个 chrooted 环境(使用 jailkit),开发人员可以进入该环境,从那里他们可以开发测试应用程序。
Chroot 监狱:/home/jail
Nginx 和 PHP5-FPM 在 chroot 之外运行,但配置为与 chrooted 环境内的网站一起运行。
到目前为止,Nginx 和 PHP5-FPM 都可以毫无问题地提供文件,但以下情况除外:尝试连接到 MySQL 时,我们收到此错误:SQLSTATE[HY000] [2002] 无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地 MySQL 服务器
现在,我相信问题是由于非 chrooted php.ini 在 chroot 环境之外引用了 mysqld.sock(它实际上当前使用的是 MySQL 默认设置)。
我的问题是,如何配置 PHP 通过环回或类似方式访问 MySQL?(在谷歌搜索结果中发现这是一条建议,但没有任何说明)
或者如果我遗漏了其他一些明显的设置,请告诉我。如果有创建硬链接的选项(即使重新启动 mysql 也仍然可用),那也会很方便。
答案1
我自己解决了这个问题。Jailkit 无法创建对 mysqld.sock 的硬链接引用,因为 Ubuntu 将 /var/run 存储在 tmpfs 中,而系统认为这是一个单独的分区(这会破坏硬链接功能)。我现在在 jail 中挂载 /var/run/mysqld,如下所示:
mount --bind /var/run/mysqld /home/jail/var/run/mysqld/
答案2
如何使用作为host
值127.0.0.1
?它使用不写入套接字的 TCP 连接(与localhost
unix 上的值不同)。
答案3
重新安装--bind
chroot 看起来是个可行的建议。但是,在我看来,使用 TCP 套接字 (127.0.0.1) 连接到 MySQL 似乎更干净、更安全,出错的可能性也更小。
我之所以这么说,是因为包括http://blog.dispatched.ch/postfix-and-mysql-debian/和https://stackoverflow.com/questions/11389214/postfix-cant-connect-with-mysql-table-when-using-unix-socket-postmap-succeeds建议添加到 fstab:
/var/run/mysqld /home/jail/var/run/mysqld bind defaults,bind 0 0
对此要谨慎:Debian 至少会在重启时清除 /var/run,因此挂载将在启动时失败,您的服务也将失败。当然,您也可以使用:
/var/run /home/jail/var/run bind defaults,bind 0 0
答案4
您可以通过 my.cnf 文件中的套接字选项控制 MySQL 的套接字。
socket = /home/jail/var/run/mysqld/mysqld.sock