nginxとnodejsを使用して画像サーバーを構築します

WBOY
リリース: 2023-05-17 10:22:07
オリジナル
673 人が閲覧しました

インターネットの発展に伴い、写真やビデオなどのメディアリソースがますます広く利用されるようになりました。ウェブサイト運営者としては、大量の画像リソースをいかに迅速かつ安定的に提供するかが検討すべき課題となっています。ここでは、nginx と Node.js を使用して画像サーバーを構築し、効率的、高速、信頼性の高い画像サービスを提供するソリューションを紹介します。

1. プランの概要

プランの主なコンポーネントは次のとおりです:

  • nginx を使用して、画像、ビデオなどの静的ファイル サービスを提供しますなど;
  • Node.js を使用して画像を処理し、キャッシュします;
  • Redis メモリ データベースを使用して画像をキャッシュします。

このソリューションでは、nginx が静的ファイル サービスを提供し、Node.js が処理センターとして機能し、画像のスケーリング、トリミング、透かしなどの操作の処理を担当します。同時に、Redis のキャッシュ メカニズムを使用して、Node.js が頻繁に画像を読み取る回数を削減し、画像の処理速度と応答時​​間を向上させます。

2. ソリューションの実装

  1. nginx のインストール

apt-get を通じて nginx をインストールします:

sudo apt-get update
sudo apt-get install nginx
ログイン後にコピー
  1. ノードをインストールします。 js と npm

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>
ログイン後にコピー
  1. Redis をインストールする

apt-get を介して Redis をインストールする:

sudo apt-get update
sudo apt-get install redis-server
ログイン後にコピー
  1. Node.js プロジェクトの作成

プロジェクトのルート ディレクトリに 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 ライブラリは画像キャッシュを処理します。

  1. Node.js コードの記述

プロジェクト ルート ディレクトリに 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 キャッシュ内。

  1. nginx の構成

次の内容を 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. ソリューション効果

上記ソリューションにより、信頼性が高く効率的な映像サービスを実現しました。主な効果は次のとおりです。

  1. 画像サーバーの負荷を軽減し、Web サイトの安定性と信頼性を向上させます。
  2. nginx プロキシ キャッシュと Redis キャッシュ テクノロジを使用すると、画像の処理と送信時間が短縮され、画像サービスの応答速度が向上します。
  3. Node.js アプリケーションをイメージ サービスの処理センターとして使用して、イメージの処理と管理を容易にします。
  4. nginx リバース プロキシと Redis キャッシュを構成することで、キャッシュ雪崩やキャッシュ侵入などの問題が回避され、イメージ サービスの品質と可用性が確保されます。

要約すると、nginx と Node.js を組み合わせたソリューションを使用して、効率的で信頼性の高い画像サーバーを構築し、高品質な画像サービスを実現しながら、Web サイト運営者にさらなる選択肢を提供します。

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

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