インターネットの発展に伴い、写真やビデオなどのメディアリソースがますます広く利用されるようになりました。ウェブサイト運営者としては、大量の画像リソースをいかに迅速かつ安定的に提供するかが検討すべき課題となっています。ここでは、nginx と Node.js を使用して画像サーバーを構築し、効率的、高速、信頼性の高い画像サービスを提供するソリューションを紹介します。
1. プランの概要
プランの主なコンポーネントは次のとおりです:
このソリューションでは、nginx が静的ファイル サービスを提供し、Node.js が処理センターとして機能し、画像のスケーリング、トリミング、透かしなどの操作の処理を担当します。同時に、Redis のキャッシュ メカニズムを使用して、Node.js が頻繁に画像を読み取る回数を削減し、画像の処理速度と応答時間を向上させます。
2. ソリューションの実装
apt-get を通じて nginx をインストールします:
sudo apt-get update sudo apt-get install nginx
nvm を介して Node.js と npm をインストールする:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash source ~/.bashrc nvm install <node-version>
apt-get を介して Redis をインストールする:
sudo apt-get update sudo apt-get install redis-server
プロジェクトのルート ディレクトリに package.json ファイルを作成し、次の内容を追加します。
{ "name": "image-server", "version": "1.0.0", "description": "An image server based on Node.js", "main": "app.js", "dependencies": { "express": "^4.17.1", "sharp": "^0.28.3", "redis": "^3.0.2" } }
その中に、 Express フレームワークは HTTP リクエストを処理し、Sharp ライブラリは画像処理を処理し、Redis ライブラリは画像キャッシュを処理します。
プロジェクト ルート ディレクトリに app.js ファイルを作成し、次のコードを記述します:
const express = require('express'); const sharp = require('sharp'); const redis = require('redis'); const app = express(); const port = process.env.PORT || 3000; // Connect to Redis const redisClient = redis.createClient(); // Handle image requests app.get('/:path', async (req, res) => { const { path } = req.params; const { w, h, q } = req.query; // Check if the image exists in Redis cache redisClient.get(path, async (err, cachedImage) => { if (cachedImage) { // Serve the cached image res.header('Content-Type', 'image/jpeg'); res.send(cachedImage); } else { // Read the original image const image = sharp(`images/${path}`); // Apply image transforms if (w || h) image.resize(Number(w), Number(h)); if (q) image.jpeg({ quality: Number(q) }); // Convert the image to Buffer const buffer = await image.toBuffer(); // Cache the image in Redis redisClient.set(path, buffer); // Serve the transformed image res.header('Content-Type', 'image/jpeg'); res.send(buffer); } }); }); // Start the server app.listen(port, () => { console.log(`Server is listening on port ${port}`); });
このコード内, まず、RedisClient を使用して Redis サーバーに接続します。リクエストごとに、まずイメージが Redis キャッシュに存在するかどうかを確認します。キャッシュ内に画像がある場合は、キャッシュ内の画像を使用してリクエストに直接応答します。そうでない場合は、Sharp ライブラリのサイズ変更メソッドと jpeg メソッドを使用して画像を処理し、バッファ形式に変換して保存します。 Redis キャッシュ内。
次の内容を nginx 構成ファイル/etc/nginx/nginx.conf に追加します。
http { ... # Set proxy cache path proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m; proxy_cache_key "$scheme$request_method$host$request_uri"; ... server { listen 80; server_name example.com; location /images/ { # Enable proxy cache proxy_cache my_cache; proxy_cache_valid 60m; proxy_cache_lock on; # Proxy requests to Node.js app proxy_pass http://127.0.0.1:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Enable caching of proxied responses proxy_cache_revalidate on; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; } } }
構成ファイル内で、 nginx のリバース プロキシ機能を使用して、後処理のために画像リクエストを Node.js アプリケーションに転送し、画像のキャッシュには Redis を使用しました。同時にnginxのプロキシキャッシュを設定し、キャッシュの有効期間とキャッシュロックを設定しました。これにより、キャッシュなだれやキャッシュ侵入の問題が防止されます。
3. ソリューション効果
上記ソリューションにより、信頼性が高く効率的な映像サービスを実現しました。主な効果は次のとおりです。
要約すると、nginx と Node.js を組み合わせたソリューションを使用して、効率的で信頼性の高い画像サーバーを構築し、高品質な画像サービスを実現しながら、Web サイト運営者にさらなる選択肢を提供します。
以上がnginxとnodejsを使用して画像サーバーを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。