Nodejsで画像サーバーを構築

王林
リリース: 2023-05-16 20:29:06
オリジナル
820 人が閲覧しました

現代の Web デザインでは、個人の Web サイトでも企業の Web サイトでも、大量の画像リソースが必要になります。したがって、これらの画像リソースを効率的に保存および配布する方法は、多くの Web サイト管理者や開発者が直面する必要がある問題の 1 つとなっています。この場合、効率的な画像サーバーが問題を解決できます。この記事では、nodejsを使って効率的な画像サーバーを構築する方法を紹介します。

  1. 単純な Web サーバーの実装
    Nodejs は、Web アプリケーションを迅速かつスケーラブルに構築できるイベント駆動型の JavaScript ランタイム環境です。この記事では、Nodejs の http モジュールを使用して、単純な Web サーバーを作成します。

次のコードを通じて単純な Web サーバーを作成できます:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello World!');
  res.end();
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});
ログイン後にコピー

上記のコードでは、http モジュールの createServer() メソッドを使用して Web サーバーを作成します。接続 サーバーに到達すると、サーバーは「Hello World!」文字列をクライアントに送信します。この文字列は、サーバーが終了するまでクライアント上に存在します。

  1. 画像サーバーの実装
    画像サーバーの場合、上記のコードを変更し、画像を処理して配布するための特定の関数を追加する必要があります。
const http = require('http');
const fs = require('fs');
const path = require('path');

const server = http.createServer((req, res) => {
  // 获取请求文件的后缀名
  const extname = path.extname(req.url);
  // 如果后缀名是.jpg或.png
  if (extname === '.jpg' || extname === '.png') {
    // 读取文件
    fs.readFile('./images' + req.url, (err, data) => {
      if (err) {
        // 文件不存在,返回404错误
        res.writeHead(404, {'Content-Type': 'text/plain'});
        res.write('404 Not Found');
        res.end();
      } else {
        // 返回文件内容
        res.writeHead(200, {'Content-Type': 'image/jpeg'});
        res.write(data);
        res.end();
      }
    });
  } else {
    // 请求的不是图片,返回404错误
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.write('404 Not Found');
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});
ログイン後にコピー

上記のコードは、Nodejs の fs モジュールを使用して、指定されたディレクトリ内のイメージ ファイルを読み取り、ファイルのバイナリ データをクライアントに返します。画像以外のリソースが要求された場合、404 エラーが返されます。

  1. 画像サーバーのパフォーマンスの最適化
    画像サーバーのパフォーマンスを向上させるために、Nodejs のキャッシュ メカニズムを使用してファイル I/O 操作の数を減らし、それによってアクセスを増やすことができます。スピード。

以下は単純なキャッシュ実装です:

const http = require('http');
const fs = require('fs');
const path = require('path');
const LRU = require('lru-cache');

const cacheOptions = {
  max: 500, // 最多缓存500个对象
  length: (n, key) => n * 2 + key.length, // 缓存对象的大小
  dispose: (key, n) => n.close(), // 执行垃圾回收
  maxAge: 1000 * 60 * 60 // 缓存1小时
};
const imgCache = new LRU(cacheOptions);

const server = http.createServer((req, res) => {
  // 获取请求文件的后缀名
  const extname = path.extname(req.url);
  // 如果后缀名是.jpg或.png
  if (extname === '.jpg' || extname === '.png') {
    // 检查缓存中是否已经有该文件的缓存
    const imgData = imgCache.get(req.url);
    if (imgData) {
      // 直接从缓存中返回文件的二进制数据
      res.writeHead(200, {'Content-Type': `image/${extname.slice(1)}`});
      res.write(imgData, 'binary');
      res.end();
    } else {
      // 如果缓存中没有该文件的缓存,则读取文件并将其添加到缓存中
      fs.readFile('./images' + req.url, 'binary', (err, data) => {
        if (err) {
          // 文件不存在,返回404错误
          res.writeHead(404, {'Content-Type': 'text/plain'});
          res.write('404 Not Found');
          res.end();
        } else {
          // 返回文件内容
          res.writeHead(200, {'Content-Type': `image/${extname.slice(1)}`});
          res.write(data, 'binary');
          res.end();
          // 将文件数据添加到缓存中
          imgCache.set(req.url, data);
        }
      });
    }
  } else {
    // 请求的不是图片,返回404错误
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.write('404 Not Found');
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});
ログイン後にコピー

上記のコードは、Nodejs の LRU キャッシュを使用して、画像ファイルのバイナリ データをキャッシュします。このようにして、複数のクライアントが同じイメージをリクエストした場合、サーバーはイメージ ファイルを 1 回読み取ってキャッシュに追加するだけで済み、後続のリクエストではキャッシュから直接読み込むだけで済み、ファイル I/O が大幅に削減されます。操作が増えるとアクセス速度が向上します。

  1. イメージ サーバーをデプロイして実行する
    イメージ サーバーをデプロイして実行するには、まず、nodejs と npm をインストールしてから、次のコマンドを実行する必要があります:
npm init
npm install http fs path lru-cache --save
node server.js
ログイン後にコピー

このうち、npm init コマンドは package.json ファイルを生成し、npm install コマンドはインストールに必要な依存ライブラリをダウンロードし、node server.js コマンドはイメージ サーバーを実行します。

実際の運用環境では、イメージのアクセス速度と可用性を向上させるために、イメージまたはその他の静的リソースを独立したストレージ デバイスまたは CDN ノードに保存する必要があることに注意してください。

概要:
この記事では、nodejs を使用して効率的な画像サーバーを構築する方法を紹介し、いくつかのパフォーマンス最適化方法を提供します。開発者のお役に立てば幸いです。

以上がNodejsで画像サーバーを構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート