首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS ElastiCache Redis不能从Laravel nad从redis-cli连接

AWS ElastiCache Redis不能从Laravel nad从redis-cli连接
EN

Stack Overflow用户
提问于 2017-12-07 13:16:38
回答 3查看 14.4K关注 0票数 8

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

Laravel

我尝试在database.php中使用predis的配置,如

代码语言:javascript
运行
复制
    '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实例。

代码语言:javascript
运行
复制
~$ telnet host 6379
Trying 172.31.23.113...
Connected to host.
Escape character is '^]'.

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-19 18:51:04

相关:通过SSL的Laravel + Redis Cache?

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

相关详细信息如下:

由于您有集群和TLS,所以您需要一个完全不同的配置:

代码语言:javascript
运行
复制
'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驱动程序(predis)。
  • 'cluster' => 'redis':这告诉Predis假设服务器端集群。这就意味着“跟随重定向”(例如-MOVED响应)。在使用群集运行时,节点将使用-MOVED响应必须请求特定密钥的节点。
    • 如果没有在Redis集群中启用此功能,Laravel将抛出一个-MOVED异常1/n次,n是Redis集群中的节点数(它会很幸运,每隔一段时间就会询问正确的节点)

  • 'clusters' => [...]:指定一个节点列表,但是只设置一个“默认”并将其指向AWS‘配置端点’将允许它动态地查找任何/所有其他节点(因为您不知道节点是什么时候来的,所以不知道节点是什么时候出现的,所以推荐使用Elasticache )。
  • 'options':对于Laravel,可以在顶层、集群级和节点选项中指定.(在被传送到Predis之前,它们在照明中结合在一起)
  • 'parameters':这些“覆盖”Predis用于新连接的默认连接设置/假设。由于我们显式地将它们设置为“默认”连接,所以不使用这些连接。但是对于集群设置来说,它们是至关重要的。一个“主”节点可能会返回一个重定向(-MOVED),除非为passwordscheme设置了参数,否则它将假定默认值,并且到新节点的新连接将失败。
票数 7
EN

Stack Overflow用户

发布于 2018-02-19 10:08:56

我知道这很旧,但我自己也有同样的问题。如果有人遇到此问题,请查看解决方案这里这里

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

编辑:

做了更多的调查发现,使用stunnel,您可以将redis-cli与ssl的连接包装起来。这里是进行此操作的指南。

票数 10
EN

Stack Overflow用户

发布于 2020-02-06 07:31:33

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

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

代码语言:javascript
运行
复制
'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,
        ],
    ],

你可以在里面加上“计划”。

我使用的是Laravel5.8,然后在Laravel内部一切都很好。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47696004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档