如何为网站正确地创建 cron 作业?

如何为网站正确地创建 cron 作业?

如何创建一个安全可靠的 cron 作业来运行我的网站的 PHP 脚本?

我正在为 Ubuntu 16.04.3 LTS 服务器创建一个 PHP 安装脚本。该脚本将文件从我的安装包复制到/var/www/mysite默认 Apache Web 用户帐户,并为其设置适当的读/写权限,即www-data

setfacl -R -m u:www-data:rX /var/www/mysite
setfacl -R -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache
setfacl -dR -m u:www-data:rwX /var/www/mysite/storage /var/www/mysite/bootstrap/cache

现在,作为安装脚本的最后一步,我必须安装在我的网站上调用 PHP 命令的 cron 作业,例如像这样:

php /var/www/mysite/artisan notifications:send

我做了一些研究,发现了多种选择和可能的复杂情况,所以我不确定在我的环境中创建 cron 作业最正确、最无错误的方法是什么。

具体想法和问题:

  • 看起来,安装不属于特定用户而是属于后台运行的服务的 cron 任务的最佳位置是/etc/cron.d,对吗?它似乎也是自动安装过程的安全选择,因为我不必从安装脚本中更改任何现有的 cron 配置文件,而只需添加一个新文件(如果它尚不存在)。

  • 我不想以 root 身份运行我的作业;这对于网站来说可能不是一个好主意,对吧?因此我需要一个专用用户。起初我想 - 嘿,我已经www-data为 Apache 服务器创建了用户,并且具有我的网站所需的所有权限,因此我可以使用它,对吧?但我读到该www-data用户实际上没有执行 shell 命令的权限!因此,我必须更改的权限www-data(这似乎不是一个好主意)或者我应该专门为我的 cron 作业创建一个新用户帐户,例如mysite-jobs。但如何安全地检查此用户是否存在,如果不存在,则从我的安装脚本创建用户?如何指定其权限,以便 cron 可以php /some/command以该用户身份运行,但用户本身没有/home密码并且无法正常登录?

  • 另外,我读到环境变量不会自动用于作业cron.d,所以我必须在 cron 文件中指定它们。从技术上讲,它可能看起来像这样,对吗?

    SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

我的猜测是,这也可能自动修复上一点中启动 PHP 命令的问题,但我不确定我是否在这里没有授予太多权限 - 我不希望用户执行任何 shell 命令或来自那些 bin 和 sbin 目录的任何命令php /some/command。这也让我感到疑惑 - 如果我必须为 cron 指定仅用于此作业的 SHELL 和 PATH 变量,那么也许它毕竟是安全的- 这些环境变量不会从 cron 作业中泄露出来,对吗?但考虑到它是一个“特殊”帐户,www-data我不确定它们是否有效。www-data

  • 在创建一个 cron 作业后/etc/cron.d,它会立即被 cron 获取吗?还是我必须以某种方式通知 cron 有关新的(或者在我更新网站时可能更新的)文件?

因此,考虑到以上所有因素,最终的 cron 作业应该是什么样子,以及如何指定具有最小权限的用户帐户来运行我的 php 命令?

答案1

无需过多考虑。由于您使用的是 Ubuntu,因此 crontab 会采用运行 cron 作业的 id ( www-data)。在我的服务器(运行 MyBB 论坛)上,我将其添加到/etc/crontab

# Run DB backups every morning at 06:00 UTC.
0  6 * * *   www-data /usr/bin/php /var/www/theforum/task.php 4

PATH如果您提供了 PHP 可执行文件的完整路径,则无需担心内容。

相关内容