Como criar corretamente um cron job para um site?

0

Como eu crio um cron job seguro e seguro para executar scripts PHP do meu site?

Estou criando um script de instalação do PHP para o Ubuntu 16.04.3 LTS Server. O script copia os arquivos do meu pacote de instalação para /var/www/mysite e define as permissões de leitura / gravação apropriadas para a conta de usuário padrão do Apache, que é 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

Agora, como a etapa final do meu script de instalação, eu preciso instalar trabalhos agendados que chamam comandos PHP no meu site, por exemplo, como este:

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

Eu fiz algumas pesquisas e encontrei várias opções e possíveis complicações, por isso não sei qual seria a maneira mais correta e sem erros de criar uma tarefa cron na minha situação.

Pensamentos e perguntas específicas:

  • parece que o melhor local para instalar trabalhos agendados que não pertençam a um usuário específico, mas para serviços executados em segundo plano, seria /etc/cron.d , certo? Também parece uma escolha segura para o processo de instalação automatizado, porque não terei que alterar nenhum arquivo de configuração do cron existente do meu script de instalação, mas apenas adicionar um novo arquivo, se ele ainda não existir.

  • Eu não quero executar meus trabalhos como root; Isso pode não ser uma boa ideia para sites, certo? Então, vou precisar de um usuário dedicado. No começo eu pensei - ei, eu já tenho www-data usuário criado para o servidor Apache e com todas as permissões necessárias para o meu site, então eu poderia usar isso, certo? Mas eu li que www-data user na verdade não tem permissões para executar comandos shell! Então, eu teria que alterar as permissões de www-data (o que parece não ser uma boa ideia) ou eu deveria criar uma nova conta de usuário especificamente para minhas tarefas agendadas, como mysite-jobs . Mas como posso verificar com segurança a existência desse usuário e, se ele não existir, crie o usuário a partir do meu script de instalação? E como especifico suas permissões para que o cron possa executar php /some/command como este usuário, mas o próprio usuário não possui /home nem senha e não consegue logar normalmente?

  • também, eu li que variáveis de ambiente não estão automaticamente disponíveis para trabalhos em cron.d , então eu tenho que especificá-las no meu arquivo cron. Tecnicamente, pode parecer assim, né?

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

Meu palpite é que isso também pode corrigir automaticamente o problema de lançar comandos PHP no ponto anterior, mas não tenho certeza se não estou dando muitas permissões aqui - não quero que o usuário execute qualquer Comando shell ou qualquer comando desses diretórios bin e sbin, mas php /some/command apenas. E isso também me faz pensar - se eu tiver que especificar variáveis SHELL e PATH para o cron usar somente para este trabalho, então talvez seja seguro usar www-data afinal - essas variáveis de ambiente não vão vazar do cron job, certo? Mas não tenho certeza se eles serão eficazes para www-data , considerando que é uma conta "especial".

  • depois que eu criar um cron job em /etc/cron.d , ele será escolhido pelo cron imediatamente ou eu preciso de alguma forma notificar o cron sobre novo (ou possivelmente atualizado quando eu atualizar sites)?

Então, considerando todos os itens acima, como deve ser a aparência final do cron job e como eu especifico uma conta de usuário com permissões mínimas para executar meus comandos php?

    
por JustAMartin 19.11.2017 / 13:31

1 resposta

2

Não há necessidade de pensar demais. Como você está usando o Ubuntu, o crontab usa o ID sob o qual executar o cron job ( www-data ). No meu servidor (que executa um fórum do MyBB), adicionei isso ao /etc/crontab :

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

Não precisa se preocupar com PATH do conteúdo se você der um caminho completo para o executável PHP.

    
por 19.11.2017 / 15:45