From 0b2906979d7ddfc3dda80883be9756db53f89754 Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Sun, 12 Jun 2016 23:04:27 -0700 Subject: [PATCH] Add clustering via $WEB_CONCURRENCY env var --- Procfile | 2 +- Procfile.local | 2 +- modules/server/index.js | 56 ++++++++++++++++++++++++++++++++++++++--- modules/server/start.js | 32 ----------------------- package.json | 1 + 5 files changed, 55 insertions(+), 38 deletions(-) delete mode 100644 modules/server/start.js diff --git a/Procfile b/Procfile index 484243d..f706190 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: node lib/server/start.js +web: node lib/server diff --git a/Procfile.local b/Procfile.local index 2fc2c6e..e3fa3bb 100644 --- a/Procfile.local +++ b/Procfile.local @@ -1 +1 @@ -web: NODE_ENV=development node -r ./modules/register.js modules/server/start.js +web: NODE_ENV=development node -r ./modules/register.js modules/server diff --git a/modules/server/index.js b/modules/server/index.js index 3cf3ec6..de1a596 100644 --- a/modules/server/index.js +++ b/modules/server/index.js @@ -1,10 +1,14 @@ +/*eslint-disable no-console*/ +import path from 'path' import cors from 'cors' +import throng from 'throng' import morgan from 'morgan' import express from 'express' import devErrorHandler from 'errorhandler' import WebpackDevServer from 'webpack-dev-server' import { createRequestHandler } from 'npm-http-server' import { staticAssets, assetsCompiler, createDevCompiler } from './AssetsUtils' +import webpackConfig from '../../webpack.config' import { sendHomePage } from './MainController' import { logStats } from './StatsUtils' @@ -23,7 +27,7 @@ export const createRouter = (config = {}) => { const errorHandler = (err, req, res, next) => { res.status(500).send('

Internal Server Error

') - console.error(error.stack) + console.error(err.stack) next(err) } @@ -56,9 +60,9 @@ export const createDevServer = (config) => { // https://webpack.github.io/docs/node.js-api.html#stats-tojson assets: true, colors: true, - version: false, - hash: false, - timings: false, + version: true, + hash: true, + timings: true, chunks: false }, @@ -79,3 +83,47 @@ export const createDevServer = (config) => { return server } + +const port = process.env.PORT || 5000 +const statsFile = path.resolve(__dirname, '../../stats.json') +const publicDir = path.resolve(__dirname, '../../public') +const registryURL = process.env.REGISTRY_URL || 'https://registry.npmjs.org' +const bowerBundle = process.env.BOWER_BUNDLE || '/bower.zip' +const redirectTTL = process.env.REDIRECT_TTL || 500 +const autoIndex = !process.env.DISABLE_INDEX +const redisURL = process.env.REDIS_URL + +const DefaultServerConfig = { + id: 1, + port, + webpackConfig, + statsFile, + publicDir, + registryURL, + bowerBundle, + redirectTTL, + autoIndex, + redisURL +} + +export const startServer = (serverConfig) => { + const config = { + ...DefaultServerConfig, + ...serverConfig + } + + const server = process.env.NODE_ENV === 'production' + ? createServer(config) + : createDevServer(config) + + server.listen(config.port, () => { + console.log('Server #%s listening on port %s, Ctrl+C to stop', config.id, config.port) + }) +} + +if (require.main === module) + throng({ + start: (id) => startServer({ id }), + workers: process.env.WEB_CONCURRENCY || 1, + lifetime: Infinity + }) diff --git a/modules/server/start.js b/modules/server/start.js deleted file mode 100644 index 000eabb..0000000 --- a/modules/server/start.js +++ /dev/null @@ -1,32 +0,0 @@ -import path from 'path' -import { createServer, createDevServer } from './index' - -const port = process.env.PORT || 5000 -const webpackConfig = require('../../webpack.config') -const statsFile = path.resolve(__dirname, '../../stats.json') -const publicDir = path.resolve(__dirname, '../../public') -const registryURL = process.env.REGISTRY_URL || 'https://registry.npmjs.org' -const bowerBundle = process.env.BOWER_BUNDLE || '/bower.zip' -const redirectTTL = process.env.REDIRECT_TTL || 500 -const autoIndex = !process.env.DISABLE_INDEX -const redisURL = process.env.REDIS_URL - -const serverConfig = { - port, - webpackConfig, - statsFile, - publicDir, - registryURL, - bowerBundle, - redirectTTL, - autoIndex, - redisURL -} - -const server = process.env.NODE_ENV === 'production' - ? createServer(serverConfig) - : createDevServer(serverConfig) - -server.listen(port, () => { - console.log('Server started on port %s, Ctrl+C to quit', port) -}) diff --git a/package.json b/package.json index 75b1b78..95995ee 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "redis": "^2.6.0-1", "rimraf": "^2.5.2", "style-loader": "^0.13.1", + "throng": "^4.0.0", "webpack": "^1.13.0", "webpack-dev-server": "^1.14.1" },