Node.js가 gzip 압축을하지 않고 gzip 압축을 수행 할 모듈이 없다는 사실을 잘못 알고 있습니까? 압축이없는 웹 서버를 누구나 어떻게 사용할 수 있습니까? 내가 여기서 무엇을 놓치고 있습니까? 서버 측 사용을 위해 알고리즘을 JavaScript로 이식해야합니까?
Node.js가 gzip 압축을하지 않고 gzip 압축을 수행 할 모듈이 없다는 사실을 잘못 알고 있습니까? 압축이없는 웹 서버를 누구나 어떻게 사용할 수 있습니까? 내가 여기서 무엇을 놓치고 있습니까? 서버 측 사용을 위해 알고리즘을 JavaScript로 이식해야합니까?
답변:
Node v0.6.x는 이제 코어에 안정된 zlib 모듈 을 가지고 있습니다. 문서에도 서버 측을 사용하는 방법에 대한 몇 가지 예가 있습니다.
예 (문서에서 가져옴) :
// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
http.createServer(function(request, response) {
var raw = fs.createReadStream('index.html');
var acceptEncoding = request.headers['accept-encoding'];
if (!acceptEncoding) {
acceptEncoding = '';
}
// Note: this is not a conformant accept-encoding parser.
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (acceptEncoding.match(/\bdeflate\b/)) {
response.writeHead(200, { 'content-encoding': 'deflate' });
raw.pipe(zlib.createDeflate()).pipe(response);
} else if (acceptEncoding.match(/\bgzip\b/)) {
response.writeHead(200, { 'content-encoding': 'gzip' });
raw.pipe(zlib.createGzip()).pipe(response);
} else {
response.writeHead(200, {});
raw.pipe(response);
}
}).listen(1337);
당신이 사용하는 경우 Express를 , 당신은 구성의 일환으로 압축 방법을 사용할 수 있습니다 :
var express = require('express');
var app = express.createServer();
app.use(express.compress());
압축에 대한 자세한 내용은 여기에서 찾을 수 있습니다 : http://expressjs.com/api.html#compress
그리고 만약 당신이 Express를 사용하지 않는다면 .. 왜 안돼?! :)
참고 : (@ankitjaininfo 덕분에)이 미들웨어는 모든 응답이 압축되도록 "사용"하는 첫 번째 미들웨어 중 하나 여야합니다. 이것이 경로 및 정적 핸들러 위에 있는지 확인하십시오 (예 : 위에있는 방법).
참고 : (@ ciro-costa 덕분에) Express 4.0부터 express.compress
미들웨어는 더 이상 사용되지 않습니다. connect 3.0에서 상속되었으며 express는 더 이상 connect 3.0을 포함하지 않습니다. 미들웨어를 얻으려면 Express Compression 을 확인하십시오 .
This middleware should be placed "high" within the stack to ensure all responses may be compressed.
이것이 당신의 경로와 정적 핸들러 위에 있는지 확인
express.compress
미들웨어 (connect 3.0 <에서 상 속됨)는 더 이상 connect 3.0 <을 포함하지 않기 때문에 더 이상 사용되지 않습니다 (express 4.0부터). 미들웨어를 얻으려면 github.com/expressjs/compression 을 확인하십시오 .
1- 압축 설치
npm install compression
2- 그것을 사용하십시오
var express = require('express')
var compression = require('compression')
var app = express()
app.use(compression())
일반적으로 프로덕션 웹 애플리케이션의 경우 nginx 또는 lighttpd와 같은 경량 역방향 프록시 뒤에 node.js 앱을 배치하는 것이 좋습니다. 이 설정의 많은 이점 중에서 애플리케이션 소스 코드를 변경하지 않고도 http 압축 또는 tls 압축을 수행하도록 역방향 프록시를 구성 할 수 있습니다.
nginx, lighttpd 또는 varnish와 같은 역방향 프록시를 사용하여 gzip을 사용할 수 있지만. 애플리케이션 수준에서 gzipping과 같은 대부분의 http 최적화를 사용하면 gzip에 대한 자산에 대해 훨씬 세분화 된 접근 방식을 가질 수 있습니다.
나는 실제로 gzippo https://github.com/tomgco/gzippo 라는 expressjs / connect에 대한 자체 gzip 모듈을 만들었지 만 새 작업을 수행합니다. 또한 unix gzip 명령을 생성하는 대신 node-compress를 사용합니다.
Express를 사용하지 않더라도 미들웨어를 사용할 수 있습니다. 압축 모듈은 내가 사용 것입니다 :
var http = require('http')
var fs = require('fs')
var compress = require("compression")
http.createServer(function(request, response) {
var noop = function(){}, useDefaultOptions = {}
compress(useDefaultOptions)(request,response,noop) // mutates the response object
response.writeHead(200)
fs.createReadStream('index.html').pipe(response)
}).listen(1337)
다른 사람들이 nginx
이를 암시 적으로 처리 할 수 있는 프런트 엔드 웹 서버를 사용하여 지적했듯이 또 다른 옵션은 nodejitsu의 우수한 node-http-proxy 를 사용하여 자산을 제공하는 것입니다.
예 :
httpProxy.createServer(
require('connect-gzip').gzip(),
9000, 'localhost'
).listen(8000);
이 예제는 connect 미들웨어 모듈 사용을 통한 gzip 압축 지원을 보여줍니다 : connect-gzip
.
파일을 압축하려면 아래 코드를 사용할 수 있습니다.
var fs = require("fs");
var zlib = require('zlib');
fs.createReadStream('input.txt').pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log("File Compressed.");
동일한 파일의 압축을 풀려면 아래 코드를 사용할 수 있습니다.
var fs = require("fs");
var zlib = require('zlib');
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log("File Decompressed.");
Express, KOA 및 기타를위한 여러 Gzip 미들웨어가 있습니다. 예 : https://www.npmjs.com/package/express-static-gzip
그러나 Node는 gzipping, SSL 종료 등과 같은 CPU 집약적 인 작업을 수행하는 데 매우 좋지 않습니다. 대신 nginx 또는 HAproxy와 같은 '실제'미들웨어 서비스를 사용하십시오. http://goldbergyoni.com/checklist-best- 프로덕션에서 노드 js의 연습 /
오늘 현재, epxress.compress()
이것에 대해 훌륭한 일을하고있는 것 같습니다.
모든 익스프레스 앱에서 this.use(express.compress());
.
나는 개인적으로 특급 위에 기관차를 달리고 있는데 이것은 아름답게 작동한다. Express를 기반으로 구축 된 다른 라이브러리 나 프레임 워크에 대해서는 말할 수 없지만 전체 스택 투명성을 존중하는 한 괜찮습니다.
node와 함께 좋은 날이었고 gzip 없이는 웹 서버를 만들 수 없다고 말하는 것이 옳습니다.
Node.js Wiki의 모듈 페이지에는 많은 옵션이 있습니다. 나는 그들 대부분을 시험해 보았지만 이것이 내가 마침내 사용하는 것입니다.
https://github.com/donnerjack13589/node.gzip
v1.0도 나왔고 지금까지 꽤 안정적이었습니다.
Gzip 압축은 응답 본문의 크기를 크게 줄여 웹 앱의 속도를 높일 수 있습니다. Express 앱에서 gzip 압축을 위해 압축 미들웨어를 사용하십시오. 예를 들면 :
var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())