নোড.জেএস + এনগিনেক্স - এখন কী?


1002

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

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

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

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

কিভাবে নোড.জেএস সঠিকভাবে ব্যবহার করবেন তা আমার পক্ষে পরিষ্কার নয়।

উত্তর:


1305

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

আমি আমার উবুন্টু বাক্সে এটি করেছি:

ফাইল তৈরি করুন 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

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

এনগিনেক্স পুনরায় চালু করুন:

sudo /etc/init.d/nginx restart

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

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

আপনার নিজের ডোমেন ডটকমে এখন "হ্যালো ওয়ার্ল্ড" দেখা উচিত

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


11
পোস্টের জন্য ধন্যবাদ, উপরের সার্ভারের জন্য node.js প্রতিক্রিয়াগুলিকে nginx করবে, বা প্রতিবার এগুলি পুনরায় চালিত করবে।
চুন

79
আপনি কেবল না করতে পারার কোনও কারণ আছে location / { proxy_pass http://127.0.0.1:3000; }? আপনার পুরো upstreamকনফিগার বিটটি কেন দরকার ?
রবিন উইনস্লো

20
+1, একটি সাধারণ প্রশ্নের খুব সোজা এবং সহজ উত্তর; নোড এবং এনজিনেক্স ব্যবহার করে ভার্চুয়াল হোস্ট সেটআপ করতে চান এমন লোকদের জন্য দুর্দান্ত। কেবলমাত্র আমি মনে করি আপনি কেবল মিস করেছেন তা হ'ল এনগিনেক্স-ইন-ফ্রন্ট-নোড কেন একাধিক vhosts (জিজ্ঞাসকের দ্বিতীয় প্রশ্ন) পরিবেশন করার জন্য সবচেয়ে ভাল to
পল ডি'অস্ট

34
আপনি লোড ব্যালেন্সিংয়ের জন্য সার্ভারের জন্য আরও সার্ভার যুক্ত করতে চান রবিন উইনস্লো
জোওও দা সিলভা

76
এটি লক্ষ করা উচিত যে এই (খুব সহায়ক) উত্তরটি nginx এর একটি স্বাদকে বোঝায় যে ডিফল্টরূপে, ভিতরে আসে sites-enabledএবং sites-availableডিরেক্টরিগুলি /etc/nginx। যদি আপনার সংস্করণটি এই দুটি ডিরেক্টরি ছাড়াই চলে আসে তবে এর conf.dপরিবর্তে সম্ভবত এটির একটি একক ডিরেক্টরি রয়েছে। সেক্ষেত্রে এই নির্দেশাবলী অনুসরণ করে কোনও প্রভাব পড়বে না, আপনি ডিফল্ট পরিবর্তে নির্দেশ করতে includeফাইলের অভ্যন্তরে বিবৃতিটি সংশোধন করবেন না । আশা করি তা বোধগম্য হয়। ভিতরে বর্ণিত বিবৃতিটি একবার দেখলে এটি স্ব-বর্ণনামূলক হয়ে উঠবে । nginx.confsites-enabledconf.dincludenginx.conf
11:30 এ মিলিত করুন am

167

আপনি একাধিক নোড.জেএস প্রসেসে ফরোয়ার্ড করে এনজিনেক্সের সাথে একাধিক ডোমেন সেটআপ করতে পারেন।

উদাহরণস্বরূপ এগুলি অর্জন করা:

  • ডোমেইন 1.com -> থেকে নোড.জেএস প্রক্রিয়াটি স্থানীয়ভাবে চলছে: http://127.0.0.1:4000
  • ডোমেন 2.com -> থেকে নোড.জেএস প্রক্রিয়াটি স্থানীয়ভাবে চলছে: http://127.0.0.1:5000

এই পোর্টগুলি (4000 এবং 5000) আপনার অ্যাপ্লিকেশন কোডটিতে অ্যাপ্লিকেশন অনুরোধ শোনার জন্য ব্যবহার করা উচিত।

জন্য / etc / nginx / সাইট-সক্রিয় / DOMAIN1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

/ ইত্যাদি / এনগিনেক্স / সাইটগুলি সক্ষম / ডোমেন 2 এ

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

5
আমি proxy_pass আপনার পদ্ধতি ব্যবহার করছি, কিন্তু কোনো কারণে http://example.comস্বয়ংক্রিয়ভাবে পায় 302করার ঘ ' http://www.example.com। কেন এমন?
ক্রিস্টিয়ান

আপনার কি ক্লাউডফ্লেয়ার বা অনুরূপ কিছু রয়েছে? উপরের কনফিগারেশনটি মোটেও পুনর্নির্দেশ করা উচিত নয়।
ওজিয়েইসাকস

1
@ ক্রিশ্চিয়ান proxy_set_header Host $hostএইচটিটিপি 302 পুনঃনির্দেশ এড়াতে আপনাকে যুক্ত করতে হবে।
ইভান শ্যাটস্কি

@IvanShatsky - আপনি কোন সাহায্যের কীভাবে একাধিক সাব ডোমেনের সাথে একাধিক পোর্ট কনফিগার করতে এবং প্রতিরোধ করতে পারি nginx বনাম 1.14.1 অন্য ডোমেইন চলমান অন্যান্য পোর্ট?
151291

59

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

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

ইন / ইত্যাদি / এনগিনেক্স / সাইটগুলি সক্ষম / আপনারডোমেন :

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/;
    }
}

এনগিনেক্স পুনরায় চালু করুন:

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/');

3
ওপেন সোর্স সম্প্রদায়ে সংস্করণটি নিখরচায় রয়েছে তবে তাদের অন্যান্য বৈশিষ্ট্য সহ সংস্করণ রয়েছে যা নিখরচায় নয়। nginx.com/products/fe
चर-

আমার অজ্ঞতার জন্য দুঃখিত এইভাবে এটি পরিবেশন করার উদ্দেশ্য, সুবিধাগুলি কী? আপনার ব্যবহারের কোনও উদাহরণ বা মামলা আছে? আগাম ধন্যবাদ.
মাউরো আগুইলার

2
@ মাউরোআগিলার আপনার যদি একটি সার্ভারে ২ টি নোড.জেএস অ্যাপের প্রয়োজন হয় তবে আপনি প্রস্তাবিত উপায়ে (বিভিন্ন বন্দর ব্যবহার করে) সেগুলি পরিবেশন করতে পারেন। আমার ক্ষেত্রে এটি দুটি পৃথক পরীক্ষামূলক অ্যাপ্লিকেশন ছিল।
0x8BADF00D

ঠিক আছে, তবে 2 টি অ্যাপ্লিকেশন চালানো এবং একটি একক মধ্যে পার্থক্য কী? আমি বলতে চাইছি, যদি সেগুলি একই উদ্দেশ্যে করা হয় তবে কী কী সুবিধা হবে?
মাউরো আগুইলার

2
@ মাউরো অগুইলার, আপনি এগুলিকে এককভাবে চালাতে পারেন এবং এটি যদি কোনও প্রকল্পের অংশ হতে পারে এবং একই উদ্দেশ্য হয় তবে কোনও লাভ নেই। তবে যদি আপনাকে একটি সার্ভারে বিভিন্ন উদ্দেশ্যে এবং বিভিন্ন কনফিগারেশন সহ 2 টি পৃথক প্রকল্প পরিচালনা করতে হয় তবে আপনার এই কনফিগারটিটি ব্যবহার করার সুবিধা রয়েছে।
0x8BADF00D

35

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

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

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

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

লোকাল হোস্ট থেকে ইন্টারনেটে আপনার অ্যাপ্লিকেশনটি সরানোর দরকার হলে নোডের সাথে জিনিসগুলি জটিল হয়ে ওঠে।

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

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

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

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

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

ওয়েবে নোড অ্যাপ্লিকেশনগুলিতে অনেকগুলি উদাহরণে হয় হয় 80 পোর্টে চালানো হয় বা 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 / পোষা-প্রকল্পে মাউন্ট করব ।

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

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

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

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

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


1
পরিবর্তে সাবডোমেনসে কেন এবং কীভাবে আপনার এটি করা উচিত: skovalyov.blogspot.dk/2012/10/…
skovalyov

কেবলমাত্র উত্তরটি লিঙ্ক করুন ... আপনি ব্লগ চলে যাওয়ার ক্ষেত্রে দয়া করে আপনার উত্তরের প্রাসঙ্গিক অংশগুলি সংক্ষিপ্ত করতে পারেন?
কায়সার

11

Ngin.js Nginx কনফিগারেশন সহ।

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

নিম্নলিখিত কনফিগারেশন যুক্ত করুন যাতে Nginx একটি প্রক্সি হিসাবে কাজ করে যখন আমরা "subdomain.your_domain.com" থেকে এসে সার্ভার থেকে 3000 ট্র্যাফিক পোর্টে পুনর্নির্দেশ করব

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

9

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

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

তবে এই বিষয়ে সতর্কতা অবলম্বন করুন যে আপনার যদি একাধিক কোর থাকে তবে আপনার সবগুলি ব্যবহার করার জন্য নোড.জেএসকে টুইট করতে হবে।


2
যদি সংস্থানগুলি আপনার সবচেয়ে গুরুত্বপূর্ণ সমস্যা হয় তবে এই পরামর্শটি অনুসরণ করুন (সম্ভাবনা নেই) unlikely (ক) এবং (খ) এর মধ্যে বিভিন্ন সমঝোতা রয়েছে। বিকল্পগুলি (ক) সম্ভবত সাইটগুলি আরও স্বতঃস্ফূর্ত যেমন সাইট রিস্টার্ট বা রক্ষণাবেক্ষণ, ডিবি সংযোগগুলি, কোড বেস, লাইব্রেরি নির্ভরতা, সার্ভারের মধ্যে সাইটগুলি চলমান ইত্যাদির পছন্দ করতে চান
রোবোক্যাট

8

আমি গিথুবে একটি ভান্ডার তৈরি করেছি যা আপনি ক্লোন করতে পারেন, ভ্যাগ্র্যান্ট-নোড-এনজিনেক্স-বয়লারপ্লেট

মূলত নোড.জেএস অ্যাপটি /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;
        }
}

5

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

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


5

বিপরীত প্রক্সি হিসাবে অভিনয় করে আমরা সহজেই এনগিনেক্সের মাধ্যমে একটি নোডেজ অ্যাপ সেটআপ করতে পারি।
নিম্নলিখিত কনফিগারেশনটি ধরে নিয়েছে নোডজেএস অ্যাপ্লিকেশনটি 127.0.0.1:8080 এ চলছে,

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

উপরের সেটআপে আপনার নোডেজ অ্যাপ্লিকেশনটি করবে,

  • পেতে HTTP_HOSTহেডার যেখানে আপনি ডোমেন নির্দিষ্ট যুক্তিবিজ্ঞান আবেদন করতে পারেন প্রতিক্রিয়া পরিবেশন করা। '
  • আপনার অ্যাপ্লিকেশনটি অবশ্যই প্রসেস ম্যানেজার দ্বারা পরিচালনা করা উচিত যেমন pm2 বা পরিস্থিতি পরিচালনা / সকেট বা সংস্থান পুনরায় ব্যবহার করার জন্য সুপারভাইজারের দ্বারা be

  • সেন্ট্রির মতো উত্পাদন ত্রুটি পাওয়ার জন্য একটি ত্রুটি প্রতিবেদন পরিষেবা সেটআপ করুন বা রোলবারের

দ্রষ্টব্য: আপনি ডোমেন নির্দিষ্ট অনুরোধের রুটগুলি হস্তান্তর করার জন্য লজিক সেটআপ করতে পারেন, এক্সপ্রেস অ্যাপ্লিকেশনটির জন্য একটি মিডলওয়্যার তৈরি করতে পারেন


1
Pm2 ব্যবহারের আরেকটি কারণ হ'ল আপনি শেলটি থেকে বেরিয়ে আসার পরে আপনার অ্যাপটি 'চিরতরে' চালাতে পারেন এবং আপনার সার্ভারটি পুনরায় বুট করার দরকার হলে স্বয়ংক্রিয়ভাবে এটিকে শুরু করতে পারেন, দেখুন: pm2.keymetics.io/docs/usage/startup
SeanQuinn781

3

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এটি ফোল্ডারে myjs.jsফাইলটি ফেরত দেয় /my/static/files/path। আপনি যখন স্ট্যাটিক ফাইলগুলি পরিবেশন করার জন্য এনজিনেক্স কনফিগার করেন, তখন এটি অনুরোধটি নিজেই পরিচালনা করে।

অনুরোধটি অন্য সার্ভারে ফরোয়ার্ড করুন

যখন অনুরোধ url mydomain.com/dothisnginx হয় তখন অনুরোধটি http://127.0.0.1:8000 এ ফরোয়ার্ড করবে । লোকালহোস্ট 8000 বন্দরে যে পরিষেবাটি চলছে তা অনুরোধটি গ্রহণ করবে এবং এনগিনেক্সের প্রতিক্রিয়া প্রদান করবে এবং এনগিনেক্স ক্লায়েন্টকে প্রতিক্রিয়া প্রদান করবে returns

আপনি যখন 8,000 এনগিনেক্স বন্দরে নোড.জেএস সার্ভার চালাবেন তখন অনুরোধটি নোড.জেএসে ফরোয়ার্ড করবে নোড.জেএস যুক্তি লিখুন এবং অনুরোধটি পরিচালনা করুন। এটি আপনার নোডেজ সার্ভারটি এনগিনেক্স সার্ভারের পিছনে চলছে।

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


1

আপনি প্রতিটি মাইক্রোসার্চির অর্থ পরিচালনা করতে এবং চালনা করতে চাইলে আপনি পিএম 2 ব্যবহার করে নোডেজ চালাতে পারেন। নোড একটি বন্দরে চলমান থাকবে ঠিক ঠিক সেই পোর্টটি এনজিক্সে কনফিগার করুন (/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.

এটি সেরা এবং যেমনটি আপনি বলেছেন আরও সহজ


1

এনগিনেক্স এবং নোডেজের সাথে সর্বোত্তম এবং সহজ সেটআপ হ'ল এনগিনেক্সকে প্রক্সি_প্রোটোকল সক্ষম থাকা এইচটিটিপি এবং টিসিপি লোড ব্যালেন্সার হিসাবে ব্যবহার করা। এই প্রসঙ্গে, এনগিনেক্স নোডিজগুলিতে আগত অনুরোধগুলির প্রক্সি করতে সক্ষম করবে এবং ব্যাকএন্ড এনগিনেক্স সার্ভারের সাথে এসএসএল সংযোগগুলিও বন্ধ করবে, এবং প্রক্সি সার্ভারে নয় to (Ssl-পাসথ্রু)

আমার মতে, নন-এসএসএল উদাহরণ দেওয়ার কোনও অর্থ নেই, যেহেতু সমস্ত ওয়েব অ্যাপ্লিকেশন সুরক্ষিত পরিবেশ ব্যবহার করে (বা হওয়া উচিত)।

/Etc/nginx/nginx.conf এ প্রক্সি সার্ভারের জন্য কনফিগারেশন উদাহরণ

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  upstream webserver-http {
    server 192.168.1.4; #use a host port instead if using docker
    server 192.168.1.5; #use a host port instead if using docker
  }
  upstream nodejs-http {
    server 192.168.1.4:8080; #nodejs listening port
    server 192.168.1.5:8080; #nodejs listening port
  }
  server {
    server_name example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Connection "";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://webserver-http$request_uri;
    }
  }
  server {
    server_name node.example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://nodejs-http$request_uri;
    }
  }
}
stream {
  upstream webserver-https {
    server 192.168.1.4:443; #use a host port instead if using docker
    server 192.168.1.5:443; #use a host port instead if using docker
  }

  server {
    proxy_protocol on;
    tcp_nodelay on;
    listen 443;
    proxy_pass webserver-https;
  }
  log_format proxy 'Protocol: $protocol - $status $bytes_sent $bytes_received $session_time';
  access_log  /var/log/nginx/access.log proxy;
  error_log /var/log/nginx/error.log debug;
}

এখন, ব্যাকএন্ড ওয়েবসভারটি পরিচালনা করি। /etc/nginx/nginx.conf :

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_geoip2_module.so; # GeoIP2
events {
    worker_connections  1024;
}
http {
    variables_hash_bucket_size 64;
    variables_hash_max_size 2048;
    server_tokens off;
    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    autoindex off;
    keepalive_timeout  30;
    types_hash_bucket_size 256;
    client_max_body_size 100m;
    server_names_hash_bucket_size 256;
    include         mime.types;
    default_type    application/octet-stream;
    index  index.php index.html index.htm;
    # GeoIP2
    log_format  main    'Proxy Protocol Address: [$proxy_protocol_addr] '
                        '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    # GeoIP2
    log_format  main_geo    'Original Client Address: [$realip_remote_addr]- Proxy Protocol Address: [$proxy_protocol_addr] '
                            'Proxy Protocol Server Address:$proxy_protocol_server_addr - '
                            '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '$geoip2_data_country_iso $geoip2_data_country_name';

    access_log  /var/log/nginx/access.log  main_geo; # GeoIP2
#===================== GEOIP2 =====================#
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_metadata_country_build  metadata build_epoch;
        $geoip2_data_country_geonameid  country geoname_id;
        $geoip2_data_country_iso        country iso_code;
        $geoip2_data_country_name       country names en;
        $geoip2_data_country_is_eu      country is_in_european_union;
    }
    #geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
    #   $geoip2_data_city_name city names en;
    #   $geoip2_data_city_geonameid city geoname_id;
    #   $geoip2_data_continent_code continent code;
    #   $geoip2_data_continent_geonameid continent geoname_id;
    #   $geoip2_data_continent_name continent names en;
    #   $geoip2_data_location_accuracyradius location accuracy_radius;
    #   $geoip2_data_location_latitude location latitude;
    #   $geoip2_data_location_longitude location longitude;
    #   $geoip2_data_location_metrocode location metro_code;
    #   $geoip2_data_location_timezone location time_zone;
    #   $geoip2_data_postal_code postal code;
    #   $geoip2_data_rcountry_geonameid registered_country geoname_id;
    #   $geoip2_data_rcountry_iso registered_country iso_code;
    #   $geoip2_data_rcountry_name registered_country names en;
    #   $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
    #   $geoip2_data_region_geonameid subdivisions 0 geoname_id;
    #   $geoip2_data_region_iso subdivisions 0 iso_code;
    #   $geoip2_data_region_name subdivisions 0 names en;
   #}

#=================Basic Compression=================#
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/css text/xml text/plain application/javascript image/jpeg image/png image/gif image/x-icon image/svg+xml image/webp application/font-woff application/json application/vnd.ms-fontobject application/vnd.ms-powerpoint;
    gzip_static on;

    include /etc/nginx/sites-enabled/example.com-https.conf;
}

এখন, আসুন এই SSL এবং প্রক্সি_প্রোটোকল সক্ষম কনফিগারেশনের সাথে /etc/nginx/sites-available/example.com-https.conf- তে ভার্চুয়াল হোস্টটি কনফিগার করব :

server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name 192.168.1.4; #Your current server ip address. It will redirect to the domain name.
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name  example.com;
    listen       *:80;
    return 301   https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name www.example.com;
    listen 80;
    listen 443 http2;
    listen [::]:80;
    listen [::]:443 ssl http2 ;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name example.com;
    listen 443 proxy_protocol ssl http2;
    listen [::]:443 proxy_protocol ssl http2;
    root /var/www/html;
    charset UTF-8;
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy no-referrer;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout   70;
    ssl_buffer_size 1400;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=86400;
    resolver_timeout 10;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_trusted_certificate /etc/nginx/certs/example.com.crt;
location ~* \.(jpg|jpe?g|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm|htc|css|js|otf|eot|svg|ttf|woff|woff2)(\?ver=[0-9.]+)?$ {
    expires modified 1M;
    add_header Access-Control-Allow-Origin '*';
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    }
    location ~ /.well-known { #For issuing LetsEncrypt Certificates
        allow all;
    }
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
    }
error_page  404    /404.php;

location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_index   index.php;
    fastcgi_pass    unix:/tmp/php7-fpm.sock;
    #fastcgi_pass    php-container-hostname:9000; (if using docker)
    fastcgi_pass_request_headers on;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_request_buffering on;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    include fastcgi_params;
}
location = /robots.txt {
    access_log off;
    log_not_found off;
    }
location ~ /\. {
    deny  all;
    access_log off;
    log_not_found off;
    }
}

এবং সর্বশেষে, 2 টি নোডেজ ওয়েবসার্ভারের একটি নমুনা : প্রথম সার্ভার:

var http = require('http');

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

দ্বিতীয় সার্ভার:

var http = require('http');

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

এখন সবকিছু সঠিকভাবে কাজ করা এবং লোড-ভারসাম্য হওয়া উচিত।

কিছুক্ষণ আগে আমি ডকরে টিসিপি লোড ব্যালেন্সার হিসাবে এনগিনেক্স কীভাবে সেটআপ করব সে সম্পর্কে লিখেছিলাম । আপনি ডকার ব্যবহার করছেন কিনা তা পরীক্ষা করে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.