سرور TCP مبتنی بر Node.js با استفاده از PM2 و Nginx — راهنمای ساخت اپلیکیشن از صفر تا صد

۳۱۸ بازدید
آخرین به‌روزرسانی: ۱۳ شهریور ۱۳۹۷
زمان مطالعه: ۱۲ دقیقه
سرور TCP مبتنی بر Node.js با استفاده از PM2 و Nginx — راهنمای ساخت اپلیکیشن از صفر تا صد

Node.js یک محیط اجرای جاوا اسکریپت اوپن‌سورس محبوب است که بر مبنای موتور جاوا اسکریپت V8 کروم ساخته شده است. Node.js برای ساخت برنامه‌های سمت سرور و شبکه‌ای استفاده می‌شود. TCP (پروتکل کنترل انتقال) یک پروتکل شبکه است که امکان ارسال پایدار جریان داده‌ای، مرتب و با بررسی خطا را بین اپلیکیشن‌های مختلف ایجاد کرده است. یک سرور TCP می‌تواند درخواست اتصال TCP را بپذیرد و زمانی که اتصال بین دو طرف برقرار شد، جریان‌های داده را مبادله کند.

در این راهنما یک سرور TCP مبتنی بر Node.js همراه با یک کلاینت برای تست سرور می‌سازیم. سروری که ساخته‌ایم را به وسیله یک نرم‌افزار مدیریت پروسه قدرتمند به نام PM2 به عنوان یک پروسه پس‌زمینه اجرا می‌کنیم. سپس انجین‌ایکس را به عنوان یک پراکسی معکوس برای اپلیکیشن TCP پیکربندی می‌کنیم و اتصال سمت کلاینت را از روی رایانه محلی تست می‌کنیم.

پیش‌نیازها

برای تکمیل کردن این فهرست به موارد زیر نیاز داریم:

  • یک سرور اوبونتو 16.04 که دارای یک کاربر غیر root با دسترسی sudo و فایروال پیکربندی شده باشد.
  • Nginx را بر روی سرور خود نصب می‌کنیم. این نصب باید همراه با گزینه with-stream-- باشد که در نصب‌های اولیه انجین‌ایکس از طریق نرم‌افزار مدیریت بسته apt در اوبونتو 16.04 به طور پیش‌فرض وجود دارد.
  • Node.js را با استفاده از PPA رسمی نصب می‌کنیم.

گام 1: ایجاد یک اپلیکیشن TCP مبتنی بر Node.js

ما یک اپلیکیشن Node.js را با استفاده از سوکت‌های TCP می‌نویسیم. این یک برنامه ساده است که به شما کمک می‌کند تا کتابخانه Net را در Node.js بهتر درک کنید و بتوانید اپلیکیشن‌های سرور و کلاینت TCP را بنویسید.

برای شروع یک دایرکتوری روی سروری که می‌خواهید اپلیکیشن خود را قرار دهید ایجاد کنید. در این راهنما ما اپلیکیشن خود را در دایرکتوری tcp-nodejs-app/~ قرار می‌دهیم:

mkdir ~/tcp-nodejs-app

سپس به دایرکتوری جدید بروید:

cd ~/tcp-nodejs-app

یک فایل به نام package.json برای پروژه خود انتخاب کنید. در این فایل همه بسته‌هایی که اپلیکیشن نیاز دارد فهرست شده‌اند. ایجاد این فایل باعث می‌شود که build شما قابل تولید مجدد باشد و بدین ترتیب اشتراک این فهرست از وابستگی‌ها با توسعه‌دهندگان دیگر آسان‌تر خواهد بود:

nano package.json

همچنین می‌توانید بسته package.json را با استفاده از دستور npm init ایجاد کنید که از شما می‌خواهد جزییات اپلیکیشن را ذکر کنید. با این وجود همچنان مجبور هستیم در ادامه فایل را به صورت دستی ویرایش کنیم تا امکان افزودن تکه‌های دیگر شامل دستورهای راه‌اندازی اولیه را داشته باشیم. از این رو در این راهنما، این فایل را به طور دستی ایجاد می‌کنیم.

کد JSON زیر را که نام اپلیکیشن، نسخه، فایل اصلی (main)، دستور آغاز برنامه و لایسنس اپلیکیشن را در خود جای داده، به فایل اضافه کنید:

{

"name": "tcp-nodejs-app",

"version": "1.0.0",

"main": "server.js",

"scripts": {

"start": "node server.js"

},

"license": "MIT"

}

در فیلد scripts می‌توانید دستوراتی برای اپلیکیشن تعریف کنید. تنظیماتی که در اینجا تعیین می‌کنیم به ما امکان می‌دهد که به جای اجرای دستور node server.js بتوانیم با اجرای دستور npm start برنامه خود را اجرا کنیم.

فایل package.json می‌تواند شامل فهرستی از وابستگی‌های زمان اجرا و توسعه نیز باشد؛ اما هیچ وابستگی شخص ثالث برای این اپلیکیشن وجود ندارد.

اینک که دایرکتوری پروژه و فایل package.json را تنظیم کردیم، می‌توانیم به مراحل ساخت سرور بپردازیم. در دایرکتوری اپلیکیشن یک فایل به نام server.js بسازید:

nano server.js

Node.js ماژولی به نام net دارد که امکان ارتباط بین سرور و اپلیکیشن را با پروتکل TCP ایجاد می‌کند. ماژول net را با دستور ()require بارگذاری کنید و سپس متغیرهایی که پورت و هاست سرور را تعیین می‌کنند، تعریف نمایید:

const net = require('net');

const port = 7070;

const host = '127.0.0.1';

ما در این برنامه از پورت 7070 استفاده می‌کنیم؛ اما شما می‌توانید هر پورتی که در دسترس است را تعیین کنید. همچنین در این فایل از آی‌پی 127.0.0.1 برای متغیر HOST استفاده کرده‌ایم تا مطمئن باشیم که سرور ما تنها به رابط شبکه محلی گوش می‌دهد. در ادامه Nginx را در جلوی این اپلیکیشن قرار می‌دهیم تا به عنوان یک پراکسی معکوس عمل کند. Nginx عملکرد مناسبی در مدیریت اتصال‌های چندگانه و مقیاس‌بندی افقی دارد.

سپس کد زیرا به فایل اضافه می‌کنیم تا یک سرور TCP را با استفاده از تابع ()createServer از ماژول net بسازیم. در این مرحله با استفاده از تابع ()listen در ماژول net می‌توانیم از سرور بخواهیم که درهاست و پورت تعریف شده شروع به گوش دادن اتصال‌های ورودی بکند.

...

const server = net.createServer();

server.listen(port, host, () => {

console.log('TCP Server is running on port ' + port +'.');

});

فایل server.js را ذخیره کرده و سرور را آغاز کنید:

npm start

خروجی زیرا مشاهده می‌کنید:

TCP Server is running on port 7070

سرور TCP بر روی پورت 7070 فعال شده است. با زدن دکمه‌های CTRL+C سرور را متوقف کنید. اینک که می‌دانیم سرور در حال گوش دادن است، می‌توانیم کدی را بنویسیم تا اتصال‌ها را مدیریت کنیم.

زمانی که یک کلاینت به سرور متصل می‌شود، این سرور یک رویداد connection را فعال می‌کند که در ادامه بیشتر در موردش صحبت می‌کنیم. در این مرحله یک آرایه از کلاینت‌های اتصال یافته تعریف می‌کنیم که آن را sockets نامگذاری می‌کنیم و هر وهله از کلاینت که به سرور وصل می‌شود را به این آرایه اضافه می‌کنیم.

ما از رویداد data برای پردازش جریان داده‌ای از کلاینت‌های اتصال یافته استفاده می‌کنیم و از آرایه sockets برای انتشار داده‌ها به همه کلاینت‌های اتصال یافته بهره می‌گیریم.

کد زیر را به فایل server.js اضافه کنید تا این ویژگی‌ها را پیاده‌سازی کند:

...

let sockets = [];

server.on('connection', function(sock) {

console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

sockets.push(sock);

sock.on('data', function(data) {

console.log('DATA ' + sock.remoteAddress + ': ' + data);

// Write the data back to all the connected, the client will receive it as data from the server

sockets.forEach(function(sock, index, array) {

sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');

});

});

});

کد فوق به سرور می‌گوید که به رویدادهای data ارسالی از سوی کلاینت‌های اتصال یافته گوش دهد. زمانی که کلاینتِ متصل، هر نوع از داده را به سرور ارسال می‌کند، ما آن را از طریق تعریف حلقه‌ای روی آرایه sockets به همه کلاینت‌های اتصال یافته باز می‌گردانیم.

سپس یک دستگیره (handler) برای رویدادهای close که هنگام خاتمه یافتن اتصال کلاینت فعال می‌شوند، ایجاد می‌کنیم. هر زمان که یک کلاینت اتصال خود را قطع کند، باید آن کلاینت را از آرایه sockets حذف کنیم تا دیگر پیام‌ها به آن کلاینت ارسال نشوند. کد زیر را به انتهای بلوک اتصال اضافه کنید:

let sockets = [];

server.on('connection', function(sock) {

...

// Add a 'close' event handler to this instance of socket

sock.on('close', function(data) {

let index = sockets.findIndex(function(o) {

return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;

})

if (index!== -1) sockets.splice(index, 1);

console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);

});

});

اینک کد کامل فایل سرور ما باید به صورت زیر درآمده باشد:

const net = require('net');

const port = 7070;

const host = '127.0.0.1';

const server = net.createServer();

server.listen(port, host, () => {

console.log('TCP Server is running on port ' + port + '.');

});

let sockets = [];

server.on('connection', function(sock) {

console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

sockets.push(sock);

sock.on('data', function(data) {

console.log('DATA ' + sock.remoteAddress + ': ' + data);

// Write the data back to all the connected, the client will receive it as data from the server

sockets.forEach(function(sock, index, array) {

sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');

});

});

// Add a 'close' event handler to this instance of socket

sock.on('close', function(data) {

let index = sockets.findIndex(function(o) {

return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;

})

if (index!== -1) sockets.splice(index, 1);

console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);

});

});

فایل را ذخیره کنید و سرور را مجدداً آغاز کنید:

Npm start

اینک یک سرور TCP کاملاً فعال روی رایانه سرور خود داریم. در مرحله بعد باید یک کلاینت ایجاد کنیم تا به این سرور ما وصل شود.

گام 2: ایجاد کلاینت TCP مبتنی بر Node.js

در حال حاضر سرور TCP روی Node.js مشغول اجرا است و از این رو باید یک کلاینت TCP ایجاد کنیم تا به سرور وصل شود و بتوانیم سرور خود را تست کنیم.

سرور Node.js که در مرحله قبل نوشتیم، همچنان در حال اجرا است و جلسه ترمینال کنونی شما را مسدود ساخته است. از آنجا که می‌خواهیم این سرور همچنان در طی مراحل توسعه کلاینت نیز در حال اجرا باقی بماند، باید یک پنجره ترمینال جدید باز کنیم. سپس از این ترمینال جدید دوباره به سرور خود وصل می‌شویم:

ssh sammy@your_server_ip

زمانی که وصل شدیم به دایرکتوری tcp-nodejs-app می‌رویم:

cd tcp-nodejs-app

در این دایرکتوری یک فایل جدید به نام client.js می‌سازیم:

nano client.js

این کلاینت از همان کتابخانه net که در فایل server.js استفاده کردیم، بهره می‌گیرد تا به سرور TCP وصل شود. کد زیر را به فایل اضافه کنید تا با استفاده از آدرس آی‌پی 127.0.0.1 و شماره پورت 7070 به سرور وصل شوید:

const net = require('net');

const client = new net.Socket();

const port = 7070;

const host = '127.0.0.1';

client.connect(port, host, function() {

console.log('Connected');

client.write("Hello From Client " + client.address().address);

});

کد فوق تلاش می‌کند تا به سرور TCP وصل شود و بدین ترتیب اطمینان حاصل شود که سروری که ایجاد کرده‌ایم در حال اجرا است. زمانی که اتصال برقرار شد، کلاینت یک پیام "Hello From Client " + client.address().address را با استفاده از تابع client.write به سرور می‌فرستد. سرور ما این داده‌ها را دریافت می‌کند و آن را به کلاینت باز می‌گرداند.

زمانی که کلاینت داده‌ها را از سرور بازدریافت می‌کند، پاسخ سرور را نمایش می‌دهیم. کد زیر را به رویداد data اضافه کنید تا پاسخ سرور را در خط فرمان نمایش دهد:

client.on('data', function(data) {

console.log('Server Says: ' + data);

});

در نهایت وضعیت قطع اتصال از سرور را با افزودن کد زیر به طور مناسبی مدیریت می‌کنیم:

client.on('close', function() {

console.log('Connection closed');

});

فایل client.js را ذخیره کنید و دستور زیرا برای آغاز به کار کلاینت وارد نمایید:

node client.js

اتصال برقرار می‌شود و سرور داده‌ها را دریافت کرده و آن‌ها را مجدداً به کلاینت ارسال می‌کند:

client.js Output

Connected

Server Says: 127.0.0.1:34548 said Hello From Client 127.0.0.1

اینک به ترمینالی که سرور در آن در حال اجرا است باز گردید تا در آنجا خروجی زیر را ببینید:

server.js Output

CONNECTED: 127.0.0.1:34550

DATA 127.0.0.1: Hello From Client 127.0.0.1

بدین ترتیب تأیید شد که اتصال TCP بین برنامه‌های سرور و کلاینت برقرار شده است.

CTRL+C را بزنید تا سرور متوقف شود. سپس به ترمینال دیگر رفته و مجدداً CTRL+C را بزنید تا کلاینت نیز متوقف شود. اینک می‌توانید این ترمینال را از سرور قطع کنید و به ترمینال اول بازگردید. در مرحله بعد سرور را با استفاده از PM2 آغاز و آن را در پس‌زمینه اجرا می‌کنیم.

گام 3: اجرای سرور با PM2

اینک یک سرور فعال داریم که اتصال‌ها را از سمت کلاینت‌ها می‌پذیرد؛ اما این سرور در پیش‌زمینه اجرا می‌شود. می‌توانیم با استفاده از PM2 سرور را در پس‌زمینه اجرا کنیم و آن را به طور مناسبی راه‌اندازی مجدد کنیم. بدین منظور ابتدا باید PM2 را با استفاده از دستور npm به طور سراسری روی سرور نصب کنید:

sudo npm install pm2 –g

زمانی که PM2 نصب شد، از آن برای اجرای سرور خود استفاده کنید. به جای اجرای npm start برای شروع سرور می‌توانید از دستور pm2 استفاده کنید. سرور را آغاز کنید:

pm2 start server.js

در این مرحله یک خروجی مانند زیر می‌بینید:

[secondary_label Output

[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2

[PM2] PM2 Successfully daemonized

[PM2] Starting /home/sammy/tcp-nodejs-app/server.js in fork_mode (1 instance)

[PM2] Done.

┌────────┬──────┬────────┬───┬─────┬───────────┐

│ Name │ mode │ status │ ↺ │ cpu │ memory │

├────────┼──────┼────────┼───┼─────┼───────────┤

│ server │ fork │ online │ 0 │ 5% │ 24.8 MB │

└────────┴──────┴────────┴───┴─────┴───────────┘

Use `pm2 show <id|name>` to get more details about an app

اینک سرور در پس‌زمینه اجرا شده است. با این حال اگر سرور را ریبوت (reboot) کنیم، این سرور به طور خودکار مجدداً آغاز به کار نمی‌کند. بنابراین باید یک سرویس systemd برای آن ایجاد کنیم.

دستور زیر را اجرا کنید تا اسکریپت‌های راه‌اندازی systemd را برای PM2 تولید و نصب کنید. مطمئن شوید که در هنگام اجرای دستور از sudo استفاده می‌کنید تا فایل‌ها به طور خودکار نصب شوند.

sudo pm2 startup

خروجی زیر را شاهد خواهید بود:

Output

[PM2] Init System found: systemd

Platform systemd

...

[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service

[PM2] Making script booting at startup...

[PM2] [-] Executing: systemctl enable pm2-root...

Created symlink from /etc/systemd/system/multi-user.target.wants/pm2-root.service to /etc/systemd/system/pm2-root.service.

[PM2] [v] Command successfully executed.

+---------------------------------------+

[PM2] Freeze a process list on reboot via:

$ pm2 save

[PM2] Remove init script via:

$ pm2 unstartup system

PM2 اینک به عنوان یک سرویس system اجرا شده است. شما می‌توانید همه پروسس‌های PM2 را با دستور pm2 list فهرست کنید:

pm2 list

اپلیکیشن خود را در این لیست با ID صفر می‌بینید:

Output

┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐

│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │

├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤

│ server │ 0 │ fork │ 9075 │ online │ 0 │ 4m │ 0% │ 30.5 MB │ sammy │ disabled │

└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘

در خروجی فوق می‌بینید که مقدار watching به صورت غیر فعال (disabled) است. این ویژگی موجب می‌شود که هر زمان شما تغییری در هر یک از فایل‌های اپلیکیشن ایجاد می‌کنید، سرور به طور خودکار راه‌اندازی مجدد شود. این وضعیت در مرحله توسعه مفید است؛ اما در محیط استفاده عملی (production) به آن نیازی نداریم.

برای کسب اطلاعات بیشتر در مورد هرگونه پروسه در حال اجرا، از دستور pm2 show و سپس ID آن استفاده می‌کنیم. در این مورد ID برابر با صفر است:

pm2 show 0

خروجی فوق میزان آپتایم، وضعیت سرور، مسیرهای فایل log و دیگر اطلاعات را در مورد اپلیکیشن در حال اجرا نشان می‌دهد:

Output

Describing process with id 0 - name server

┌───────────────────┬──────────────────────────────────────────┐

│ status │ online │

│ name │ server │

│ restarts │ 0 │

│ uptime │ 7m │

│ script path │ /home/sammy/tcp-nodejs-app/server.js │

│ script args │ N/A │

│ error log path │ /home/sammy/.pm2/logs/server-error-0.log │

│ out log path │ /home/sammy/.pm2/logs/server-out-0.log │

│ pid path │ /home/sammy/.pm2/pids/server-0.pid │

│ interpreter │ node │

│ interpreter args │ N/A │

│ script id │ 0 │

│ exec cwd │ /home/sammy/tcp-nodejs-app │

│ exec mode │ fork_mode │

│ node.js version │ 8.11.2 │

│ watch & reload │ ✘ │

│ unstable restarts │ 0 │

│ created at │ 2018-05-30T19:29:45.765Z │

└───────────────────┴──────────────────────────────────────────┘

Code metrics value

┌─────────────────┬────────┐

│ Loop delay │ 1.12ms │

│ Active requests │ 0 │

│ Active handles │ 3 │

└─────────────────┴────────┘

Add your own code metrics: http://bit.ly/code-metrics

Use `pm2 logs server [--lines 1000]` to display logs

Use `pm2 monit` to monitor CPU and Memory usage server

اگر وضعیت اپلیکیشن خطایی را نشان دهد، می‌توانید از error lop path برای باز کردن و مرور لاگ‌های خطا جهت دیباگ آن استفاده کنید:

cat /home/tcp/.pm2/logs/server-error-0.log

اگر تغییراتی در کد سرور ایجاد کرده باشید، باید پروسه اپلیکیشن را راه‌اندازی مجدد کنید تا تغییرات اعمال شوند، مثلاً به صورت زیر:

pm2 restart 0

PM2 اینک در حال مدیریت اپلیکیشن است. در مرحله بعد از Nginx برای پراکسی کردن درخواست‌ها به سرور استفاده می‌کنیم.

گام 4: راه‌اندازی Nginx به عنوان یک سرور پراکسی معکوس

در مرحله کنونی اپلیکیشن شما در حال اجرا است و در آدرس 127.0.0.1 مشغول گوش دادن است. این به آن معنی است که این اپلیکیشن تنها اتصال‌هایی را از رایانه محلی خود دریافت می‌کند. ما Nginx را به عنوان یک پراکسی معکوس تنظیم می‌کنیم که ترافیک ورودی را مدیریت کرده و آن را به سرور ما هدایت می‌کند. برای این کار Nginx را جهت استفاده از ویژگی‌های ()stream و stream_proxy پیکربندی می‌کنیم تا داده‌ها را تنها به صورت بلوک‌های سطح بالا فوروارد کنیم. پیکربندی پیش‌فرض Nginx روی اوبونتو بلوک‌های سرور را درون بلوک http فایل بارگذاری می‌کند و بلوک stream نمی‌تواند درون این بلوک قرار گیرد.

فایل /etc/nginx/nginx.conf را درون ویرایشگر دلخواه خود باز کنید:

sudo nano /etc/nginx/nginx.conf

خطوط زیر را به انتهای فایل پیکربندی اضافه کنید:

...

stream {

server {

listen 3000;

proxy_pass 127.0.0.1:7070;

proxy_protocol on;

}

}

این کد به اتصال‌های TCP روی پورت 3000 گوش می‌دهد و درخواست‌ها را به سرور Node.js که روی پورت 7070 در حال اجرا است پراکسی می‌کند. اگر اپلیکیشن طوری تنظیم شده باشد که به شماره پورت دیگری گوش دهد، پراکسی پورت URL را به شماره پورت صحیح ارسال می‌کند. مقدار proxy_protocol به انجین‌ایکس می‌گوید که از پروتکل PROXY برای ارسال اطلاعات کلاینت به سرورهای بک‌اند استفاده کند. این اطلاعات سپس در آنجا در صورت نیاز مورد پردازش قرار می‌گیرند. فایل را ذخیره کرده و از ویرایشگر خارج شوید.

پیکربندی Nginx را بررسی کنید تا مطمئن شوید که هیچ گونه خطای نحوی در فایل ایجاد نشده است:

sudo nginx –t

سپس Nginx را رستارت کنید تا امکان پراکسی TCP و UDP فعال شود:

sudo systemctl restart nginx

در این مرحله به اتصال‌های TCP اجازه می‌دهیم تا روی آن پورت به سرور ما وصل شوند. از ufw برای ایجاد اتصال به پورت 3000 استفاده می‌کنیم:

sudo sudo ufw allow 3000

با فرض این که اپلیکیشن Node.js شما در حال اجرا است و اپلیکیشن و پیکربندی‌های Nginx شما صحیح هستند، اینک باید قادر باشید که از طریق پراکسی معکوس انجین‌ایکس به اپلیکیشن خود دسترسی پیدا کنید.

گام 5: تست اتصال سمت کلاینت

اجازه بدهید سرور خود را با بهره‌گیری از اسکریپت client.js و با اتصال به سرور TCP از رایانه محلی تست کنیم. بدین منظور باید فایل client.js را که توسعه داده‌ایم، بر روی رایانه محلی خود دانلود کنید و آدرس آی‌پی و شماره پورت را در اسکریپت تغییر دهید.

ابتدا روی رایانه محلی خود فایل client.js را با استفاده از دستور scp دانلود کنید:

[environment local

scp sammy@your_server_ip:~/tcp-nodejs-app/client.js client.js

فایل client.js را در ویرایشگر خود باز کنید:

[environment local

nano client.js

شماره پورت را به 3000 تغییر دهید و مقدار host را برابر با آدرس IP سرور خود قرار دهید:

// A Client Example to connect to the Node.js TCP Server

const net = require('net');

const client = new net.Socket();

const port = 3000;

const host = 'your_server_ip';

...

فایل را ذخیره کنید و از ویرایشگر خارج شوید. اینک می‌توانید همه چیز را با اجرای کلاینت تست کنید:

node client.js

در این مرحله همان خروجی که قبلاً دیدیم را مجدداً مشاهده می‌کنید که نشان می‌دهد رایانه کلاینت از طریق Nginx به سرور دسترسی یافته است:

client.js Output

Connected

Server Says: 127.0.0.1:34584 said PROXY TCP4 your_local_ip_address your_server_ip 52920 3000

Hello From Client your_local_ip_address

از آن جا که Nginx اتصال‌های کلاینت را به سرور شما پراکسی می‌کند، سرور Nginx شما آدرس واقعی آی‌پی کلاینت‌ها را مشاهده نمی‌کند و تنها آدرس آی‌پی Nginx را می‌بیند. Nginx بدون ایجاد برخی تغییرات از ارسال مستقیم آدرس‌های واقعی آی‌پی به بک‌اند پشتیبانی نمی‌کند. این تغییرات ممکن است بر روی امنیت سیستم تأثیر منفی بگذارند؛ اما از آنجا که پروتکل PROXY را در Nginx فعال کرده‌ایم، سرور Node.js اینک پیام‌های PROXY اضافی را نیز دریافت می‌کند که شامل آی‌پی واقعی هستند. اگر به این آدرس‌های آی‌پی نیاز دارید، می‌توانید سرور خود را تغییر دهید تا درخواست‌های PROXY را پردازش کرده و داده‌هایی که لازم دارید را تجزیه کند.

سخن پایانی

اینک شما یک اپلیکیشن TCP مبتنی بر Node.js دارید که در پشت یک پراکسی معکوس انجین‌ایکس فعالیت می‌کند و می‌توانید به کار خود ادامه داده و سرور را بیش از این توسعه دهید.

در این راهنما یک اپلیکیشن Node.js ایجاد کردیم که به همراه PM2 کار می‌کند و آن را در پشت یک وب‌سرور انجین‌ایکس قرار دادیم. همچنین یک اپلیکیشن کلاینت ساختیم که از روی رایانه‌های دیگر می‌تواند به سرور ما متصل شود. شما می‌توانید از این اپلیکیشن برای مدیریت حجم بالایی از جریان‌های داده‌ای و ساخت اپلیکیشن‌های پیام‌رسانی همزمان استفاده کنید.

اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد می‌کنیم موارد زیر را نیز مورد مطالعه قرار دهید:

==

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
digitalocean
۱ دیدگاه برای «سرور TCP مبتنی بر Node.js با استفاده از PM2 و Nginx — راهنمای ساخت اپلیکیشن از صفر تا صد»

سلام و وقت بخیر
بابت مطلب مفیدتون بسیار سپاسگزارم
امیدوارم که همیشه موفق باشید

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *