your programing

Node.js 빠른 파일 서버 (HTTP를 통한 정적 파일)

lovepro 2020. 10. 3. 11:23
반응형

Node.js 빠른 파일 서버 (HTTP를 통한 정적 파일)


npmHTTP를 통해 폴더 콘텐츠를 파일 서버로 노출하는 데 도움 이되는 Node.js 즉시 사용 가능한 도구 (와 함께 설치됨 ) 가 있습니까?

예, 내가 가진 경우

D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

그런 다음 시작하여 다음을 D:\Folder\ node node-file-server.js통해 파일에 액세스 할 수 있습니다.

http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

내 노드 정적 파일 서버가 요청을 삭제하는 이유는 무엇입니까? 신비로운 참조

표준 node.js 정적 파일 서버

그러한 도구가 없다면 어떤 프레임 워크를 사용해야합니까?

관련 : NodeJS의 기본 정적 파일 서버


좋은 "바로 사용할 수있는 도구"옵션은 http-server가 될 수 있습니다.

npm install http-server -g

그것을 사용하려면 :

cd D:\Folder
http-server

또는 다음과 같이 :

http-server D:\Folder

확인해보세요 : https://github.com/nodeapps/http-server


준비된 도구를 사용하지 않으려면 https://developer.mozilla.org/en-US/docs/Node_server_without_framework 에서 저에게 설명 된대로 아래 코드를 사용할 수 있습니다 .

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

업데이트 외부 요구 / 파일에서 서버에 액세스해야하는 경우 여기에 이전 답변 에서 언급했듯이 아래를 작성하여 node.js 파일에서 CORS를 극복해야합니다 .

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

최신 정보

Adrian이 언급했듯이 주석에서 그는 여기에 전체 설명과 함께 ES6 코드를 작성했습니다 . 어떤 이유로 든 원래 사이트에서 코드가 사라진 경우를 대비하여 아래에 그의 코드를 다시 게시했습니다.

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extention. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extention to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extention
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });


}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);

NodeJS 스크립트 내에서 실행 가능한 서버를 원하는 사람들을 위해 :

다음 을 대체 하는 expressjs / serve-static사용할 수 있습니다 connect.static(연결 3에서 더 이상 사용할 수 없음).

myapp.js:

var http = require('http');

var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

그런 다음 명령 줄에서 :

  • $ npm install finalhandler serve-static
  • $ node myapp.js

Node가 아니라는 것을 알고 있지만 Python의 SimpleHTTPServer를 사용했습니다.

python -m SimpleHTTPServer [port]

잘 작동하며 Python과 함께 제공됩니다.


connect 는 당신이 찾고있는 것일 수 있습니다.

다음으로 쉽게 설치 :

npm install connect

그런 다음 가장 기본적인 정적 파일 서버를 다음과 같이 작성할 수 있습니다.

var connect = require('connect'),
    directory = '/path/to/Folder';

connect()
    .use(connect.static(directory))
    .listen(80);

console.log('Listening on port 80.');

npm을 사용하여 Express 설치 : https://expressjs.com/en/starter/installing.html

다음 콘텐츠를 사용하여 index.html과 동일한 수준에서 server.js라는 파일을 만듭니다.

var express = require('express');
var server = express();
server.use('/', express.static(__dirname + '/'));
server.listen(8080);

다른 위치에 넣으려면 세 번째 줄에 경로를 설정하십시오.

server.use('/', express.static(__dirname + '/public'));

파일이있는 폴더에 CD를 넣고 다음 명령을 사용하여 콘솔에서 노드를 실행합니다.

node server.js

localhost : 8080으로 이동합니다.


데모 / 프로토 서버 전용

이것이 필요한 전부라면 다음을 시도하십시오.

const http = require('http');
const fs = require('fs');
const port = 3000;
const app = http.createServer((req,res) => {
    res.writeHead(200);
    if (req.url === '/') req.url = '/index.html'; // courtesy of @JosephCho
    res.end(fs.readFileSync(__dirname + req.url));
});

app.listen(port);

참고 : 주소의 일부로 "/index.html"을 사용해야합니다. 즉 " http : // localhost : 3000 / index.html "


약속 대신 One-line ™ 증명

여기에 이미지 설명 입력

첫 번째는 http-server, hs- 링크

npm i -g http-server   // install
hs C:\repos            // run with one line?? FTW!!

두 번째는 serveZEIT.co입니다- 링크

npm i -g serve         // install
serve C:\repos         // run with one line?? FTW!!

이것이 결정에 도움이되는 경우 다음 옵션을 사용할 수 있습니다.

C : \ Users \ Qwerty> http-server --help
사용법 : http-server [경로] [옵션]

옵션 :
  -p 사용할 포트 [8080]
  -a 사용할 주소 [0.0.0.0]
  -d 디렉토리 목록 표시 [true]
  -i autoIndex 표시 [true]
  -g --gzip 가능한 경우 gzip 파일 제공 [false]
  -e --ext 제공되지 않은 경우 기본 파일 확장자 [없음]
  -s --silent 출력에서 ​​로그 메시지를 표시하지 않습니다.
  --cors [= headers] "Access-Control-Allow-Origin"헤더를 통해 CORS 활성화
                     선택적으로 쉼표로 구분 된 CORS 헤더 목록 제공
  -o [경로] 서버 시작 후 브라우저 창 열기
  -c 캐시 시간 (max-age) (초) [3600], 예 : 10 초 동안 -c10.
               캐싱을 비활성화하려면 -c-1을 사용합니다.
  -U --utc 로그 메시지에 UTC 시간 형식을 사용합니다.

  -P --proxy 요청을 해결할 수없는 경우 대체 프록시입니다. 예 : http://someurl.com

  -S --ssl https를 활성화합니다.
  -C --cert ssl cert 파일의 경로 (기본값 : cert.pem).
  -K --key SSL 키 파일에 대한 경로 (기본값 : key.pem).

  -r --robots /robots.txt에 응답 [User-agent : * \ n 금지 : /]
  -h --help이 목록을 인쇄하고 종료합니다.
C : \ Users \ Qwerty> serve --help

  사용법 : serve.js [옵션] [명령]

  명령어 :

    도움말 표시 도움말

  옵션 :

    -a, --auth 기본 인증 뒤에 제공
    -c, --cache 브라우저에서 파일을 캐싱하는 데 걸리는 시간 (밀리 초)
    -n, --clipless 주소를 클립 보드에 복사하지 않음 (기본적으로 비활성화 됨)
    -C, --cors 설정 * 모든 출처의 요청을 허용하는 CORS 헤더 (기본적으로 비활성화 됨)
    -h, --help 사용 정보 출력
    -i, --ignore 무시할 파일 및 디렉토리
    -o, --open 브라우저에서 로컬 주소 열기 (기본적으로 비활성화 됨)
    -p, --port 수신 할 포트 (기본값은 5000)
    -S, --silent 콘솔에 아무것도 기록하지 않습니다.
    -s, --single 단일 페이지 애플리케이션 제공 (`-c`를 1 일로 설정)
    -t, --treeless 정적 트리를 표시하지 않음 (기본적으로 비활성화 됨)
    -u, --unzipped GZIP 압축 비활성화
    -v, --version 버전 번호 출력

변경 사항을 지켜봐야하는 경우 hostr, Henry Tseng의 답변을 참조하십시오 .


꽤 좋은 또 다른 정적 웹 서버가 있습니다 : 브라우저 동기화.

노드 패키지 관리자를 사용하여 다운로드 할 수 있습니다.

npm install -g browser-sync

설치 후 cmd 프롬프트에서 프로젝트 폴더로 이동하여 다음을 실행하십시오.

browser-sync start --server --port 3001 --files="./*"

브라우저의 현재 폴더에있는 모든 파일을 제공하기 시작합니다.

BrowserSync 에서 더 많은 것을 찾을 수 있습니다.

감사.


이 페이지의 답변 중 어느 것도 운이 좋지 않았지만 아래는 트릭을 수행하는 것 같습니다.

server.js다음 내용이 있는 파일을 추가하십시오 .

const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const app = express()

// serve static assets normally
app.use(express.static(__dirname + '/dist'))

// handle every other route with index.html, which will contain
// a script tag to your application's JavaScript file(s).
app.get('*', function (request, response){
  response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})

app.listen(port)
console.log("server started on port " + port)

또한 필요한지 확인하십시오 express. 실행 yarn add express --save하거나 npm install express --save설정에 따라 ( yarn매우 빠르다고 추천 수 있습니다 ).

dist콘텐츠를 제공하는 폴더로 변경할 수 있습니다 . 내 간단한 프로젝트의 경우 폴더에서 제공하지 않았으므로 dist파일 이름을 제거했습니다 .

그런 다음 실행할 수 있습니다 node server.js. 프로젝트를 Heroku 서버에 업로드해야했기 때문에 package.json파일에 다음을 추가해야했습니다 .

  "scripts": {
    "start": "node server.js"
  }

Express 프레임 워크 를 사용하는 경우이 기능을 바로 사용할 수 있습니다.

간단한 파일 제공 앱을 설정하려면 다음을 수행하십시오.

mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express

다음 은 Linux / Unix / macOS 터미널 ( 또는 Android의 termux ) node.js (또는 nodejs-legacyDebian / Ubuntu)가 설치된 경우 :

curl pad.js.org | node 

(문서에 Windows 사용자를위한 다른 명령이 있습니다.)

유용하다고 생각되는 여러 가지를 지원합니다.

  • 계층 적 디렉토리 색인 생성 / 제공
    • 다양한 기준에 따른 정렬 기능
    • Chrome, Firefox 및 기타 브라우저에서 [다중 파일] 드래그 앤 드롭 및 파일 / 텍스트 전용 복사-붙여 넣기 및 시스템 클립 보드 스크린 샷 붙여 넣기를 통해 브라우저에서 업로드 할 수있는 몇 가지 제한이있을 수 있습니다 (명령 줄로 끌 수 있음). 제공하는 옵션)
    • 폴더 / 노트 작성 / 업로드 버튼
  • 잘 알려진 파일 유형에 대해 올바른 MIME 제공 (사용 중지 가능성 포함)
  • npm 패키지 및 로컬 도구로 설치 또는 Docker를 사용하여 영구 서비스로 단일 선형 설치 가능
  • 빠른 전송을위한 HTTP 206 파일 제공 (멀티 파트 파일 전송)
  • 터미널 및 브라우저 콘솔에서 업로드 (사실 원래 다른 페이지 / 도메인에있는 브라우저의 JS 콘솔을위한 파일 시스템 프록시로 의도되었습니다)
  • CORS 다운로드 / 업로드 (사용 중지 할 수도 있음)
  • 간편한 HTTPS 통합
  • 더 나은 보안 제공을위한 경량 명령 줄 옵션 :
    • node.js 8의 패치를 사용하면 먼저 설치하지 않고도 옵션에 액세스 할 수 있습니다.curl pad.js.org | node - -h
    • 또는 먼저 시스템 전역 npm 패키지로 [sudo] npm install -g pad.js설치 한 다음 설치된 버전을 사용하여 옵션에 액세스 할 수 있습니다.pad -h
    • 또는 기본적으로 비교적 안전한 옵션을 사용하는 제공된 Docker 이미지를 사용하십시오. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

도구를 사용한 폴더 색인 스크린 샷

위에서 설명한 기능은 대부분 http://pad.js.org 도구의 기본 페이지에 문서화되어 있습니다.이 도구 는 내가 사용한 멋진 트릭으로 도구 소스 자체도 제공되는 곳이기도합니다!

도구 소스는 피드백, 기능 요청 및 ⭐s를 환영 하는 GitHub있습니다 !


노드를 사용하여 정적 리소스를 제공하는 성능을 향상 시키려면 Buffet을 사용하는 것이 좋습니다 . 캐싱 HTTP 역방향 프록시라고도하는 웹 애플리케이션 가속기와 유사하게 작동하지만 선택한 디렉토리를 메모리에로드하기 만합니다.

Buffet은 완전히 버퍼링 된 접근 방식을 사용합니다. 모든 파일은 앱이 부팅 될 때 메모리에 완전히로드되므로 파일 시스템이 타는듯한 느낌이 들지 않습니다. 실제로 이것은 매우 효율적입니다. Varnish를 앱 앞에두면 속도가 느려질 수도 있습니다! 

codePile 사이트에서이를 사용하고 1k 동시 사용자 연결로드에서 25 개의 리소스를 다운로드하는 페이지에서 ~ 700 개 요청 / 초가> 4k 요청 / 초로 증가한 것을 발견했습니다.

예:

var server = require('http').createServer();

var buffet = require('buffet')(root: './file'); 

 

server.on('request', function (req, res) {

  buffet(req, res, function () {

    buffet.notFound(req, res);

  });

});

 

server.listen(3000, function () {

  console.log('test server running on port 3000');

});

해당 링크를 살펴보십시오 .

의 익스프레스 모듈 만 설치하면 node js됩니다.

var express = require('express');
var app = express();

app.use('/Folder', express.static(__dirname + '/Folder'));

http : //hostname/Folder/file.zip 과 같은 파일에 액세스 할 수 있습니다 .


당신은 서브 미 를 시도 수 있습니다

사용은 매우 쉽습니다.

ServeMe = require('serve-me')();
ServeMe.start(3000);

그게 다야.

PD : 기본적으로 제공되는 폴더는 "공용"입니다.


여기 또 다른 간단한 웹 서버가 있습니다.

https://www.npmjs.com/package/hostr

설치

npm install -g hostr

실무 이사 변경

cd myprojectfolder/

그리고 시작

hostr

아직 NPM에는 없지만 양식 제출을 수락하고 트랜잭션 이메일 서비스를 통해 이메일을 보낼 수있는 간단한 정적 서버를 Express에 구축했습니다 (현재는 Sendgrid, Mandrill 출시).

https://github.com/jdr0dn3y/nodejs-StatServe


검색 자의 이익을 위해 Jakub g의 답변을 좋아했지만 약간의 오류 처리를 원했습니다. 분명히 오류를 올바르게 처리하는 것이 가장 좋지만 오류가 발생하는 경우 사이트가 중지되는 것을 방지하는 데 도움이됩니다. 아래 코드 :

var http = require('http');
var express = require('express');

process.on('uncaughtException', function(err) {
  console.log(err);
});

var server = express();

server.use(express.static(__dirname));

var port = 10001;
server.listen(port, function() { 
    console.log('listening on port ' + port);     
    //var err = new Error('This error won't break the application...')
    //throw err
});

먼저 npm install node-static -g-g 를 통해 노드 정적 서버를 설치하는 것은 시스템에 전역 적으로 설치 한 다음 파일이있는 디렉토리로 이동하고 static포트 8080에서 수신 대기 하는 서버를 시작 하고 브라우저에 naviaget을 입력하고 localhost : 8080 / yourhtmlfilename을 입력합니다. .


const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');


let mimeTypes = {
  '.html': 'text/html',
  '.css': 'text/css',
  '.js': 'text/javascript',
  '.jpg': 'image/jpeg',
  '.png': 'image/png',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml',
  '.eot': 'appliaction/vnd.ms-fontobject',
  '.ttf': 'aplication/font-sfnt'
};



http.createServer(function (request, response) {
  let pathName = url.parse(request.url).path;
  if(pathName === '/'){
    pathName = '/index.html';
  }
  pathName = pathName.substring(1, pathName.length);
  let extName = path.extName(pathName);
  let staticFiles = `${__dirname}/template/${pathName}`;

      if(extName =='.jpg' || extName == '.png' || extName == '.ico' || extName == '.eot' || extName == '.ttf' || extName == '.svg')
      {
          let file = fr.readFileSync(staticFiles);
          res.writeHead(200, {'Content-Type': mimeTypes[extname]});
          res.write(file, 'binary');
          res.end();
      }else {
        fs.readFile(staticFiles, 'utf8', function (err, data) {
          if(!err){
            res.writeHead(200, {'Content-Type': mimeTypes[extname]});
            res.end(data);
          }else {
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf8'});
            res.write(`<strong>${staticFiles}</strong>File is not found.`);
          }
          res.end();
        });
      }
}).listen(8081);


NPM 레지스트리 https://npmjs.org/search?q=server 에서 검색하면 static-server https://github.com/maelstrom/static-server를 찾았습니다.

동료에게 파일을 보내야했지만 100MB의 짐승에게 이메일을 보내는 데 귀찮게 할 수 없습니까? 간단한 예제 JavaScript 애플리케이션을 실행하고 싶지만 file : /// 프로토콜을 통해 실행하는 데 문제가 있습니까? Samba 나 FTP를 설정하지 않고 LAN에서 미디어 디렉토리를 공유하고 싶습니까? 그러면이 파일 서버가 당신의 삶을 조금 더 쉽게 만들어 줄 것입니다.

간단한 정적 물건 서버를 설치하려면 npm을 사용하십시오.

npm install -g static-server

그런 다음 파일 또는 디렉토리를 제공하려면 다음을 실행하십시오.

$ serve path/to/stuff
Serving path/to/stuff on port 8001

폴더 내용을 나열 할 수도 있습니다.

불행히도 파일을 제공 할 수 없습니다. :)


연결을 사용하는 간단한 정적 서버

var connect = require('connect'),
  directory = __dirname,
  port = 3000;

connect()
  .use(connect.logger('dev'))
  .use(connect.static(directory))
  .listen(port);

console.log('Listening on port ' + port);

간단한 웹 서버로 node.js 사용을 참조하십시오.


개발 작업의 경우 (express 4) https://github.com/appsmatics/simple-httpserver.git를 사용할 수 있습니다.


전제 조건없이 초경량 http 서버에 관심이 있다면 다음을 살펴보아야합니다. mongoose


이를 위해 NPM 서브 패키지를 사용할 수 있습니다 . NodeJS가 필요하지 않은 경우 빠르고 사용하기 쉬운 도구입니다.

1-PC에 패키지 설치 :

npm install -g serve

2-다음을 사용하여 정적 폴더 제공 serve <path>:

d:> serve d:\StaticSite

정적 폴더가 제공되는 포트를 표시합니다. 다음과 같이 호스트로 이동하면됩니다.

http://localhost:3000

아래는 나를 위해 일했습니다.

app.js아래 내용 으로 파일 만듭니다 .

// app.js

var fs = require('fs'),
    http = require('http');

http.createServer(function (req, res) {
  fs.readFile(__dirname + req.url, function (err,data) {
    if (err) {
      res.writeHead(404);
      res.end(JSON.stringify(err));
      return;
    }
    res.writeHead(200);
    res.end(data);
  });
}).listen(8080);

index.html아래 내용 으로 파일 만듭니다 .

Hi

명령 줄을 시작합니다.

cmd

아래에서 실행 cmd:

node app.js

Chrome에서 URL 아래로 이동 :

http://localhost:8080/index.html

그게 다야. 도움이 되었기를 바랍니다.

출처 : https://nodejs.org/en/knowledge/HTTP/servers/how-to-serve-static-files/


저는 휴스턴을 직장과 개인 프로젝트에 사용합니다.

https://github.com/alejandro/Houston


또한 요청이 감소하는 이유를 물었습니다. 귀하의 경우 특정 이유가 무엇인지 확실하지 않지만 노드가 실제로이 네트워킹 패턴에 최적화되지 않았기 때문에 전체적으로 전용 미들웨어 (nginx, S3, CDN)를 사용하여 더 나은 서버 정적 콘텐츠를 제공합니다. 자세한 설명은 여기 (글 머리 기호 13)를 참조하십시오. http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/


Node.js의 작은 명령 줄 웹 서버 : miptleha-http

전체 소스 코드 (80 줄)

참고 URL : https://stackoverflow.com/questions/16333790/node-js-quick-file-server-static-files-over-http

반응형