Node.js+Nginx-এখন কি?




concept (8)

আমি আমার সার্ভারে Node.js এবং Nginx সেট আপ করেছি। এখন আমি এটি ব্যবহার করতে চাই, কিন্তু, শুরু করার আগে সেখানে 2 টি প্রশ্ন রয়েছে:

  1. কিভাবে তারা একসঙ্গে কাজ করা উচিত? আমি কিভাবে অনুরোধ হ্যান্ডেল করা উচিত?
  2. একটি Node.js সার্ভারের জন্য দুটি ধারণা রয়েছে যা কোনটি ভাল:

    ক। প্রয়োজন প্রতিটি ওয়েবসাইটের জন্য একটি পৃথক HTTP সার্ভার তৈরি করুন। তারপরে প্রোগ্রামটির শুরুতে সমস্ত জাভাস্ক্রিপ্ট কোড লোড করুন, তাই কোড একবার ব্যাখ্যা করা হয়।

    খ। একটি Node.js সার্ভার তৈরি করুন যা সমস্ত Node.js অনুরোধ পরিচালনা করে। এটি অনুরোধকৃত ফাইলগুলি পড়ে এবং তাদের সামগ্রীগুলি প্রকাশ করে। সুতরাং ফাইলগুলি প্রতিটি অনুরোধে ব্যাখ্যা করা হয়, তবে সার্ভারের যুক্তিটি অনেক সহজ।

Node.js সঠিকভাবে কীভাবে ব্যবহার করবেন তা আমার কাছে স্পষ্ট নয়।


Nginx একটি বিপরীত প্রক্সি সার্ভার হিসাবে কাজ করতে পারে যা কোনও প্রকল্প পরিচালকের মতো কাজ করে। এটি একটি অনুরোধ পায় যখন এটি বিশ্লেষণ করে এবং আপস্ট্রিম (প্রকল্প সদস্য) অনুরোধ বা এগিয়ে নিজেই পরিচালনা। Nginx এর কনফিগারেশনের উপর ভিত্তি করে একটি অনুরোধ পরিচালনা করার দুটি উপায় রয়েছে।

  • অনুরোধ পরিবেশন করা
  • অনুরোধ অন্য সার্ভারে ফরওয়ার্ড

    server{
     server_name mydomain.com sub.mydomain.com;
    
     location /{ 
      proxy_pass http://127.0.0.1:8000;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }
    
     location /static/{
       alias /my/static/files/path;
     }

    }

অনুরোধ সার্ভার

এই কনফিগারেশনের সাথে যখন অনুরোধ url mydomain.com/static/myjs.js হয় mydomain.com/static/myjs.js এটি /my/static/files/path ফোল্ডারে myjs.js ফাইলটি ফেরত দেয়। আপনি static ফাইল পরিবেশন nginx কনফিগার করার সময় এটি অনুরোধ নিজেই পরিচালনা করে।

অনুরোধ অন্য সার্ভারে ফরওয়ার্ড

অনুরোধ url যখন mydomain.com/dothis nginx http://127.0.0.1:8000 তে অনুরোধ করবে। স্থানীয় হোস্ট 8000 পোর্টে চলমান পরিষেবাটি অনুরোধ পাবে এবং nginx এবং nginx এর প্রতিক্রিয়া ক্লায়েন্টকে প্রতিক্রিয়া প্রদান করবে।

যখন আপনি port 8000 nginx এ node.js সার্ভারটি চালান তখন নোড.জেসে অনুরোধ ফরওয়ার্ড করবেন। Node.js যুক্তি লিখুন এবং অনুরোধ হ্যান্ডেল। এটি আপনার nodejs সার্ভার nginx সার্ভারের পিছনে চলমান আছে।

আপনি যদি নোডজ ছাড়া অন্য কোনও পরিষেবাদি চালাতে চান তবে Django, ফ্লাস্ক, পিএইচপি ইত্যাদি অন্য পোর্টে চালান এবং nginx এ কনফিগার করুন।


Nginx একটি সামনে শেষ সার্ভার হিসাবে কাজ করে, এই ক্ষেত্রে একটি node.js সার্ভারের অনুরোধ প্রক্সি। অতএব আপনি নোডের জন্য একটি nginx কনফিগারেশন ফাইল সেটআপ করতে হবে।

আমার উবুন্টু বক্সে আমি যা করেছি তা হল:

আপনার yourdomain.com ফাইলটি /etc/nginx/sites-available/ :

vim /etc/nginx/sites-available/yourdomain.com

এতে আপনার মত কিছু থাকতে হবে:

# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
    server 127.0.0.1:3000;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    access_log /var/log/nginx/yourdomain.com.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://app_yourdomain/;
      proxy_redirect off;
    }
 }

যদি আপনি nginx (> = 1.3.13) ওয়েবকোকেট অনুরোধগুলি পরিচালনা করতে চান তবে location / বিভাগে নিম্নলিখিত লাইন যুক্ত করুন:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

একবার আপনার এই সেটআপটি একবারে আপনাকে উপরের কনফিগ ফাইলে সংজ্ঞায়িত সাইটটি সক্ষম করতে হবে:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

আপনার নোড সার্ভার অ্যাপ্লিকেশনটি /var/www/yourdomain/app.js এ তৈরি করুন এবং এটি localhost:3000 চালান localhost:3000

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

সিনট্যাক্স ভুলের জন্য পরীক্ষা:

nginx -t

Nginx পুনরায় আরম্ভ করুন:

sudo /etc/init.d/nginx restart

অবশেষে নোড সার্ভার শুরু করুন:

cd /var/www/yourdomain/ && node app.js

এখন আপনি আপনার ডোমেইন এ "হ্যালো ওয়ার্ল্ড" দেখতে পাবেন

নোড সার্ভার শুরু করার বিষয়ে এক শেষ নোট: নোড ডেমনের জন্য আপনাকে কোন ধরণের পর্যবেক্ষণ সিস্টেম ব্যবহার করতে হবে। Upstart এবং monit সঙ্গে নোডের উপর একটি দুর্দান্ত টিউটোরিয়াল আছে।


আপনার প্রশ্নের উত্তর 2:

আমি বিকল্প b ব্যবহার করব কারণ এটি অনেক কম সম্পদ খায়। অপশনটি 'a' সহ, প্রতিটি ক্লায়েন্ট সার্ভারকে অনেক মেমরি গ্রাস করবে, আপনার প্রয়োজনীয় সমস্ত ফাইল লোড করবে (যদিও আমি php পছন্দ করি, এটির মধ্যে এটি একটি সমস্যা)। বিকল্প 'বি' দিয়ে আপনি আপনার লাইব্রেরিগুলি লোড করতে পারবেন (পুনঃব্যবহারযোগ্য কোড) এবং সমস্ত ক্লায়েন্ট অনুরোধগুলির মধ্যে ভাগ করুন।

কিন্তু আপনি যদি একাধিক কোরে থাকে তবে আপনি যে সবগুলি ব্যবহার করতে চান সেটি node.js টিতে টিকবে।


আপনি Nginx দ্বারা পরিবেশিত একটি ডিরেক্টরি মধ্যে স্ট্যাটিক ফাইল জেনারেট করতে node.js ব্যবহার করতে পারে। অবশ্যই, আপনার সাইটের কিছু গতিশীল অংশ নোড দ্বারা এবং কিছু Nginx (স্ট্যাটিক) দ্বারা পরিবেশিত হতে পারে।

তাদের nginx দ্বারা পরিবেশিত কিছু হচ্ছে আপনার কর্মক্ষমতা বৃদ্ধি ..


আপনি একটি সার্ভারের কনফিগারেশনে অ্যাপ্লিকেশানের জন্য বিভিন্ন url থাকতে পারেন:

  • yourdomain.com/app1/* -> Node.js স্থানীয়ভাবে চলমান প্রক্রিয়া http://127.0.0.1:3000
  • yourdomain.com/app2/* -> Node.js স্থানীয়ভাবে চলমান প্রক্রিয়া http://127.0.0.1:4000

/ Etc / nginx / সাইট-সক্ষম / আপনারডোমনে :

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:4000/;
    }
}

Nginx পুনরায় আরম্ভ করুন:

sudo service nginx restart

অ্যাপ্লিকেশন শুরু হচ্ছে।

নোড app1.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app1!\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

নোড app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');

আপনি প্রতিটি মাইক্রোসফেস মানে পরিচালনা করতে এবং চালানোর জন্য PM2 ব্যবহার করে নোডজ চালাতে পারেন। নোডটি কেবলমাত্র পোর্টে চলমান হবে nginx (/etc/nginx/sites-enabled/domain.com) এ কেবলমাত্র পোর্টটি কনফিগার করবে

server{
    listen 80;
    server_name domain.com www.domain.com;

  location / {
     return 403;
  }
    location /url {
        proxy_pass http://localhost:51967/info;
    }
}

স্থানীয়হস্ত পিং ব্যবহার করে চলছে কিনা তা পরীক্ষা করুন।

এবং

Create one single Node.js server which handles all Node.js requests. This reads the requested files and evals their contents. So the files are interpreted on each request, but the server logic is much simpler.

এটি সর্বোত্তম এবং আপনি খুব সহজ বলেছিলেন


আমি Nginx মাধ্যমে স্বাধীন নোড এক্সপ্রেস অ্যাপ্লিকেশন প্রক্সি।

সুতরাং নতুন অ্যাপ্লিকেশন সহজে মাউন্ট করা যেতে পারে এবং আমি বিভিন্ন অবস্থানে একই সার্ভারে অন্যান্য উপাদান চালাতে পারেন।

Nginx কনফিগারেশন উদাহরণের সাথে আমার সেটআপের আরও বিস্তারিত এখানে রয়েছে:

Nginx সঙ্গে সাবফোল্ডার মধ্যে এক ওয়েব সার্ভারে একাধিক নোড অ্যাপ্লিকেশন স্থাপন করুন

যখন নোডের সাথে আপনার অ্যাপ্লিকেশনটিকে স্থানীয় হোস্ট থেকে ইন্টারনেটে সরাতে হবে তখন জিনিসগুলি চতুর হয়ে যায়।

নোড স্থাপনার জন্য কোন সাধারণ পদ্ধতি নেই।

গুগলের এই বিষয়ে প্রচুর পরিমাণে নিবন্ধ পাওয়া যায়, তবে আমি প্রয়োজনীয় সেটআপের সঠিক সমাধান খুঁজে পেতে সংগ্রাম করছিলাম।

মূলত, আমার একটি ওয়েব সার্ভার রয়েছে এবং আমি নোড অ্যাপ্লিকেশনগুলিকে অ্যাপ্লিকেশন কোডের জন্য কোনও কনফিগারেশন নির্ভরতা প্রবর্তন না করে সাবফোলারগুলিতে (যেমন http://myhost/demo/pet-project/ ) মাউন্ট করতে চাই।

একই সময়ে আমি একই ওয়েব সার্ভারে ব্লগ চালানোর মতো অন্যান্য সামগ্রী চাই।

সহজ হাহ? দৃশ্যত না.

ওয়েব নোড অ্যাপ্লিকেশনের অনেক উদাহরণে পোর্ট 80 এ চালানো হয় অথবা মূলত Nginx দ্বারা প্রক্সি করা হয়।

যদিও উভয় পন্থাগুলি নির্দিষ্ট ব্যবহারের ক্ষেত্রে বৈধ, তবে তারা আমার সহজ কিন্তু সামান্য বিরাট মানদণ্ড পূরণ করে না।

এজন্যই আমি আমার নিজের Nginx কনফিগারেশন তৈরি করেছি এবং এখানে একটি এক্সট্র্যাক্ট রয়েছে:

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

এই উদাহরণ থেকে আপনি লক্ষ্য করতে পারেন যে আমি আমার পোষা প্রকল্প নোড অ্যাপ্লিকেশনটিকে পোর্ট 3000 তে http://myhost/demo/pet-project চলমান মাউন্ট করতে পারি।

প্রথম Nginx চেক করা হয় কিনা অনুরোধ সম্পদ একটি স্ট্যাটিক ফাইল / opt / ডেমো / পোষা-প্রকল্প / পাবলিক / পাওয়া যায় এবং যদি তাই এটি এটি অত্যন্ত দক্ষ হিসাবে কাজ করে কিনা, তাই সংযোগ হিসাবে একটি অপ্রয়োজনীয় স্তর প্রয়োজন হবে না স্ট্যাটিক মিডলওয়্যার।

তারপরে অন্যান্য সমস্ত অনুরোধগুলি প্রাইভেট প্রোটেক্ট নোড অ্যাপ্লিকেশনের উপরে প্রক্সিড হয়ে থাকে এবং নোড অ্যাপ্লিকেশনটি আসলে কোথায় মাউন্ট করা হয় তা জানার প্রয়োজন নেই এবং এইভাবে কনফিগারেশনের মাধ্যমে যে কোন জায়গায় সরানো যেতে পারে।

proxy_redirect সঠিকভাবে অবস্থান হেডার পরিচালনা করতে হবে। আপনার নোড অ্যাপ্লিকেশনে res.redirect () ব্যবহার করলে এটি অত্যন্ত গুরুত্বপূর্ণ।

আপনি সহজেই বিভিন্ন পোর্টে চলমান একাধিক নোড অ্যাপ্লিকেশনের জন্য এই সেটআপটি প্রতিলিপি করতে পারেন এবং অন্যান্য উদ্দেশ্যে আরো স্থান হ্যান্ডলার যুক্ত করতে পারেন।

থেকে: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


আমি গিথুব-তে একটি সংগ্রহস্থল তৈরি করেছি যা আপনি ক্লোন করতে পারেন, vagrant-node-nginx-boilerplate

মূলত node.js অ্যাপ্লিকেশন /var/www/nodeapp হয়

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(4570, '127.0.0.1');

console.log('Node Server running at 127.0.0.1:4570/');

এবং nginx কনফিগারেশন /etc/nginx/sites-available/ হয়

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/nodeapp;
        index index.html index.htm;

        server_name localhost;

        location / {
          proxy_pass http://127.0.0.1:4570;
          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;
        }
}




concept