Php 拉威尔+;通过SSL的Redis缓存?

Php 拉威尔+;通过SSL的Redis缓存?,php,laravel,predis,Php,Laravel,Predis,我正在尝试使用predis 1.1和SSL连接到Redis,使用信息,在示例中使用以下配置: // Named array of connection parameters: $client = new Predis\Client([ 'scheme' => 'tls', 'ssl' => ['cafile' => 'private.pem', 'verify_peer' => true], ]); 我的Laravel配置如下所示: 'redis' =&g

我正在尝试使用predis 1.1和SSL连接到Redis,使用信息,在示例中使用以下配置:

// Named array of connection parameters:
$client = new Predis\Client([
  'scheme' => 'tls',
  'ssl'    => ['cafile' => 'private.pem', 'verify_peer' => true],
]);
我的Laravel配置如下所示:

'redis' => [
        'client' => 'predis',
        'cluster' => env('REDIS_CLUSTER', false),

        'default' => [
            'host' => env('REDIS_HOST', 'localhost'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],

        'options' => [
            'cluster' => 'redis',
            'parameters' => ['password' => env('REDIS_PASSWORD', null)],
            'scheme' => 'tls',
            'ssl'    => ['verify_peer' => false],
        ],
    ],
因为我没有用于SSL的密钥,所以我禁用了对等验证(根据)

不幸的是,我遇到以下错误:

ConnectionException in AbstractConnection.php line 155:
Error while reading line from the server. [tcp://MY_REDIS_SERVER_URL:6380]

非常感谢您的建议:)

我能够让它工作

您需要将“方案”从
'options'
移动到
'default'

我的工作配置:

'redis' => [
    'client' => 'predis',
    'cluster' => env('REDIS_CLUSTER', false),

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

    'options' => [
        'parameters' => ['password' => env('REDIS_PASSWORD', null)],
        'ssl'    => ['verify_peer' => false],
    ],
],
注意:我还从
'options'
中删除了
'cluster'
选项,但我不怀疑这是这个问题的成败之所在

在最后的配置中,我将其更改为:
'scheme'=>env('REDIS_scheme','tcp'),
,然后在我的env文件中定义了
REDIS_scheme=tls

使用启用TLS的AWS ElastiCache进行测试

编辑: 上述配置仅适用于单节点redis。如果您碰巧启用了集群和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 Clusters中启用此功能,Laravel将抛出一个
      -MOVED
      异常1/n次,n是Redis cluster中的节点数(很幸运,每隔一段时间就会询问一次正确的节点)
  • 'clusters'=>[…]
    :指定节点列表,但只设置一个“默认值”并将其指向将使其动态查找任何/所有其他节点(建议用于Elasticache,因为您不知道节点何时进入或离开)
  • “选项”
    :对于Laravel,可以在顶级、群集级别和节点选项中指定。(在传送到Predis之前,它们被合并到照明中)
  • “参数”
    :这些“覆盖”Predis用于新连接的默认连接设置/假设。因为我们为“默认”连接显式地设置了它们,所以不使用它们。但是对于集群设置,它们是至关重要的。“主”节点可以发回重定向(
    -MOVED
    ),除非为
    密码
    方案
    设置了参数,否则它将采用默认值,并且与新节点的新连接将失败
    • 谢谢

      我可以确认第一个解决方案确实允许Laravel通过TLS连接到Redis服务器。在AWS ElastiCache和TLS上使用Redis 3.2.6进行测试,配置为单节点和单碎片

      我还可以确认第二个解决方案确实允许Laravel通过TLS连接到Redis群集。在带有TLS的AWS ElastiCache上使用Redis 3.2.6进行测试,配置为“启用群集模式”,1个碎片,每个碎片1个副本

      我第一次尝试实施群集解决方案时收到以下错误:

      Error: Unsupported operand types
      
      当我将“默认”设置移动到“集群”数组中时,我错过了额外的一组数组括号

      不正确

      'clusters' => [
        'default' => [
          'scheme' ...
        ]
      ]
      
      'clusters' => [
        'default' => [
          [
            'scheme' ...
          ]
        ]
      ]
      
      正确

      'clusters' => [
        'default' => [
          'scheme' ...
        ]
      ]
      
      'clusters' => [
        'default' => [
          [
            'scheme' ...
          ]
        ]
      ]
      

      我希望这能为其他人节省一点故障排除时间。

      请发布您的.env文件。错误是在您的.envMY_REDIS_SERVER_URL中显示MY_REDIS_SERVER_URL只是REDIS服务器的URL。我可以通过6379端口到达,但不能通过6380。两者都应该可以访问(这是Azure Redis缓存,默认情况下打开了6380)。您找到解决方案了吗?很遗憾,还没有,有任何建议吗?:)这里也是一样,我就是不能让它和Slexcellent breakdown一起工作!如果我错了,有人会纠正我,但是在查看了Laravel5.5源代码之后,顶级的
      'cluster'=>env('REDIS_cluster',false),
      什么都不做。要使用集群,您只需拥有顶级的
      集群
      数组,并像@CenterOrbit提到的那样,删除顶级的
      默认连接配置。如果Laravel找到一个带有连接名称的顶级键(
      默认值
      ),它将不会在
      集群
      配置中查找该连接。此外,@CenterOrbit提到的每个群集
      options
      要求您将关联的
      options
      值非直观地混合到非关联的节点数组中,例如:
      'redis'=>['clusters'=>['default'=>['options'=>['cluster'=>'redis'],['scheme'=>env('redis_scheme','tcp'),/*.*.*/-],]
      具有更好的格式和更多与此相关的信息。