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

EC2 Elastic Beanstalk环境运行php artisan queue:work数据库连接失败

问题:Laravel队列在Elastic Beanstalk中无法连接数据库(本地正常)

本地环境使用database作为QUEUE_CONNECTION时队列运行完全正常,但在Elastic Beanstalk环境执行php artisan queue:work时无法运行,报错数据库连接被拒绝。

错误日志(laravel.log最后几行)

[2022-11-30 12:49:38] development.ERROR: SQLSTATE[HY000] [2002] Connection refused {"exception":"[object] (PDOException(code: 2002): SQLSTATE[HY000] [2002] Connection refused at /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70)
[stacktrace]
#0 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(70): PDO->__construct('mysql:host=127....', 'forge', '', Array)
#1 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(100): Illuminate\Database\Connectors\Connector->createPdoConnection('mysql:host=127....', 'forge', '', Array)
#2 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(50): Illuminate\Database\Connectors\Connector->tryAgainIfCausedByLostConnection(Object(PDOException), 'mysql:host=127....', 'forge', '', Array)
#3 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\Database\Connectors\Connector->createConnection('mysql:host=127....', Array, Array)
#4 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(184): Illuminate\Database\Connectors\MySqlConnector->connect(Array)
#5 [internal function]: Illuminate\Database\Connectors\ConnectionFactory->Illuminate\Database\Connectors\{closure}()
#6 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1064): call_user_func(Object(Closure))
#7 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(175): Illuminate\Database\Connection->getPdo()
#8 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(141): Illuminate\Database\Connection->handleBeginTransactionException(Object(PDOException))
#9 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(115): Illuminate\Database\Connection->createTransaction()
#10 /var/app/current/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(23): Illuminate\Database\Connection->beginTransaction()
#11 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/DatabaseQueue.php(223): Illuminate\Database\Connection->transaction(Object(Closure))
#12 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(345): Illuminate\Queue\DatabaseQueue->pop('default')
#13 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(354): Illuminate\Queue\Worker->Illuminate\Queue\{closure}('default')
#14 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(322): Illuminate\Queue\Worker->getNextJob(Object(Illuminate\Queue\DatabaseQueue), 'default')
#15 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(117): Illuminate\Queue\Worker->runNextJob('database', 'default', Object(Illuminate\Queue\WorkerOptions))
#16 /var/app/current/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(101): Illuminate\Queue\Console\WorkCommand->runWorker('database', 'default')
#17 /var/app/current/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#18 /var/app/current/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#19 /var/app/current/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#20 /var/app/current/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure))
#21 /var/app/current/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL)
#22 /var/app/current/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call(Array)
#23 /var/app/current/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#24 /var/app/current/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
#25 /var/app/current/vendor/symfony/console/Application.php(1040): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#26 /var/app/current/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#27 /var/app/current/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#28 /var/app/current/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#29 /var/app/current/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#30 /var/app/current/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#31 {main}
"}

从日志可见,程序尝试连接localhost,但.env文件中配置的数据库主机并非localhost。

当前config/queue.php配置

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Queue Connection Name
    |--------------------------------------------------------------------------
    |
    | Laravel's queue API supports an assortment of back-ends via a single
    | API, giving you convenient access to each back-end using the same
    | syntax for every one. Here you may define a default connection.
    |
    */

    'default' => env('QUEUE_CONNECTION', 'sync'),

    /*
    |--------------------------------------------------------------------------
    | Queue Connections
    |--------------------------------------------------------------------------
    |
    | Here you may configure the connection information for each server that
    | is used by your application. A default configuration has been added
    | for each back-end shipped with Laravel. You are free to add more.
    |
    | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
    |
    */

    'connections' => [

        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'queue_jobs',
            'queue' => 'default',
            'retry_after' => 90,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host' => 'localhost',
            'queue' => 'default',
            'retry_after' => 90,
            'block_for' => 0,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue' => env('SQS_QUEUE', 'your-queue-name'),
            'suffix' => env('SQS_SUFFIX'),
            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Failed Queue Jobs
    |--------------------------------------------------------------------------
    |
    | These options configure the behavior of failed queue job logging so you
    | can control which database and table are used to store the jobs that
    | have failed. You may change them to any database / table you wish.
    |
    */

    'failed' => [
        'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
        'database' => env('DB_CONNECTION', 'mysql'),
        'table' => 'failed_jobs',
    ],

];

已做排查

  • 本地可连接远程数据库,队列运行正常
  • 确认Elastic Beanstalk环境中/opt/elasticbeanstalk/deployment/env路径下的.env内容正确

解决方案

1. 清理配置缓存

EB部署后可能生成了旧的配置缓存,导致队列进程读取过时的数据库配置。执行以下命令清除缓存:

php artisan config:clear
php artisan cache:clear

如果是通过EB的启动脚本运行队列,务必在启动命令前添加缓存清理步骤。

2. 显式指定队列的数据库连接

默认情况下database队列驱动会使用默认数据库连接,但如果默认连接未正确加载,可在config/queue.php中为database连接指定明确的数据库连接:
修改config/queue.php中的database配置段:

'database' => [
    'driver' => 'database',
    'table' => 'queue_jobs',
    'queue' => 'default',
    'retry_after' => 90,
    'connection' => env('DB_CONNECTION', 'mysql'), // 新增该行
],

确认.env中的DB_CONNECTION对应正确的数据库配置,且该配置的主机、用户名、密码无误。

3. 确保队列进程加载正确的环境变量

EB中直接执行php artisan queue:work时,可能无法自动加载/opt/elasticbeanstalk/deployment/env的环境变量。启动队列前先加载环境变量:

source /opt/elasticbeanstalk/deployment/env && php artisan queue:work

4. 验证网络连通性

在EB实例上测试能否连接到数据库:

telnet YOUR_DB_HOST 3306

若连接失败,检查安全组配置:EB实例的安全组需允许3306端口出站,数据库的安全组需允许EB实例的IP或安全组入站访问。


内容的提问来源于stack exchange,提问作者Mujtaba Mushtaq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:31:33