Node.js : Gzip 압축?


90

Node.js가 gzip 압축을하지 않고 gzip 압축을 수행 할 모듈이 없다는 사실을 잘못 알고 있습니까? 압축이없는 웹 서버를 누구나 어떻게 사용할 수 있습니까? 내가 여기서 무엇을 놓치고 있습니까? 서버 측 사용을 위해 알고리즘을 JavaScript로 이식해야합니까?

답변:


74

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);

1
Internet Explorer에서 'createDeflate'대신 'createDeflateRaw'를 사용하여 해결 한 zlib 헤더가 마음에 들지 않는 문제가 발생했습니다
mark

60

당신이 사용하는 경우 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 을 확인하십시오 .


3
댓글없이 반대 투표 하시겠습니까? 이유를 알려 주시고 답변을 개선 할 수 있기를 바랍니다. 또는 자유롭게 편집하십시오.
Milimetric

2
This middleware should be placed "high" within the stack to ensure all responses may be compressed. 이것이 당신의 경로와 정적 핸들러 위에 있는지 확인
ankitjaininfo

14
이제부터 express.compress미들웨어 (connect 3.0 <에서 상 속됨)는 더 이상 connect 3.0 <을 포함하지 않기 때문에 더 이상 사용되지 않습니다 (express 4.0부터). 미들웨어를 얻으려면 github.com/expressjs/compression 을 확인하십시오 .
Ciro Costa

2
"Why not, man ?!"로이 페이지의 원시 http와 express 프레임 워크를 비교 한 그래프가 이유를 제공 할 수 있습니다. express는 약간 느려집니다. raygun.io/blog/2015/02/node-js-performance-node-js-vs-io-js
ejfrancis

:) 그것은 뺨에 약간의 혀를 의미했습니다. 나는 실제로 표현하는 것을 좋아하지 않습니다. 더 많은 일을하고 싶었고 훨씬 더 다듬 었습니다. 그러나 다른 무언가가 그것을 가릴 때까지 내가 생각하기에 충분합니다.
Milimetric

43

1- 압축 설치

npm install compression

2- 그것을 사용하십시오

var express     = require('express')
var compression = require('compression')

var app = express()
app.use(compression())

Github에서 압축


1
static assest가 gzip인지 확인하는 방법!
Rizwan Patel

내 이미지는 gzip으로 압축되지 않아요
Jeson 디아스을

실제로 큰 JS / CSS 파일이나 큰 JSON 파일을 보낼 때이 미들웨어를 사용해야합니다.이 미들웨어를 사용하는 것은 이점을 제공하지 않고 대신 더 많은 CPU 리소스를 소비합니다. @JesonDias
Shyam

@JesonDias JPEG는 이미 gzip보다 이미지에 대해 훨씬 더 잘 작동하는 압축 알고리즘을 포함하고 있기 때문에 이미지를 gzip해서는 안됩니다. gzip은 텍스트 기반 항목에 더 적합합니다.
user3413723

33

일반적으로 프로덕션 웹 애플리케이션의 경우 nginx 또는 lighttpd와 같은 경량 역방향 프록시 뒤에 node.js 앱을 배치하는 것이 좋습니다. 이 설정의 많은 이점 중에서 애플리케이션 소스 코드를 변경하지 않고도 http 압축 또는 tls 압축을 수행하도록 역방향 프록시를 구성 할 수 있습니다.


노드가 정적 파일을 제공하지 않도록하고, 프록시가 압축을 처리하도록하고, prod-env에서 모범 사례임을 확인하십시오. 어쨌든 포트 80에서 노드를 실행하는 루트 usr를 피하기 위해 nginx 또는 lighty를 사용할 수 있습니다.
ezmilhouse

사용법에 따라 이것이 정답이라고 생각합니다.
prasanthv

프록시를하더라도 @ezmilhouse, 당신의 Node.js를 서버 아직도하는 역할을 프록시에 그 정적 파일을, 심지어 동일한 시스템 내부의 파이프에 대역폭을 낭비 할 이유가 없습니다.
BT

8

nginx, lighttpd 또는 varnish와 같은 역방향 프록시를 사용하여 gzip을 사용할 수 있지만. 애플리케이션 수준에서 gzipping과 같은 대부분의 http 최적화를 사용하면 gzip에 대한 자산에 대해 훨씬 세분화 된 접근 방식을 가질 수 있습니다.

나는 실제로 gzippo https://github.com/tomgco/gzippo 라는 expressjs / connect에 대한 자체 gzip 모듈을 만들었지 만 새 작업을 수행합니다. 또한 unix gzip 명령을 생성하는 대신 node-compress를 사용합니다.


3
이제 작은 node.js 웹 서버에서 gzippo를 사용하고 있습니다.
bosgood

1
gzip이 정적 자산에 적용되었는지 확인하는 방법은 무엇입니까?
Rizwan Patel

4

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)

3

다른 사람들이 nginx이를 암시 적으로 처리 할 수 있는 프런트 엔드 웹 서버를 사용하여 지적했듯이 또 다른 옵션은 nodejitsu의 우수한 node-http-proxy 를 사용하여 자산을 제공하는 것입니다.

예 :

httpProxy.createServer(
 require('connect-gzip').gzip(),
 9000, 'localhost'
).listen(8000);

이 예제는 connect 미들웨어 모듈 사용을 통한 gzip 압축 지원을 보여줍니다 : connect-gzip.


3

파일을 압축하려면 아래 코드를 사용할 수 있습니다.

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.");

이 답변에서 설명 텍스트를보고 싶습니다! 코드 조각이 질문에 답할 수 있지만 TO 및 나머지 지역에 대한 설명을 포함 하여 질문에 대답하는 이유 를 이해 하는 것이 좋습니다.
Clijsters

2

어떻게 약 ?

node-compress
node.js 용 스트리밍 압축 / gzip 모듈
설치하려면 libz가 설치되어 있는지 확인하고 다음을 실행합니다.
node-waf configure
node-waf build
그러면 compress.node 바이너리 모듈이 build / default에 배치됩니다.
...



2

오늘 현재, epxress.compress()이것에 대해 훌륭한 일을하고있는 것 같습니다.

모든 익스프레스 앱에서 this.use(express.compress());.

나는 개인적으로 특급 위에 기관차를 달리고 있는데 이것은 아름답게 작동한다. Express를 기반으로 구축 된 다른 라이브러리 나 프레임 워크에 대해서는 말할 수 없지만 전체 스택 투명성을 존중하는 한 괜찮습니다.


2
이것은 실제로 새로운 정보가 없습니다.이 답변과 중복됩니다. stackoverflow.com/a/14341423/1355166
gcochard

1

node와 함께 좋은 날이었고 gzip 없이는 웹 서버를 만들 수 없다고 말하는 것이 옳습니다.

Node.js Wiki의 모듈 페이지에는 많은 옵션이 있습니다. 나는 그들 대부분을 시험해 보았지만 이것이 내가 마침내 사용하는 것입니다.

https://github.com/donnerjack13589/node.gzip

v1.0도 나왔고 지금까지 꽤 안정적이었습니다.


귀하의 의견이 약간 오해의 소지가 있다고 생각합니다. gzip은 최신 웹 애플리케이션에서 일반적이지만 반드시 필요한 것은 아닙니다 . 나는 그것을 사용하지 않는 것이 완벽하고 표준을 준수한다고 생각합니다.
Simon East

1

gzip 압축 사용

Gzip 압축은 응답 본문의 크기를 크게 줄여 웹 앱의 속도를 높일 수 있습니다. Express 앱에서 gzip 압축을 위해 압축 미들웨어를 사용하십시오. 예를 들면 :

var compression = require('compression');
var express = require('express')
var app = express()
app.use(compression())

클라이언트 크기에서 응답 크기의 압축을 풀어야합니까?
Siddharth Sunchu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.