पोर्ट 80 (Ubuntu / Linode) के साथ Node.js चलाते समय सर्वोत्तम अभ्यास [बंद]


260

मैं अपना पहला Node.jsसर्वर स्थापित कर cloud Linux nodeरहा हूं और मैं इसके विवरण के लिए काफी नया हूं Linux admin। (BTW मैं एक ही समय में अपाचे का उपयोग करने की कोशिश नहीं कर रहा हूं।)

सब कुछ सही तरीके से स्थापित है, लेकिन मैंने पाया कि जब तक मैं उपयोग नहीं करता root login, मैं port 80नोड के साथ सुनने में सक्षम नहीं हूं । हालाँकि मैं सुरक्षा कारणों से इसे जड़ नहीं मानूंगा।

इसके लिए सबसे अच्छा अभ्यास क्या है:

  1. नोड के लिए अच्छी अनुमतियां / उपयोगकर्ता सेट करें ताकि वह सुरक्षित / सैंडबॉक्स हो?
  2. पोर्ट 80 को इन बाधाओं के भीतर उपयोग करने की अनुमति दें।
  3. नोड शुरू करें और इसे स्वचालित रूप से चलाएं।
  4. कंसोल के लिए भेजी गई लॉग जानकारी संभाल लें।
  5. किसी भी अन्य सामान्य रखरखाव और सुरक्षा चिंताओं।

क्या मुझे एक अलग श्रवण पोर्ट पर पोर्ट 80 ट्रैफ़िक अग्रेषित करना चाहिए?

धन्यवाद

जवाबों:


532

पोर्ट 80

मैं अपने क्लाउड इंस्टेंस पर क्या करता हूं मैं इस कमांड के साथ पोर्ट 80 को पोर्ट 3000 पर रीडायरेक्ट करता हूं:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000

फिर मैं अपने Node.js को पोर्ट 3000 पर लॉन्च करता हूं। 80 पोर्ट के लिए अनुरोध करने पर पोर्ट 3000 पर मैप हो जाएगा।

आपको अपनी /etc/rc.localफ़ाइल को भी संपादित करना चाहिए और उस लाइन को घटा देना चाहिए sudo। जब मशीन बूट करेगी तो रीडायरेक्ट जुड़ जाएगा। आप की जरूरत नहीं sudoहै /etc/rc.localक्योंकि rootसिस्टम बूट के रूप में वहाँ आदेश चला रहे हैं ।

लॉग्स

अपने Node.js को लॉन्च करने के लिए हमेशा के लिए मॉड्यूल का उपयोग करें । यह सुनिश्चित करेगा कि यदि यह कभी क्रैश हो जाता है तो यह पुनरारंभ हो जाता है और यह कंसोल को एक फाइल में रीडायरेक्ट करेगा।

बूट पर लॉन्च करें

पोर्ट पुनर्निर्देशन के लिए आपके द्वारा संपादित की गई फ़ाइल में अपनी Node.js स्क्रिप्ट शुरू करें /etc/rc.local,। जब सिस्टम शुरू होता है तो आपका Node.js लॉन्च स्क्रिप्ट चलाएगा।

डिजिटल महासागर और अन्य वीपीएस

यह न केवल लाइनोड पर लागू होता है, बल्कि डिजिटल महासागर, एडब्ल्यूएस ईसी 2 और अन्य वीपीएस प्रदाताओं के रूप में भी। हालाँकि, RedHat पर आधारित सिस्टम /etc/rc.localहै /ect/rc.d/local


3
उस जवाब के लिए धन्यवाद, अच्छा है और बात करने के लिए।
रोबोटबग्स

21
BTW, उबंटू पर, यह /etc/rc.local है
kehers

12
अक्सर "-i eth0" ध्वज वर्चुअल प्राइवेट सर्वर के लिए एक मुद्दा होगा। आवश्यकतानुसार eth0 बदलें।
JHAWN

7
अगर मैं अपना Node.js स्क्रिप्ट शुरू करता हूं /etc/rc.local, तो क्या इसे rootसिस्टम बूट के रूप में निष्पादित नहीं किया जाएगा ? यह बंदरगाह के उद्देश्य को 80 पुनर्निर्देशित करेगा।
जमैक्स

4
ध्यान दें कि कार्य के लिए पुनर्निर्देशित पोर्ट के लिए, गंतव्य पोर्ट को आपके फ़ायरवॉल पर भी खोलने की आवश्यकता है। WRT बूट पर एक नोड उदाहरण शुरू करते हैं, हम बस वितरण की init स्क्रिप्ट / सिस्टमड फाइल का उपयोग करते हैं जो आपको एक उपयोगकर्ता को निर्दिष्ट करने की अनुमति देते हैं।
bk138

116

पोर्ट 80 का उपयोग करने के लिए सुरक्षित उपयोगकर्ता अनुमति दें

याद रखें, हम आपके एप्लिकेशन को रूट उपयोगकर्ता के रूप में नहीं चलाना चाहते हैं, लेकिन एक अड़चन है: आपके सुरक्षित उपयोगकर्ता के पास डिफ़ॉल्ट HTTP पोर्ट (80) का उपयोग करने की अनुमति नहीं है। आप लक्ष्य एक वेबसाइट को प्रकाशित करने में सक्षम होना चाहते हैं जिसे आगंतुक URL जैसे उपयोग करने के लिए एक आसान उपयोग करके नेविगेट कर सकते हैंhttp://ip:port/

दुर्भाग्य से, जब तक आप रूट के रूप में साइन इन नहीं करते, आपको सामान्य रूप से URL का उपयोग करना होगा http://ip:port- जैसे कि पोर्ट नंबर> 1024।

बहुत सारे लोग यहां फंस जाते हैं, लेकिन समाधान आसान है। वहाँ कुछ विकल्प है, लेकिन यह एक मुझे पसंद है। निम्नलिखित कमांड टाइप करें:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

अब, जब आप एक नोड एप्लिकेशन को बताते हैं कि आप इसे पोर्ट 80 पर चलाना चाहते हैं, तो यह शिकायत नहीं करेगा।

इस संदर्भ लिंक की जाँच करें


9
यह बेहतर, सरल उत्तर है।
काइल चड्ढा

2
इसके अलावा, विस्तृत जवाब यहां दिए गए stackoverflow.com/questions/23281895/…
मेहता

1
पोर्ट 80 पर NGINX जैसा वेब सर्वर कैसे चलता है? क्या यह भी कुछ ऐसा ही करता है?
एरिक एंड्रयू लुईस

1
@EricAndrewLewis: मैं कहूंगा कि यह निर्भर करता है। जब आप सर्वर को नॉन-रूट मोड में चला रहे हैं तो यह त्रुटि दिखाई देगी। यदि आप Nginx सर्वर को रूट उपयोगकर्ता के रूप में चला रहे हैं तो क्या होगा! इसके अलावा, अगर सामान्य उपयोगकर्ता के रूप में चल रहा है और त्रुटि हो रही है। पोर्ट तक पहुँचने के लिए सुरक्षित अनुमति देने के लिए ऊपर दिए गए आदेशों को चलाएँ। इसके अलावा stackoverflow.com/questions/31369480/…
मेहता

16

80 (या 443) पोर्ट में बाँधने के बाद रूट विशेषाधिकार छोड़ दें।

यह पोर्ट 80/443 को संरक्षित रखने की अनुमति देता है, जबकि अभी भी आपको रूट के रूप में अनुरोध करने से रोकता है:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

उपरोक्त फ़ंक्शन का उपयोग करके एक पूर्ण कार्य उदाहरण:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

इस पूर्ण संदर्भ में अधिक जानकारी देखें ।


9

पोर्ट 80 (जो मूल प्रश्न था) के लिए, डैनियल बिल्कुल सही है। मैं हाल ही में स्थानांतरित हुआ httpsऔर iptablesएसएसएल सीट्स को प्रबंधित करने वाले एक हल्के नगनेक्स प्रॉक्सी से स्विच करना पड़ा । मैं एक उपयोगी पाया जवाब एक साथ सार द्वारा gabrielhpugliese कैसे है कि संभाल करने के लिए पर। मूल रूप से मैं

उम्मीद है कि किसी और को सिरदर्द से बचा सकता है। मुझे यकीन है कि ऐसा करने का एक शुद्ध-नोड तरीका है, लेकिन nginx जल्दी था और यह काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.