Summary
In this post I'll show how to create a simple reverse proxy server in Node.js.
Environmentals
The scenario here is front-ending an app server (in this case Genesys Mobility Services (GMS) with a proxy to only forward application-specific REST API requests to GMS over HTTPS. The proxy also acts as a general web server as well - also over HTTPS.
Code
Lines 1-11: Set up a HTTPS server with Express. The proxy target is specified in Line 3.
- var path = require('path');
- var fs = require('fs');
- var gms = 'https://svr2:3443';
- var express = require('express');
- var app = express();
- var privateKey = fs.readFileSync('./key.pem');
- var certificate = fs.readFileSync('./cert.pem');
- var credentials = {key: privateKey, cert: certificate};
- var https = require('https');
- var httpsServer = https.createServer(credentials, app);
- var httpProxy = require('http-proxy');
- var proxy = httpProxy.createProxyServer({
- secure : false,
- target : gms
- });
- httpsServer.on('upgrade', function (req, socket, head) {
- proxy.ws(req, socket, head);
- });
- proxy.on('error', function (err, req, res) {
- console.log(err);
- try {
- res.writeHead(500, {
- 'Content-Type': 'text/plain'
- });
- res.end('Error: ' + err.message);
- } catch(err) {
- console.log(err);
- }
- });
- app.use(express.static(path.join(__dirname, 'public')));
- app.all("/genesys/*", function(req, res) {
- proxy.web(req, res);
- });
- httpsServer.listen(8443);
Lines 13-17: Set up the Proxy. I'm using a self-signed certificate on Svr 2, so 'secure' is set to false to support that.
Lines 19-21: Configure the HTTPS server use the Proxy to proxy websockets.
Line 35: Serve up static content (HTML, CSS, Javascript) from the 'public' directory for general requests to this server.
Lines 37-39: Proxy any requests that are specifically to the GMS REST API, both HTTPS and WSS traffic.
Source: https://github.com/joeywhelan/Revproxy/
Copyright ©1993-2024 Joey E Whelan, All rights reserved.