Node.js


Socket.IO


以前、Node.jsとSocket.IOでリアルタイムのチャットアプリを作ってみた。

チャットアプリを常時SSL化する必要が出てきたので、その時行った対応を記載する。

Node.jsとSocket.IOでリアルタイムのチャットアプリを作ってみる

常時SSL化はSEO上効果はあるか?


常時SSL化をするにあたって、


Let's Encrypt - Free SSL/TLS Certificates


いつもの通り、Let's Encryptを利用します。

※Let's Encryptの設定は下記の記事に記載してある。

当サイトをHTTP/2対応して表示の爆速化してみた


はじめに今回の開発環境を記載しておくと

サーバ:さくらVPS 512Gプラン

OS:Ubuntu 16.04

Node.js:9.2.1

npm:5.5.1

Socket.IO:2.0.3


先にhttpで運営する方のコードを記載しておくと、

const server = require("http").createServer();
server.listen(8080);

// HTTPをWebSocketにUpgradeする
const io = require("socket.io").listen(server);

//以下省略

こんな感じ。


ここをhttpsにする場合は、require("http")の箇所をrequire("https")にしたいところだけれども、

SSL(TLS)を利用する場合はサーバ証明書等のファイルの読み込みが必要になる。


そこで、

config.json

{
"key" : "/etc/letsencrypt/live/sample.domain/privkey.pem",
"cert" : "/etc/letsencrypt/live/sample.domain/cert.pem",
"chain" : "/etc/letsencrypt/live/sample.domain/chain.pem",
"fullchain" : "/etc/letsencrypt/live/sample.domain/fullchain.pem"
}

※sample.domainにはご利用中のサーバのドメインを入れる

このような常時SSL化時に読み込まなければならないファイルのパスを記載したJSONのファイルを用意し、


let config = JSON.parse(fs.readFileSync("config.json"));
let opts = {
key: fs.readFileSync(config.key),
cert: [fs.readFileSync(config.cert)],
ca: [fs.readFileSync(config.chain), fs.readFileSync(config.fullchain)]
};
const server = require("https").createServer(opts);
server.listen(8080);

// HTTPをWebSocketにUpgradeする
const io = require("socket.io").listen(server);

//以下省略

証明書のファイルを読み込めるように書き換えた。


今回はrootでなければ読み込めない証明書のファイルがあるため、

前回までの

node index.js

では実行できず、

sudo node index.js

のようにsudor権限で実行する、もしくは各種ファイルのシンボリックパスを作成して読み込む必要がある。


foreverで永続化する場合も同様にsudor権限での実行等の対処が必要。

Node.js製のアプリをforeverで永続化する


関連記事

インターネット内に流れているパケットを傍受してみる