技術ブログ

プログラミング、IT関連の記事中心

Node.js Expressのexpress-generatorで作成したプロジェクトをHTTPS起動する方法【Node.js】

■はじめに

以下のリンク先のサイトで、express-generatorを使用してプロジェクトを作成しておいてください。

www.reigle.info

■手順

express-generatorで生成されたプロジェクトの「bin」配下の「www」を以下に書き換えます。

#!/usr/bin/env node

serverStart();
sslServerStart();

/**
 * 通常(HTTP)のサーバー起動
 */
function serverStart() {
  var app = require('../app');
  var http = require('http');
  var port = normalizePort(process.env.PORT || '3000');
  app.set('port', port);
  var server = http.createServer(app);
  server.listen(port);
  server.on('error', onError);
  console.log("ポート「" + port + "」でHTTPサーバーを起動しました");
}

/**
 * SSL(HTTPS)のサーバー起動
 */
function sslServerStart() {
  var app = require('../app');
  var https = require('https');
  var fs = require('fs');
  var options = {
      key: fs.readFileSync("[秘密鍵]"),
      cert: fs.readFileSync("[証明書]")
  };
  
  var port = normalizePort(process.env.SSL_PORT || '4000');
  app.set('port', port);
  var serverS = https.createServer(options, app);
  serverS.listen(port);
  serverS.on('error', onError);
  console.log("ポート「" + port + "」でHTTPSサーバーを起動しました");
}

/**
 * ポートのバリデーションチェックして正しいポートを設定する
 * @param val 
 */
function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    return val;
  }

  if (port >= 0) {
    return port;
  }

  return false;
}

/**
 * エラー発生時のハンドリング
 * @param error 
 */
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

「[秘密鍵]」と「[証明書]」の部分は各環境に書き換えてください。

ちなみに、以下で取得した証明書の場合は以下のように記載できます。

www.reigle.info

var options = {
    key: fs.readFileSync("/etc/letsencrypt/live/hogehoge.com/privkey.pem"),
    cert: fs.readFileSync("/etc/letsencrypt/live/hogehoge.com/cert.pem")
};

「hogehoge.com」の部分は自分のドメインに書き換えてください。

HTTPSのポートを指定する方法

package.jsonの「scripts」を以下のように記載することで、HTTPとHTTPSのそれぞれのポートを指定できます。

"scripts": {
  "start": "PORT=1234 SSL_PORT=5678 node ./bin/www"
},

「PORT」がHTTPのポートで「SSL_PORT」がHTTPSのポートです。