Express를 사용하여 자신만의 역방향 프록시 구축
25685 단어 tutorialwebdevjavascriptnode
Twitter에서 나를 팔로우하세요.
https://medium.com/@hohanga에서 더 많은 기사
분산 시스템에 마이크로서비스 아키텍처를 사용하는 경우 API 게이트웨이가 필요합니다. API 게이트웨이를 구축하는 좋은 방법 중 하나는 역방향 프록시를 사용하는 것입니다. Node.js은 빠르고 리버스 프록시를 만들기 위한 라이브러리가 많기 때문에 리버스 프록시에 좋습니다.
Express는 웹 앱을 구축하는 데 가장 널리 사용되는 프레임워크입니다. 역방향 프록시에 대한 라우팅을 수행할 수 있는 Express에 추가 기능이 있기 때문에 역방향 프록시를 구축하는 데에도 매우 좋습니다.
디자인은 매우 간단할 것입니다. 요청의 URL에 따라 트래픽을 다른 백엔드 앱으로만 리디렉션합니다. 또한 요청 페이로드 외에도 헤더 데이터, 파일 및 쿠키를 당사 서비스에 전달할 수 있어야 합니다.
이 모든 작업을 수행하기 위해 먼저 https://expressjs.com/en/starter/generator.html의 지침에 따라 Express 애플리케이션 생성기를 실행하여 앱을 스캐폴딩합니다.
필요한 코드를 생성하려면
npx express-generator
를 실행해야 합니다.nodemon
를 사용하여 개발 환경에서 앱을 실행하여 코드가 변경될 때마다 다시 시작하도록 제안합니다.다음으로 역방향 프록시 기능을 수행하고 프런트 엔드 앱이 역방향 프록시를 사용할 수 있도록 CORS를 활성화하기 위해 일부 패키지를 설치해야 합니다. 이렇게 하려면
npm i express-http-proxy glob node-env-file cookie-parser babel-register body-parser
를 실행하십시오.express-http-proxy
는 HTTP 역방향 프록시 라이브러리입니다. cors
는 CORS를 활성화하는 Express용 애드온입니다. cookie-parser
는 Express가 쿠키를 구문 분석할 수 있도록 하는 추가 기능입니다. babel-register
를 사용하면 최신 JavaScript 기능을 사용할 수 있습니다. node-env-file
를 사용하면 .env
파일을 사용하여 환경 변수를 저장할 수 있습니다. body-parser
는 멀티파트 요청을 확인하는 데 사용됩니다. 멀티파트 요청은 파일이 있는 요청입니다. 파일이 있는 요청은 리디렉션되기 전에 진행되지 않습니다body-parser
.이제 코드를 작성할 준비가 되었습니다. 생성한
helper.js
폴더에 helpers
라는 새 파일을 만듭니다.거기에 다음을 추가합니다.
module.exports = {
isMultipartRequest: (req) => {
let contentTypeHeader = req.headers['content-type'];
return contentTypeHeader && contentTypeHeader.indexOf('multipart') > -1;
}
}
이 함수는 양식 데이터로 전송되는 요청인 멀티파트 요청을 확인합니다. 여기에는 텍스트나 파일이 포함될 수 있습니다.
app.js
에서 다음과 같이 씁니다.require("babel-register");
let express = require('express');
let cors = require('cors')
let config = require('./config/config');
let env = require('node-env-file');
let helpers = require('./app/helpers/helpers');
let bodyParser = require('body-parser');
env(__dirname + '/.env');
let app = express();
app.use(cors({
credentials: true,
origin: true
}));
const bodyParserJsonMiddleware = function () {
return function (req, res, next) {
if (helpers.isMultipartRequest(req)) {
return next();
}
return bodyParser.json()(req, res, next);
};
};
app.use(bodyParserJsonMiddleware());
app.all('*', (req, res, next) => {
let origin = req.get('origin');
res.header('Access-Control-Allow-Origin', origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
module.exports = require('./config/express')(app, config);
app.listen(config.port, () => {
console.log('Express server listening on port ' + config.port);
});
이 코드는 서버 측 쿠키를 전달하여 작동하며 JSON이 아니기 때문에 멀티파트 요청이 통과하지 못하도록 합니다
body-parser
.또한 아래 블록에서 CORS를 허용합니다.
app.all('*', (req, res, next) => {
let origin = req.get('origin');
res.header('Access-Control-Allow-Origin', origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
모든 출처의 요청을 수락할 수 있습니다. 기본적으로 다른 호스트의 요청을 허용하는 것은 안전하지 않으므로 백엔드와 동일한 호스트의 요청만 수락됩니다. 그러나 모바일 및 독립 실행형 프론트 엔드 웹 앱이 역방향 프록시를 통해 요청하도록 허용하는 경우 모든 출처를 허용해야 합니다. 헤더에서 오리진을 가져오고 해당 오리진의 요청이 계속 진행되도록 허용합니다.
그런 다음
controllers/home.js
에 요청을 프록시하기 위한 코드를 추가합니다.const express = require('express');
let proxy = require("express-http-proxy");
let helpers = require('../helpers/helpers');
let loginAppRoutes =[
'/login*',
'/loginms',
'/register',
'/resetPassword',
'/getActivationKey*',
'/activateAccount',
'/logout',
'/reports',
'/'
]
let uploadRoutes = [
'/uploadlogo*',
]
module.exports = (app) => {
const proxyMiddleware = () => {
return (req, res, next) => {
let reqAsBuffer = false;
let reqBodyEncoding = true;
let contentTypeHeader = req.headers['content-type'];
if (helpers.isMultipartRequest(req)) {
reqAsBuffer = true;
reqBodyEncoding = null;
}
return proxy(process.env.UPLOAD_URL, {
reqAsBuffer: reqAsBuffer,
reqBodyEncoding: reqBodyEncoding,
parseReqBody: false,
proxyReqOptDecorator: (proxyReq) => {
return proxyReq;
},
proxyReqPathResolver: (req) => {
return `${process.env.UPLOAD_APP_URL}/${req.baseUrl}${req.url.slice(1)}`;
},
userResDecorator: (rsp, data, req, res) => {
res.set('Access-Control-Allow-Origin', req.headers.origin);
return data.toString('utf-8');
}
})(req, res, next);
};
}
uploadRoutes.forEach(r => {
app.use(r, proxyMiddleware());
})
loginAppRoutes.forEach(r => {
app.use(r, proxy(process.env.LOGIN_URL, {
proxyReqOptDecorator: (proxyReq) => {
return proxyReq;
},
proxyReqPathResolver: (req) => {
return `${process.env.LOGIN_URL}/${req.baseUrl}${req.url.slice(1)}`;
},
userResDecorator: (rsp, data, req, res) => {
res.set('Access-Control-Allow-Origin', req.headers.origin);
return data.toString('utf-8');
}
}));
})
};
다음을 사용하여 여러 부분으로 구성된 양식 요청을 확인합니다.
if (helpers.isMultipartRequest(req)) {
reqAsBuffer = true;
reqBodyEncoding = null;
}
파일이 포함된 요청을 내부 API로 바로 전달합니다.
다음과 같은:
proxyReqPathResolver: (req) => {
return `${process.env.LOGIN_URL}/${req.baseUrl}${req.url.slice(1)}`;
},
프록시에서 내부 API로의 실제 리디렉션 URL이 설정되는 곳입니다.
parseReqBody
는 false
이므로 멀티파트 양식 요청이 JSON으로 구문 분석되지 않습니다.process.env
변수는 .env
파일에 설정되어 있습니다..env
파일에는 다음이 있습니다.LOGIN_URL='http://urlForYourLoginApp'
UPLOAD_URL='http://anotherUrlForYourUploadApp'
역방향 프록시 추가 기능을 사용하는 Express는 Node.js에서 역방향 프록시를 구축하기 위한 최상의 선택 중 하나입니다.
Reference
이 문제에 관하여(Express를 사용하여 자신만의 역방향 프록시 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aumayeung/build-your-own-reverse-proxy-with-express-4da4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)