Я смог заставить его работать!
Вам нужно переместить «схему» с '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],
],
],
Примечание. Я также удалил параметр 'cluster'
из 'options'
, но я не подозреваю, что это решает эту проблему.
В моей окончательной конфигурации я изменил его на: 'scheme' => env('REDIS_SCHEME', 'tcp'),
, а затем вместо этого определил REDIS_SCHEME=tls
в моем файле env.
Протестировано с AWS ElastiCache с включенным TLS.
Изменить: приведенная выше конфигурация работает только с 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'
: указывает используемый драйвер Redis библиотеки PHP (predis).
'cluster' => 'redis'
: This tells Predis to assume server-side clustering. Which just means "follow redirects" (e.g. -MOVED
responses). When running with a cluster, a node will respond with a -MOVED
to the node that you must ask for a specific key.
- If you don't have this enabled with Redis Clusters, Laravel will throw a
-MOVED
exception 1/n times, n being the number of nodes in Redis cluster (it'll get lucky and ask the right node every once in awhile)
'clusters' => [...]
: указывает список узлов, но устанавливает только «по умолчанию» и указывает на Конечная точка конфигурации AWS позволит ему динамически находить любые/все остальные узлы (рекомендуется для Elasticache, поскольку вы не знаете, когда узлы приходят или уходят).
'options'
: для Laravel можно указать на верхнем уровне, на уровне кластера и в опции узла. (они объединяются в Illuminate, а затем передаются Предису)
'parameters'
: Они «переопределяют» настройки/допущения подключения по умолчанию, которые Predis использует для новых подключений. Поскольку мы устанавливаем их явно для соединения «по умолчанию», они не используются. Но для установки кластера они критичны. «Главный» узел может отправить обратно перенаправление (-MOVED
), и если параметры для password
и scheme
не установлены, он примет значения по умолчанию, и это новое соединение с новым узлом не удастся.
person
CenterOrbit
schedule
20.02.2018