【问题标题】:AWS ElastiCache Redis can't connect from Laravel nad from redis-cliAWS ElastiCache Redis 无法从 Laravel 和 redis-cli 连接
【发布时间】:2018-05-21 14:47:08
【问题描述】:

我在从安装在 EC2 实例上的 Laravel 应用程序连接到 ElastiCache Redis 时遇到问题,甚至在使用 EC2 实例中的 redis-cli 时遇到问题。

Laravel

我尝试将 predis 与 database.php 中的配置一起使用

    'redis' => [
    'client' => 'predis',
    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
        'read_write_timeout' => -1,
        'timeout' => 0
    ],
],

得到'Error while reading line from the server. [tcp:server here]'

我尝试使用具有相同配置的 phpRedis 扩展只更改 'client' => 'phpredis' 并得到错误 read error on connection {"exception":"[object] (RedisException(code: 0): read error on connection at vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:69)

Redis cli

使用 redis cli redis-cli -h host_here -p 6379 -a password_here 我看到类似host:6379> 的提示,但输入任何命令都会引发错误Error: Connection reset by peer

ElastiCache Redis 配置

我的 EC2 和弹性缓存在同一个 VPC 中,使用 telnet 我可以连接到 redis 实例

~$ telnet host 6379
Trying 172.31.23.113...
Connected to host.
Escape character is '^]'.

感谢您的帮助!

【问题讨论】:

标签: laravel amazon-web-services amazon-ec2 redis


【解决方案1】:

我知道这已经很老了,但我自己也遇到了同样的问题。如果有人遇到此问题,请参阅解决方案 herehere

似乎当您在 AWS Elasticache 中启用 Encryption in-transit 时,它会阻止您使用 redis-cli,因为它不支持 TLS 连接。切换到另一个客户端应该可以工作。这个answer 有一个启用 TLS 的客户端列表。

编辑:

做了一些更多的挖掘,发现使用stunnel你可以用ssl包装你的redis-cli连接。 Here 是这样做的指南。

【讨论】:

    【解决方案2】:

    相关:Laravel + Redis Cache via SSL?

    我在这里回答过:https://stackoverflow.com/a/48876398/663058

    相关详情如下:

    既然你有集群 TLS,那么你将需要一个完全不同的配置:

    'redis' => [
            'client' => 'predis',
            'cluster' => env('REDIS_CLUSTER', false),
    
            // Note! for single redis nodes, the default is defined here.
            // keeping it here for clusters will actually prevent the cluster config
            // from being used, it'll assume single node only.
            //'default' => [
            //    ...
            //],
    
            // #pro-tip, you can use the Cluster config even for single instances!
            'clusters' => [
                'default' => [
                    [
                        'scheme'   => env('REDIS_SCHEME', 'tcp'),
                        'host'     => env('REDIS_HOST', 'localhost'),
                        'password' => env('REDIS_PASSWORD', null),
                        'port'     => env('REDIS_PORT', 6379),
                        'database' => env('REDIS_DATABASE', 0),
                    ],
                ],
                'options' => [ // Clustering specific options
                    'cluster' => 'redis', // This tells Redis Client lib to follow redirects (from cluster)
                ]
            ],
            'options' => [
                'parameters' => [ // Parameters provide defaults for the Connection Factory
                    'password' => env('REDIS_PASSWORD', null), // Redirects need PW for the other nodes
                    'scheme'   => env('REDIS_SCHEME', 'tcp'),  // Redirects also must match scheme
                ],
                'ssl'    => ['verify_peer' => false], // Since we dont have TLS cert to verify
            ]
        ]
    

    上面的解释:

    • 'client' => 'predis':这指定了要使用的 PHP 库 Redis 驱动程序 (predis)。
    • 'cluster' => 'redis':这告诉 Predis 假设服务器端集群。这只是意味着“跟随重定向”(例如-MOVED 响应)。当与集群一起运行时,节点将以-MOVED 响应您必须请求特定密钥的节点。
      • 如果您没有在 Redis 集群中启用此功能,Laravel 将抛出 -MOVED 异常 1/n 次,n 是 Redis 中的节点数集群(它会很幸运并每隔一段时间询问正确的节点)
    • 'clusters' => [...]:指定节点列表,但仅设置“默认”并将其指向 AWS 'Configuration endpoint' 将使其动态找到任何/所有其他节点(推荐用于 Elasticache,因为您不知道节点何时出现'或去')。
    • 'options':对于 Laravel,可以在顶层、集群级别和节点选项中指定。 (它们在被传递给 Predis 之前在 Illuminate 中组合)
    • 'parameters':这些“覆盖”了 Predis 用于新连接的默认连接设置/假设。由于我们为“默认”连接明确设置了它们,因此不使用它们。但对于集群设置,它们至关重要。 “主”节点可能会发回重定向 (-MOVED),除非为 passwordscheme 设置参数,否则它将采用默认值,并且与新节点的新连接将失败。

    【讨论】:

      【解决方案3】:

      如果您使用 predis 作为客户端。

      然后你可以在config/database.php中更改Redis连接

      'redis' => [
              'client' => 'predis',
              'default' => [
                  'scheme' => 'tls',
                  'host' => env('REDIS_HOST', '127.0.0.1'),
                  'password' => env('REDIS_PASSWORD', null),
                  'port' => env('REDIS_PORT', 6379),
                  'database' => 0,
              ],
          ],
      

      您可以在其中添加“方案”。

      我使用的是 Laravel 5.8,然后在 Laravel 中一切正常。

      但是是的,因为 Redis 不提供 TLS 连接,所以 redis-cli 仍然无法工作。

      【讨论】:

        猜你喜欢
        • 2020-11-01
        • 2017-06-08
        • 2018-12-04
        • 2020-06-26
        • 2021-03-19
        • 2019-02-02
        • 2019-09-19
        • 2021-06-12
        • 1970-01-01
        相关资源
        最近更新 更多