>  기사  >  웹 프론트엔드  >  Nginx를 버리고 nodejs를 역방향 프록시로 사용하십시오.

Nginx를 버리고 nodejs를 역방향 프록시로 사용하십시오.

WBOY
WBOY원래의
2016-05-16 16:41:511763검색

요즘에는 웹 프로젝트를 호스팅하고 실행하기 위해 VPS 호스트를 신청하는 경우가 많습니다. 저와 동생도 작은 Win 03 VPS를 구입하여 사용하고 있습니다. 사용하는 과정에서 문제가 생겼는데, 즉 같은 종류의 서버 환경이면 괜찮지만, PHP, ASP, JSP라는 3가지 종류의 서버 프로젝트가 공존하는 경우 어떻게 고유한 서버 환경을 할당할 것인가? 포트 80? 상업용 WWW 웹사이트는 포트 80만 점유하는 경우가 많기 때문에 물론 인터페이스와 같은 서비스만 제공하는 경우 다른 포트를 사용해도 포트 80과 충돌하지 않습니다. 많은 개발자들이 포트 80 문제에 직면하게 될 것이며 실제 상황은 비용에 의해 제한될 것입니다. 프로젝트만을 위해 VPS를 관리하는 것은 경제적이지 않고, 비용 효율적이지 않으며, 불편하기 때문입니다. 따라서 포트 80을 제공하면서 여러 서버에 배포하여 서로 다른 호스트가 자체 웹 프로젝트를 실행할 수 있도록 신중하게 고려해야 합니다.

사랑하는 여러분, 이 요구 사항이 실현될 수 있다고 생각하시나요? 그렇다, 이것은 '마법의 기술'도 아니고, 복잡한 기술도 아니다. 네트워크 서비스에서 "역방향 프록시"의 기능 중 하나가 포트 분배를 완료하는 것이라는 사실을 알고 계시는지 궁금합니다. 배포 경로로 도메인 이름을 사용할 수도 있습니다. AA.com 도메인 이름에 대한 모든 요청은 실행을 위해 PHP 포트 82에 배포되고, BB.com 도메인 이름에 대한 모든 요청은 실행을 위해 ASP 포트 83에 배포됩니다. ... 등등. 물론 여기서의 포트는 설명을 위한 것일 뿐이며 임의로 구성할 수 있습니다. 어쨌든 포트 80에서 받은 요청은 한 번 처리된 후 배포됩니다. 일반인의 관점에서 역방향 프록시는 왼손을 오른손으로 바꾸는 것입니다.

사람들이 역방향 프록시를 언급할 때마다 일반적으로 Nginx를 생각하지만, 오늘은 유명한 Nginx를 일시적으로 무시하고 이를 달성하기 위해 단일 스레드와 이벤트 루프도 사용하는 서버측 동생인 Nodejs를 사용하겠습니다. 우선 Node는 서버측 프로그래밍을 위해 Nginx나 Lua 대신 JS를 사용해 구성을 작성하는데, 이것이 제 취향에 더 맞습니다. 둘째, Node에도 익숙해서 다양한 측면을 구성하기가 더 쉽습니다.

이 기능을 수행하려면 node-http-proxy 패키지가 필요합니다. 다운로드하고 설치하려면 다음을 입력하세요.

npm install http-proxy

설치가 완료된 후 새 Proxy.js 파일을 만들고 다음을 입력하세요.

var http = require('http'), httpProxy = require('http-proxy');

// 新建一个代理 Proxy Server 对象
var proxy = httpProxy.createProxyServer({});

// 捕获异常
proxy.on('error', function (err, req, res) {
 res.writeHead(500, {
 'Content-Type': 'text/plain'
 });
 res.end('Something went wrong. And we are reporting a custom error message.');
});

// 另外新建一个 HTTP 80 端口的服务器,也就是常规 Node 创建 HTTP 服务器的方法。
// 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = require('http').createServer(function(req, res) {
 // You can define here your custom logic to handle the request
 // and then proxy the request.
 var host = req.url;
 host = url.parse(host); host = host.host;
 
 console.log("host:" + req.headers.host);
 console.log("client ip:" + (req.headers['x-forwarded-for'] || req.connection.remoteAddress));
 
 proxy.web(req, res, { target: 'http://localhost:8080' });
});

console.log("listening on port 80")
server.listen(80);

프록시 서버를 사용하는 비용은 사용하지 않는 것보다 더 많은 리소스와 CPU 작업을 소비한다는 것일 수 있습니다.

사용 문제: 폴더를 지정할 수 없습니다. proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.