現代の Web デザインでは、個人の Web サイトでも企業の Web サイトでも、大量の画像リソースが必要になります。したがって、これらの画像リソースを効率的に保存および配布する方法は、多くの Web サイト管理者や開発者が直面する必要がある問題の 1 つとなっています。この場合、効率的な画像サーバーが問題を解決できます。この記事では、nodejsを使って効率的な画像サーバーを構築する方法を紹介します。
次のコードを通じて単純な 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!」文字列をクライアントに送信します。この文字列は、サーバーが終了するまでクライアント上に存在します。
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 エラーが返されます。
以下は単純なキャッシュ実装です:
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 が大幅に削減されます。操作が増えるとアクセス速度が向上します。
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 サイトの他の関連記事を参照してください。