You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:06:07