Skip to content

Instantly share code, notes, and snippets.

@dennishall
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dennishall/d44867c22b758932e0b6 to your computer and use it in GitHub Desktop.
Save dennishall/d44867c22b758932e0b6 to your computer and use it in GitHub Desktop.
No need to run nginx when you're running nodejs
var fs = require('fs');
var httpProxy = require('http-proxy');
// use environment variables if present.
var httpPort = process.env.PORT || 8000;
var httpsPort = process.env.HTTPS_PORT || 443;
//
// Create the proxy server listening on httpsPort, defaulting to 443
//
var proxy = httpProxy.createProxyServer({
ssl: {
key: fs.readFileSync('cert/key.pem', 'utf8'),
cert: fs.readFileSync('cert/cert.pem', 'utf8')
},
target: 'http://localhost:' + httpPort,
secure: false
}).listen(httpsPort);
proxy.on('error', function(e, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('An error occurred with the proxied application.\n Perhaps it is not currently running.');
});
// add 'X-Forwarded-For' header
proxy.on('proxyRes', function(e, req, res) {
res.setHeader('X-Forwarded-For', req.connection.remoteAddress);
});
console.log('Reverse proxy is proxying :' + httpPort + ' and listening on :' + httpsPort);
/**
* Module dependencies.
*/
"use strict";
var express = require('express');
var enrouten = require('express-enrouten');
var path = require('path');
var http = require('http');
var favicon = require('serve-favicon');
var logger = require('morgan');
var methodOverride = require('method-override');
var session = require('express-session');
var bodyParser = require('body-parser');
var multer = require('multer');
var errorHandler = require('errorhandler');
var cookieParser = require('cookie-parser');
var maxmind = require('maxmind');
maxmind.init(path.join(__dirname, '/data/GeoLiteCity.dat'));
var _global = {
pageHeader: require('./models/page-header'),
pageFooter: require('./models/page-footer'),
redesignMessage: require('./models/redesign-message')
};
var app = express();
app.set('port', process.env.PORT || 8000);
app.set('https_port', process.env.HTTPS_PORT || 443);
app.set('views', path.join(__dirname, '/public/templates'));
app.set('view engine', 'vash');
app.use(favicon(path.join(__dirname, '/public/favicon.ico')));
app.use(logger('dev'));
app.use(methodOverride());
app.use(session({
resave: true,
saveUninitialized: true,
secret: 'secret phrase goes here'}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
app.use(express.static(path.join(__dirname, '.build')));
app.use(cookieParser());
// default server ip address value, will only be used for super-rare race condition
var serverIP = '23.72.23.58';
// get Server's IP address .. because for local development, server ip === user ip
http.get({
host: 'icanhazip.com',
path: '/'
}, function(response) {
var body = '';
response.on('data', function(d) {
body += d;
});
response.on('end', function() {
console.log('SERVER IP ADDRESS: ', body);
serverIP = body;
});
});
app.use(function(req, res, next) {
res.global = _global;
var cookieName = 'KmxVisitor_0';
var cookie = req.cookies[cookieName];
// check if client sent cookie, if not, set the zipcode cookie
if (cookie === undefined) {
// according to the http spec, headers are NOT case sensitive, but I'd rather check both than have to redo it.
var ip = (req.headers['X-Forwarded-For'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress).split(',')[0].trim();
// correct for local development
if(ip.indexOf('127.0.0.1') !== -1){
ip = serverIP;
}
var loc = maxmind.getLocation(ip);
var zip = loc && loc.postalCode || 23219;
res.append('Set-Cookie', cookieName + '=Zip=' + zip + '; Domain=.carmax.com; Path=/');
}
next();
});
app.use('/', enrouten({
directory: './controllers'
}));
if (app.get('env') !== 'production'){
app.use(errorHandler());
}
app.listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment