はじめに
Expressは「node.jsを使ったWEBアプリケーションの代名詞」と言えるほど簡単にWebアプリが作れる便利なフレームワーク。
この便利なフレームワークを使って「遊びで」Webアプリやサービスを作ったりしている分には困ることはまずないのですが、もう少し本格的なアプリを作るとなったときに小手先の知識じゃいけないということがわかり少しハマったので、そのときのメモとして残しておきます。
ロードバランサで複数サーバー運用を考えた時のセッション管理(維持)
ロードバランサとは、簡単に書くと、アクセスが集中したときに複数台のサーバーに分散させたり、サーバーAが死んだときにサーバーBに振り分けてくれたりするもの。
expressでセッションを使うときにはexpress-sessionというパッケージをインストールすることで簡単に使えるというのがweb検索でヒットします。
しかし、ここでセッションとして保持している情報はどこに保存しているかというと、サーバーのメモリに保存しているということになるので、複数台サーバーがある場合には単純にexpress-sessionを使ったセッション管理ができません。
例えばサーバーが2台あるとして、ロードバランサが一回目のアクセス時にサーバーAに振り分け、そこのセッションにログイン情報を保存したとしても、次のページを開くときにこんどはサーバーBに振り分けられたため、セッションが見つからず、ログインしたはずなのにまたログイン画面に戻ってきた。なんてことになりかねないのです。
あれ、どうすればいいんだろう。と思い調べるといくつか方法がありましたので、大きく3つ取り上げて書いていきます。
1.ロードバランサのセッション維持機能を使う
既にあるアプリケーションに手を加えずに手軽に解決できる方法がこちら。
AWSのELBでロードバランサを立てている際にはスティッキーセッションの設定 というのをしてあげることで良いらしい。
この方法では、あなたはサーバーAにずっと振り分ける、あなたはサーバーBにずっと振り分ける。といった方法を取ることで、別サーバーに振られることがなく、サーバーのメモリ内でのセッション管理に影響を出さないという解決方法。
以下の記事がわかりやすかったです。
https://www.fujitsu.com/jp/products/network/security-bandwidth-control-load-balancer/ipcom/material/data/1/6.html
https://hack-le.com/sticky-session/
2.Redisを使う
よく名前は見かけてはいたが深く調べることもしなかったRedisというやつ。キーバリューストア型でとても速いパフォーマンスを出すことができるらしいです。
この方法では、セッションをサーバー内のメモリではなく外部のRedisに保存することで、別サーバーでも関係なくセッションの共有ができるという方法。
RDBでMySQLを使ってるんだけどRedisも使うのか。。となった方には次の方法。
3.express-session-〇〇を使う。
2のRedisを使ったセッション管理ほどパフォーマンスを重視しない場合には、RDSにセッションを保存しようというやり方。
express-session-〇〇という書き方はイケてないですが、使うRDBを〇〇部分に指定して検索かけてみるとパッケージで公開されていたりします。
mySQLの場合はexpress-mysql-sessionというのがありました。
使い方などは以下がわかりやすかったです。
https://www.npmjs.com/package/express-mysql-session
https://tech.chakapoko.com/nodejs/express/session.html
まとめ
一番簡単なのは1ですが、3も全然簡単でした。2についてはやり方は読みましたが実際に試すところまではやっていません。