如何为Amazon Beanstalk上的Laravel Queue Worker配置环境变量
问题根源
你配置了EnvironmentFile后仍然读取失败,核心原因是Amazon Elastic Beanstalk默认生成的/opt/elasticbeanstalk/deployment/env文件权限为600,属主为root,运行Laravel队列worker的webapp用户没有读取权限。你手动在终端执行队列命令时使用的是具备sudo/root权限的账号,可以正常读取env变量,而systemd启动worker时使用普通的web运行用户,自然读不到变量。
至于你观察到的「先发非队列邮件后队列临时正常」的现象,是因为非队列邮件运行在Web服务/FPM进程中,该进程默认有权限读取env变量,会把Mailgun等配置加载到Laravel的配置缓存中,队列进程在缓存有效期内可以复用配置,缓存过期后就会再次失败。
解决步骤
- 第一步:在项目的
.ebextensions目录下新增部署钩子,每次部署完成后自动调整env文件的权限,保证webapp用户可以读取:
# .ebextensions/99_fix_env_perms.config files: "/opt/elasticbeanstalk/hooks/appdeploy/post/99_adjust_env_perms.sh": mode: "000755" owner: root group: root content: | #!/bin/bash chmod 640 /opt/elasticbeanstalk/deployment/env chown root:webapp /opt/elasticbeanstalk/deployment/env
- 第二步:确认你的
laravel_worker.service配置中已经正确指定运行用户和用户组,和Web运行用户保持一致,示例配置如下:
[Unit] Description=Laravel Queue Worker After=network.target [Service] User=webapp Group=webapp EnvironmentFile=/opt/elasticbeanstalk/deployment/env ExecStart=/usr/bin/php /var/www/html/artisan queue:work sqs --sleep=3 --tries=3 --timeout=90 Restart=always RestartSec=3 NoNewPrivileges=true [Install] WantedBy=multi-user.target
- 第三步:重载systemd配置并重启worker服务生效:
sudo systemctl daemon-reload sudo systemctl restart laravel_worker.service
- 第四步:验证环境变量加载是否正常,执行以下命令,如果输出中包含
MAILGUN_*、SQS_*相关的变量就说明配置生效:
systemctl show laravel_worker.service | grep Environment
内容的提问来源于stack exchange,提问作者codeX
相关产品推荐
相关产品推荐

