好的,首先我很确定会有大量“附加信息”请求,所以请将它们发布在 OP 评论中,我会尽力根据要求提供额外的信息!
以下是概要,首先是服务器:
它是一个共享的临时服务器,Ubuntu 16.4 LTS,带有 Apache2.4、Php7.1、Mysql 5.7。它安装了 Webmin、VirtualMin 和 UserMin(最新)。它还全局安装了 phpMyAdmin。它配置为允许使用 mod_php(使用 www-data)、CGI、FCGI(默认)或 FPM+FCGI 为网站提供服务。CGI/FPM 变体使用 SuExec 来执行网站。Web 服务器本身运行良好。
因此,现在的任务是设置一个 Chroot jail 以允许现有域用户使用 SSH 或 SFTP,但只能看到已经填充了最新 Magento 2 安装的主目录。
在此示例中,我们将使用这些详细信息:
用户 = 域 组 = 域 主目录 = /home/domain/ Chroot = /var/chroot/
现在,我可以很好地设置 Chroot,我所做的是复制所需的相关 lib/var/usr 文件,允许执行命令 ls、bash、sh、rm、rmdir、mkdir、touch、vi 和 php。
虽然花了一些功夫但我让 PHP 命令几乎正确地运行了(在找到所有模块依赖关系之后)。
CHroot jail 没问题,我将 /home/domain 挂载到 /var/chroot/home/domain,这样就没问题了。用户实际上被关进了监狱,可以看到用户的主目录,因此可以毫无问题地访问所有网站文件。
就数据库而言,我省略了 mysql 命令,因为我们有全局可用的 phpmyadmin,因此他们只能使用专用域 mysql 用户登录到相关数据库。没问题。
真正的问题出现在 Magento 2 中。我们知道您使用命令行工具来执行诸如缓存刷新、索引构建和其他部署任务,以下是一些示例:
domain@server:/home/domain/public_html# php bin/magento cache:flush
domain@server:/home/domain/public_html# php bin/magento indexer:reindex
domain@server:/home/domain/public_html# php bin/magento setup:static-content:deploy en_US
我们可以看到,这些命令是通过 PHP CLI 解释器运行的,因此所有工作都需要让 PHP 在被监禁的 CLI 上正确运行。
起初我遇到了数据库问题cache:flush
,但通过对 CLI 的 php.ini 进行一些调整(我将 FCGI 从用户主目录复制到被监禁的位置)和一些“找到正确的 mysql.sock”,我修复了这个问题,没有任何问题(好吧,有些问题,但解决了!)
实际问题
我在使用 root 权限时遇到了问题,indexer:reindex
这没有问题,但是在 Chroot 中作为用户域,由于某种原因,该命令除了第一个索引之外,其他所有索引都会抛出错误。结果如下:
-bash-4.3$ cd /home/domain/public_html/
-bash-4.3$ php bin/magento indexer:reindex
Design Config Grid index has been rebuilt successfully in 00:00:00
Customer Grid indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Category Products indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Product Categories indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Product Price indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Rule Product indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Product Rule indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Search indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
好的,我说,这是某种会话创建失败,随后索引器无法读取创建失败的会话。解释了为什么第一个成功但后续失败。我尝试将 PHp 的默认会话目录挂载到 chroot jail 中,因此我挂载到/var/lib/php/
。/var/chroot/var/lib/php
此目录具有粘性位,因此我认为我应该挂载而不是创建。
还是不行。不过,如果我一次重新索引一个会怎么样呢:
-bash-4.3$ php bin/magento indexer:reindex customer_grid
Customer Grid indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_en89p7h50m9mc1a0pb8l3c3tv1, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
还是不行。我努力想看看它到底在挣扎什么,它从哪里得到这个所谓的会话 ID,它应该在哪里创建会话文件,以及我可以在哪里/哪些日志中查看信息!
有人能为我提供任何建议,让我继续前进并掌握 SH 对 Magento 2 网站用户的监禁吗?
答案1
尝试ls -l /home/domain/
一下ls -l /home/domain/tmp
,看起来您的目录具有错误的权限、错误的所有权,或者两者兼而有之。
PHP 尝试访问会话文件,但失败了。或者文件存在但domain
没有读取权限,或者文件不存在且domain
没有目录的写入权限。
答案2
当我设法解决这个问题时,我回答了我自己的问题。
有两点错误:
- 首先,为了避免在 chroot 中弄乱服务器其余部分的 php-cli 设置,我将 php.ini 复制到 jail 中。然后我适时将会话保存路径设置为没有粘性位的目录。
这就是为什么我可以以 root 身份在 /var/lib/php/sessions 中创建会话文件,但在 chroot jail 中却不能,因为它以错误的权限将其放在了错误的位置。
因此,更新了正确的 php.ini 并检查了权限,快乐的日子我们得到了一个会话!indexer:reindex
正在享受乐趣!
- 那么,说到重头戏
setup:static-content:deploy
,我只能说“你知道当脚本抛出这么多错误时,你无法在 CLI 中找到它的顶部吗?”,是的。呃 :/
这是由于(最终发现)我的键盘技能不佳造成的。当我在 jail 中安装用户目录时,我输错了目录名称,因此路径 /home/domain/public_html 不是 jail 中的 /home/domain/public_html。快速重新安装后,一切又恢复正常。
现在问题解决了,感谢 ThoriumBR 提供的有用建议!吸取了教训,希望这个故事能对其他人有所帮助。