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
相关产品推荐
相关产品推荐

