NGINX と負荷分散による Node.js アプリケーションのスケーリング
As your Node.js applications grow and receive more traffic, scaling becomes crucial to maintaining performance and stability. In this article, we'll dive into key techniques and tools that help scale your Node.js applications, focusing on NGINX as a reverse proxy and load balancer, as well as other methods for handling high traffic and demand.
In this article, we will cover:
- What is NGINX and why is it important?
- Setting up NGINX as a reverse proxy for Node.js.
- Load balancing with NGINX.
- Caching static content with NGINX.
- Scaling strategies for Node.js applications.
- Real-world use cases for scaling.
What is NGINX and Why is it Important?
NGINX is a high-performance web server known for its capabilities as a reverse proxy, load balancer, and HTTP cache. It efficiently handles large volumes of simultaneous connections, making it an excellent tool for scaling Node.js applications.
Key Features of NGINX:
- Reverse Proxy: It routes incoming client requests to backend servers, helping distribute the load across multiple servers.
- Load Balancing: NGINX balances the incoming traffic across multiple server instances, ensuring that no single server is overwhelmed.
- Caching: It caches static content like images, stylesheets, and scripts, reducing the need to generate the same responses repeatedly.
Setting Up NGINX as a Reverse Proxy for Node.js
A reverse proxy routes client requests to one or more backend servers. Using NGINX as a reverse proxy for your Node.js application can offload tasks such as SSL termination, caching, and load balancing from your application.
Step-by-Step Setup:
-
Install NGINX:
First, install NGINX on your server. On Ubuntu, this can be done using:sudo apt update sudo apt install nginx
ログイン後にコピー Configure NGINX:
Create a new configuration file for your Node.js app in /etc/nginx/sites-available/ directory.
Here's an example configuration file:
server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000; # Your Node.js app proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
-
Enable the Configuration:
Create a symbolic link from sites-available to sites-enabled to enable the configuration:sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
ログイン後にコピー -
Restart NGINX:
Restart NGINX to apply the changes:sudo systemctl restart nginx
ログイン後にコピー
Now, NGINX will forward any incoming requests to your Node.js application running on port 3000. The reverse proxy setup ensures that your Node.js app is isolated from direct client access, adding a layer of security.
Load Balancing with NGINX
When traffic increases, a single Node.js instance might struggle to handle all incoming requests. Load balancing allows traffic to be distributed evenly across multiple instances of your application, improving reliability and performance.
NGINX Load Balancer Setup:
- Modify NGINX Configuration: In the NGINX configuration file, define the backend servers that NGINX will balance requests across: ```nginx upstream node_app { server localhost:3000; server localhost:3001; server localhost:3002; }
server {
listen 80;
server_name yourdomain.com;
location / { proxy_pass http://node_app; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
}
2. **Explanation**: - The `upstream` block defines a pool of Node.js servers running on different ports. - NGINX will distribute incoming requests evenly among these servers. 3. **Load Balancing Algorithms**: By default, NGINX uses a round-robin algorithm to balance traffic. You can specify other load balancing methods such as: - **Least Connections**: Sends requests to the server with the fewest active connections. ```nginx upstream node_app { least_conn; server localhost:3000; server localhost:3001; } ``` 4. **Test and Scale**: You can now test the setup by running multiple instances of your Node.js app on different ports (3000, 3001, 3002, etc.) and monitor how NGINX balances the traffic. ## Caching Static Content with NGINX Caching static content such as images, CSS, and JavaScript files can significantly reduce the load on your Node.js application by serving cached versions of these assets directly from NGINX. ### Caching Setup in NGINX: 1. **Modify Configuration for Caching**: Add caching rules to your server block: ```nginx server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # Caching static content location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; } }
-
Explanation:
- The expires 30d; directive tells NGINX to cache the static files for 30 days.
- This significantly improves the response time for these assets as they are served directly from NGINX without touching the Node.js application.
Scaling Strategies for Node.js Applications
Scaling a Node.js application isn’t just about using NGINX. Below are a few more techniques to ensure that your application scales effectively:
Vertical Scaling
Vertical scaling means upgrading the server's hardware resources, such as increasing the number of CPUs or adding more memory. While this can improve performance in the short term, it's limited by the physical capabilities of the machine.
Horizontal Scaling
Horizontal scaling involves running multiple instances of your application across different servers and balancing the traffic among them using tools like NGINX or a cloud load balancer. This method allows virtually unlimited scaling by adding more instances.
Clustering in Node.js
Node.js can run on multiple cores by using the built-in cluster module. This allows you to utilize all the available CPU cores on a server, increasing throughput.
Example:
const cluster = require('cluster'); const http = require('http'); const os = require('os'); if (cluster.isMaster) { const numCPUs = os.cpus().length; // Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); }); } else { // Workers can share any TCP connection http.createServer((req, res) => { res.writeHead(200); res.end('Hello, world!\n'); }).listen(8000); }
This example shows how to use all CPU cores available on a machine by forking worker processes.
Real-World Use Case: Scaling an E-commerce Website
Problem: An e-commerce website is experiencing high traffic during sales events, leading to slow response times and occasional server crashes.
Solution:
- Use NGINX to distribute traffic across multiple Node.js servers running different instances of the application.
- Cache static assets like product images and JavaScript files with NGINX to reduce load on the server.
- Implement Node.js Clustering to fully utilize the server’s CPU resources.
Outcome: The e-commerce website can now handle thousands of concurrent users without slowdowns, ensuring a smooth user experience during peak traffic times.
Why SSL, Encryption, and Security Matter?
When scaling applications, security should not be overlooked. Implementing SSL (Secure Sockets Layer) ensures that data transmitted between the client and server is encrypted and protected from attacks.
Steps to Enable SSL:
- Obtain an SSL Certificate from a trusted Certificate Authority (CA) like Let's Encrypt.
-
Configure NGINX to use SSL:
server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/ssl/certs/yourdomain.crt; ssl_certificate_key /etc/ssl/private/yourdomain.key; location / { proxy_pass http://localhost:3000; } }
ログイン後にコピー -
Redirect HTTP to HTTPS to ensure all traffic is secure:
server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }
ログイン後にコピー
Conclusion
Scaling a Node.js application is essential as traffic and demand grow. By utilizing NGINX as a reverse proxy and load balancer, you can distribute traffic effectively, cache static assets, and ensure high availability. Combining these techniques with horizontal scaling and Node.js clustering enables your applications to handle massive traffic loads while maintaining performance and stability.
Implement these strategies in your projects to achieve better scalability, improved user experience, and increased uptime.
以上がNGINX と負荷分散による Node.js アプリケーションのスケーリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。
