質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

6757閲覧

Laravel ElastiCache(Memcached)で一定確率でTokenMismatchExceptionが発生する

Entlassen

総合スコア7

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/06/05 08:28

###前提・実現したいこと

AWS + ALB + EC2を使って冗長化構成のWebサービスを開発中です。

###発生している問題・エラーメッセージ

sessionDriverとしてLaravel ElastiCache(Memcached)を使っているのですが、一定確率でsessionが切れたり(約2分の1の確率)TokenMismatchExceptionが発生してしまいます。

config/cache.php

php

1 'memcached' => [ 2 'driver' => 'memcached', 3 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 4 'sasl' => [ 5 env('MEMCACHED_USERNAME'), 6 env('MEMCACHED_PASSWORD'), 7 ], 8 'options' => [ 9 // Memcached::OPT_CONNECT_TIMEOUT => 2000, 10 ], 11 'servers' => [ 12 [ 13 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 14 'port' => env('MEMCACHED_PORT', 11211), 15 'weight' => 100, 16 ], 17 ], 18 ],

各環境変数には下記の値が入っています。
MEMCACHED_HOST: dev-session.888888.cfg.apne1.cache.amazonaws.com
MEMCACHED_PORT: 11211

発生している問題は こちら と同様だと思われます。

###試したこと

  • elasticache-laravel というミドルウェアを試してみましたが結果は変わりませんでした。

ちなみに Memcached ではなく Redisを使っても同様の問題が発生します。
RedisはclusterモードをONにしてMultiAZ構成でノードは3台で試しました。
Redisの際は redis-cli -c での検証時は問題なくデータの出し入れが出来たのでクライアント側(laravel側)に問題があると推測しています。

###補足情報(言語/FW/ツール等のバージョンなど)

  • PHP(7.1.5)
  • nginx(1.10.2)
  • ロードバランサー(ALBに)
  • Laravel(5.4.21)
  • Laravel ElastiCache(Memcached 1.4.34 ノード2台でMultiAZ)

他に必要な情報があれば追記いたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
たしか、各ノードをMemcache::addServerで登録する必要があります。
Laravelではconfig/cache.phpのserversに全ノードの設定を追加すればいいと思います。

補足

MEMCACHED_HOSTに設定されているのは、Configration Endpointと推測しますがこちらは、Auto Discovery用のEndpointになります。

Auto Discoveryを使う場合、ElastiCache Cluster Clientというクライアントプログラムを導入する必要があります。
参考URL

Configration Endpointを見ると、このURLに接続すれば、あたかもAWS側で各ノードを自動的に選択してくれるように見えますが、実はそうではありません。
memcacheの仕様ではどのノードに接続するかは、クライアント側(つまり質問者さんのサーバ)が選択します。
ですので、クライアントがどのノードに接続すればいいか選択できるように全ノードをAddServerする必要があります。

では、Configration Endpointとは何か?
乱暴に言えば、各ノードのリストを返してくるようなものです。
クライアントをAWSが用意しているElastiCache Cluster Clientにすることで、Configration Endpointが返してきた各ノードのリストを解釈し、自動的に接続先ノードを選択してくれるようになります。

投稿2017/06/06 02:08

編集2017/06/07 09:47
s-washion

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Entlassen

2017/06/07 15:56

はじめまして。 ご丁寧な解説ありがとうございます。 おっしゃる通り、 `config/cache.php` にノードのIPを追加する事で対応が出来ました。 Configuration Endpointの挙動やmemcachedのクライアントの挙動も非常に勉強になりました。 こちら解決しましたのでベストアンサーにさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問