ฉันจะรันแอป node.js เป็นบริการพื้นหลังได้อย่างไร


503

เนื่องจากโพสต์นี้ได้รับความสนใจเป็นอย่างมากในช่วงหลายปีที่ผ่านมาฉันได้แสดงโซลูชันยอดนิยมสำหรับแต่ละแพลตฟอร์มที่ด้านล่างของโพสต์นี้


โพสต์ต้นฉบับ :

ฉันต้องการให้เซิร์ฟเวอร์ node.js ทำงานในพื้นหลังเช่นเมื่อปิดเทอร์มินัลฉันต้องการให้เซิร์ฟเวอร์ทำงานต่อไป ฉันได้ลองทำสิ่งนี้และมาพร้อมกับบทช่วยสอนนี้แต่มันไม่ทำงานตามที่ตั้งใจ ดังนั้นแทนที่จะใช้สคริปต์ daemon นั้นฉันคิดว่าฉันเพิ่งใช้การเปลี่ยนเส้นทางเอาต์พุต ( 2>&1 >> fileส่วน) แต่สิ่งนี้ก็ไม่ได้จบ - ฉันได้รับบรรทัดว่างในเทอร์มินัลของฉันเหมือนกับว่ามันรอเอาต์พุต / ข้อผิดพลาด

ฉันก็พยายามที่จะทำให้กระบวนการในพื้นหลัง แต่ทันทีที่ฉันปิด terminal ของฉันกระบวนการก็ถูกฆ่าเช่นกัน

ดังนั้นฉันจะปล่อยให้มันทำงานอย่างไรเมื่อฉันปิดเครื่องคอมพิวเตอร์ของฉัน


โซลูชันยอดนิยม :


3
ฉันคิดว่าเขาตั้งใจจะปิดระบบท้องถิ่นของเขา
Kamal Reddy

46
เขาหมายถึงการปิดครั้ง ssh สิ้นสุดงาน
thedjaney

5
github.com/Unitech/pm2เป็นผู้จัดการกระบวนการที่ได้รับการบำรุงรักษาสูงและมีเสถียรภาพมากลองทำดู!
Unitech

1
คุณสามารถใช้หน้าจอ ( aperiodic.net/screen/quick_reference )
karantan

คำตอบ:


434

คัดลอกคำตอบของฉันเองจากฉันจะรันแอปพลิเคชัน Node.js เป็นกระบวนการของตัวเองได้อย่างไร

คำตอบในปี 2015 : Linux distro เกือบทุกตัวมาพร้อมกับ systemd ซึ่งหมายความว่าไม่จำกัด monit, PM2 และอื่น ๆ อีกต่อไป - ระบบปฏิบัติการของคุณจัดการกับงานเหล่านี้ได้แล้ว

ทำmyapp.serviceไฟล์ (แทนที่ 'myapp' ด้วยชื่อแอปของคุณอย่างชัดเจน):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

หมายเหตุหากคุณยังใหม่กับ Unix: /var/www/myapp/app.jsควร#!/usr/bin/env nodeอยู่ในบรรทัดแรก

/etc/systemd/systemคัดลอกแฟ้มบริการของคุณลงใน

systemctl start myappเริ่มต้นด้วย

systemctl enable myappเปิดใช้งานได้เพื่อให้ทำงานในการบูตด้วย

ดูบันทึกด้วย journalctl -u myapp

สิ่งนี้นำมาจากวิธีที่เราปรับใช้แอปโหนดบน Linux รุ่น 2018ซึ่งรวมถึงคำสั่งเพื่อสร้าง AWS / DigitalOcean / Azure CloudConfig เพื่อสร้างเซิร์ฟเวอร์ Linux / โหนด (รวมถึง.serviceไฟล์)


4
พุ่งพรวดเมื่อมีก็เป็นทางออกที่ดี ไม่ว่าด้วยวิธีใดคุณไม่ควรพึ่งพากระบวนการ nodejs เพื่อให้ nodejs daemon ของคุณทำงานอยู่ นี่เป็นภารกิจเดียวสำหรับระบบปฏิบัติการเท่านั้น killall nodejs และหายไปตลอดกาล ....
131

19
โปรดทราบว่าอาจเป็นไปได้ที่จะเรียกใช้บริการ systemd ในฐานะผู้ใช้ ดูตัวอย่างการสอนนี้ คุณสามารถใส่ไฟล์บริการของคุณในการ~/.config/systemd/userเริ่มต้นด้วยให้เปิดใช้งานด้วยsystemctl --user start myapp systemctl --user enable myapp
cdauth

5
ขอบคุณสำหรับคำตอบนี้ นี่คือสิ่งที่ฉันต้องการที่บริสุทธิ์และล้าง
bmavus

5
ฉันยอมรับคำตอบนี้แทนที่จะตอบ "ตลอดไป" เนื่องจากฉันคิดว่านี่เป็นวิธีที่ดีที่สุด มีคำตอบที่คล้ายกันสำหรับ Mac & Windows แต่ฉันเดาว่าส่วนใหญ่กำลังมองหาโซลูชัน Linux
ปีเตอร์ Kruithof

11
ในเส้นทาง EC2 AMI / etc / systemd / system ไม่มีอยู่ คุณสามารถระบุเส้นทางที่ถูกต้องใน AWS EC2 Linux AMI ได้อย่างไร
René Michel

241

คุณสามารถใช้ Forever ซึ่งเป็นเครื่องมือ CLI ง่าย ๆ ในการตรวจสอบให้แน่ใจว่าสคริปต์ของโหนดทำงานต่อเนื่อง (เช่นตลอดไป): https://www.npmjs.org/package/forever


4
ด้วยโหนดล่าสุดฉันไม่สามารถหยุดแอพผ่านชื่อสคริปต์ (ข้อผิดพลาด) - เช่นกัน - โดยทั่วไปมักจะทำงานผิดปกติ (อยู่บน OS-X) - ทั้งหมดนี้สร้างขึ้นจากแหล่งที่แปลก ปล่อยให้สิ่งต่าง ๆ อยู่ในสถานะที่ไม่ดีไม่ได้เติมความมั่นใจให้ฉัน
Michael Neale

4
ในขณะที่ nohup ทำกลอุบายตลอดไปเป็นทางออกที่ดีกว่าเพราะมันทำให้กระบวนการต่าง เครื่องมือที่ยอดเยี่ยม!
ปีเตอร์ Kruithof


2
ฉันใช้ Forever ชั่วครู่หนึ่งในตอนแรกทุกอย่างดูโอเค แต่เมื่อเกิดภัยพิบัติ ตลอดกาลไม่สามารถจัดการกระบวนการอีกต่อไปและปล่อยให้พวกเขาเรียกใช้ป่า ยังคงดิ้นรนเพื่อหาทางออกที่ดีกว่า ฉันจะพยายามใช้ nohup
LN

5
จอฟฟรีย์ - ไม่คุณจะต้องทำforever start /path/to/yourApp.jsในสคริปต์เริ่มต้นเซิร์ฟเวอร์ของคุณ
mikermcneil

215

อัพเดท - ดังที่ได้กล่าวไว้ในหนึ่งในคำตอบด้านล่างPM2มีฟังก์ชั่นการใช้งานที่ดีหายไปตลอดกาล พิจารณาใช้มัน

คำตอบเดิม

ใช้nohup :

nohup node server.js &

แก้ไขฉันต้องการเพิ่มว่าคำตอบที่ยอมรับเป็นวิธีที่จะไปจริงๆ ฉันใช้ตลอดไปในกรณีที่ต้องติดตาม ฉันชอบทำnpm install -g foreverมันอยู่ในเส้นทางโหนดและจากนั้นก็ทำforever start server.js


136
ส่วนที่ควรรู้: nohupย่อno hangupมาจากวันเก่าที่คุณต้องการให้คุณมีชีวิตอยู่เมื่อคุณ "วางสาย" โมเด็มของคุณ
jAndy

1
ทุกวันนี้มันค่อนข้างชื่อของสัญญาณ 1 ที่กระบวนการได้รับเพื่อเตือนว่าผู้ใช้ปิดเชลล์ (หรือการเชื่อมต่อโมเด็มที่ขาดหายไป, แน่นอน: P)
lapo

7
มันไม่ใช่ทางออกที่ดีที่สุดเพราะหากแอปพบข้อผิดพลาดที่ไม่ได้ตรวจจับกระบวนการของโหนดจะออกและไม่รีสตาร์ท ถึงกระนั้นก็เป็นตัวเลือกที่เหมาะสมสำหรับการพัฒนา
Andy E

1
ฉันจะเพิ่มตัวแปรสภาพแวดล้อมลงในนั้นได้อย่างไร เช่น PORT = 80 node server.js
Pardoner

1
ลองดูคำตอบนี้จาก SO - stackoverflow.com/questions/8825460/…
NG

67

นี่อาจไม่ใช่วิธีที่ยอมรับ แต่ฉันทำกับหน้าจอโดยเฉพาะอย่างยิ่งในการพัฒนาเพราะฉันสามารถนำมันกลับมาและเล่นกับมันถ้าจำเป็น

screen
node myserver.js
>>CTRL-A then hit D

หน้าจอจะแยกและเอาตัวรอดคุณออกจากระบบ จากนั้นคุณสามารถรับกลับมาทำหน้าจอ -r กดคู่มือหน้าจอเพื่อดูรายละเอียดเพิ่มเติม คุณสามารถตั้งชื่อหน้าจอและอะไรก็ได้ถ้าคุณชอบ


2
นอกจากนี้ tmux ก็ดี ทำงานเหมือนหน้าจอ (CTRL-B เป็นค่าเริ่มต้นแทน CTRL-A แต่สามารถกำหนดค่าได้) Tmux มีแผง (หน้าจอแยก)
snapfractalpop

1
หน้าจอก็มีแผงควบคุมด้วยเช่นกัน
Billy Moon

ฉันใช้สิ่งนี้ตั้งแต่สองสามสัปดาห์สำหรับแอพ meteor `$ screen -dr 'สำหรับการถอดและการใส่กลับเข้าไปใหม่อาจจำเป็นในบางครั้ง
Vinay Vemula

สำหรับฉันวิธีที่ง่ายที่สุดในการทำงานให้สำเร็จ แต่ฉันเห็นด้วยไม่ใช่ทางออกที่ดีที่สุด
Pomme De Terre

วิธีนี้ไม่คงอยู่หลังจากรีบูตระบบ
wnasich

60

การอัปเดตปี 2559: ซีรีย์ node-windows / mac / linux ใช้ API ทั่วไปในทุกระบบปฏิบัติการดังนั้นจึงเป็นโซลูชันที่เกี่ยวข้องอย่างยิ่ง อย่างไรก็ตาม; node-linux สร้างไฟล์ init ของ systemv เนื่องจาก systemd ได้รับความนิยมเพิ่มขึ้นเรื่อย ๆ จึงเป็นตัวเลือกที่ดีกว่าบน Linux PR ยินดีต้อนรับถ้าใครต้องการเพิ่มการสนับสนุน systemd ไปที่ node-linux :-)

กระทู้เดิม:

นี่เป็นเธรดที่ค่อนข้างเก่าแล้วตอนนี้ แต่โหนดของ Windows เป็นอีกวิธีหนึ่งในการสร้างบริการพื้นหลังบน Windows มันขึ้นอยู่กับnssmแนวคิดของการใช้exewrapper รอบ ๆ โหนดสคริปต์ของคุณ อย่างไรก็ตาม; มันใช้winsw.exeแทนและจัดเตรียม wrapper โหนดที่กำหนดค่าได้เพื่อการควบคุมที่ละเอียดยิ่งขึ้นเกี่ยวกับวิธีการเริ่ม / หยุดกระบวนการเมื่อเกิดความล้มเหลว กระบวนการเหล่านี้มีให้บริการเหมือนบริการอื่น ๆ :

ป้อนคำอธิบายรูปภาพที่นี่

โมดูลยังอบในการบันทึกเหตุการณ์บางอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

การกำหนดให้สคริปต์ของคุณสามารถทำได้โดยใช้รหัส ตัวอย่างเช่น:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

โมดูลสนับสนุนสิ่งต่าง ๆ เช่นการรีสตาร์ท capping (สคริปต์ที่ไม่ดีจะไม่ส่งข้อมูลไปยังเซิร์ฟเวอร์ของคุณ) และเพิ่มระยะเวลาระหว่างการรีสตาร์ท

เนื่องจากบริการโหนดหน้าต่างทำงานเหมือนกันจึงเป็นไปได้ที่จะจัดการ / ตรวจสอบบริการด้วยซอฟต์แวร์ใดก็ตามที่คุณใช้อยู่แล้ว

ในที่สุดก็ไม่มีการmakeพึ่งพา กล่าวอีกนัยหนึ่งตรงไปตรงมาnpm install -g node-windowsจะทำงาน คุณไม่จำเป็นต้องใช้ Visual Studio, .NET หรือ node-gyp magic ในการติดตั้ง นอกจากนี้ยังได้รับอนุญาตจาก MIT และ BSD

ในการเปิดเผยแบบเต็มฉันเป็นผู้สร้างโมดูลนี้ มันถูกออกแบบมาเพื่อบรรเทาอาการปวดที่แน่นอนที่ OP ได้รับ แต่ด้วยการผนวกการทำงานที่ระบบปฏิบัติการมอบให้อย่างเข้มงวดมากขึ้น ฉันหวังว่าผู้ชมในอนาคตด้วยคำถามเดียวกันนี้จะเป็นประโยชน์


8
ตอนนี้ฉันได้ทำการย้ายสิ่งนี้ไปยังnode-macโดยมอบการทำงานที่เหมือนกันใน OSX
Corey

1
ฉันมาถึงจุดที่จะกำหนดเวลาโปรแกรม Node สองสามรายการและอยู่ต่อหน้าการตัดสินใจเลือก node-windows, Forever หรือ Kue ฉันเอนไปทางหน้าต่างโหนด แต่ต้องการที่จะเข้าใจว่าทำไมไม่ใช้ Forever หรือ Kue เมื่อฉันต้องการกำหนดเวลาและตรวจสอบโปรแกรมของโหนดโหล บางคนวิ่งไปตลอดกาล จำเป็นต้องมีการตรวจสอบด้วย
Christiaan Westerbeek

5
โหนดหน้าต่างใช้ระบบปฏิบัติการดั้งเดิมสำหรับการจัดการบริการพื้นหลังและบันทึกเหตุการณ์ดั้งเดิมสำหรับบันทึก Forever มีการตรวจสอบและบันทึกที่กำหนดเอง ฉันเขียนบทความเกี่ยวกับเรื่องนี้ที่medium.com/p/2a602ea657a2 ดูเหมือนว่าคุณต้องการกำหนดเวลาสคริปต์ของคุณไม่ใช่ทำงานเป็นบริการพื้นหลังตลอดเวลา โครงการอย่าง Kue และ Agenda ได้รับการออกแบบมาสำหรับสิ่งนี้ Node-windows & Forever ตอบสนองวัตถุประสงค์ที่แตกต่าง
Corey

1
@Corey ฉันจะรันตัวอย่างที่รวมอยู่ใน node-mac ได้อย่างไรจากเทอร์มินัลฉันลองใช้โหนด install.js แต่ดูเหมือนว่าจะไม่สามารถไปรับ helloworld.js ได้
Edwin Ikechukwu Okonkwo

@Edwin - อาจเป็นการดีที่สุดที่จะเปิดคำถามใหม่พร้อมรายละเอียดเพิ่มเติมเกี่ยวกับปัญหารวมถึงรหัสที่คุณใช้
คอเรย์

28

UPDATE : ฉันได้รับการอัพเดตเพื่อรวมไฟล์ล่าสุดจาก pm2:

สำหรับกรณีการใช้งานจำนวนมากการใช้เซอร์วิส systemd เป็นวิธีที่ง่ายและเหมาะสมที่สุดในการจัดการกระบวนการโหนด สำหรับผู้ที่รันกระบวนการโหนดจำนวนมากหรือ microservices ที่ทำงานโดยอิสระในสภาพแวดล้อมเดียว pm2 เป็นเครื่องมือที่มีคุณลักษณะครบถ้วนมากขึ้น

https://github.com/unitech/pm2

http://pm2.io

  • มันมีคุณสมบัติการตรวจสอบที่มีประโยชน์จริง ๆ -> สวย 'gui' สำหรับการตรวจสอบบรรทัดคำสั่งของกระบวนการหลาย ๆ กระบวนการด้วยpm2 monitหรือรายการกระบวนการด้วยpm2 list
  • การจัดการบันทึกที่จัด -> pm2 logs
  • อย่างอื่น:
    • การกำหนดค่าพฤติกรรม
    • การสนับสนุนแผนที่แหล่งที่มา
    • รองรับ PaaS
    • ดู & โหลดซ้ำ
    • ระบบโมดูล
    • โหลดหน่วยความจำสูงสุด
    • โหมดคลัสเตอร์
    • โหลดซ้ำร้อนแรง
    • ขั้นตอนการพัฒนา
    • สคริปต์เริ่มต้น
    • การทำให้สมบูรณ์อัตโนมัติ
    • เวิร์กโฟลว์การปรับใช้
    • การตรวจสอบ Keymetrics
    • API

20

หากคุณต้องการเรียกใช้สคริปต์อย่างต่อเนื่องจนกว่าจะเสร็จสิ้นคุณสามารถใช้งานได้nohupตามที่ระบุไว้แล้วในคำตอบที่นี่ แต่ไม่มีคำตอบให้คำสั่งเต็มรูปแบบที่นอกจากนี้ยังบันทึกและstdinstdout

nohup node index.js >> app.log 2>&1 &
  • วิธีผนวกกับ>>app.log
  • 2>&1ทำให้แน่ใจว่าข้อผิดพลาดนอกจากนี้ยังส่งไปและเพิ่มการstdoutapp.log
  • ตอนจบ&ทำให้แน่ใจว่าเทอร์มินัลปัจจุบันของคุณถูกตัดการเชื่อมต่อจากคำสั่งเพื่อให้คุณสามารถทำงานต่อไปได้

หากคุณต้องการที่จะเรียกใช้เซิร์ฟเวอร์โหนด (หรือบางสิ่งบางอย่างที่ควรจะเริ่มกลับมาขึ้นเมื่อมีการรีสตาร์ทเซิร์ฟเวอร์) คุณควรใช้systemd / systemctl


1
คำตอบที่ดีที่สุด m8
bholagabbar

1
อธิบายอย่างดี
Prakhar Prakash Bhardwaj

19

หากคุณใช้ OSX วิธีที่ง่ายที่สุดในการสร้างกระบวนการของระบบจริงก็คือการใช้งาน launchdเพื่อเรียก

สร้าง Plist แบบนี้และใส่ไว้ใน / Library / LaunchDaemons ด้วยชื่อtop-level-domain.your-domain.application.plist(คุณต้องเป็น root เมื่อทำการวาง):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

เมื่อเสร็จแล้วให้ออกสิ่งนี้ (เหมือนรูท):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

และคุณกำลังทำงาน

และคุณจะยังคงทำงานหลังจากรีสตาร์ท

สำหรับตัวเลือกอื่น ๆ ใน plist ดูที่ man page ได้ที่นี่: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


สิ่งนี้ผู้ใช้จะเรียกใช้บริการเป็นอย่างไร มีวิธีตั้งค่าผู้ใช้หรือไม่?
rjmunro

15

ลองใช้คำสั่งนี้หากคุณใช้ nohup -

nohup npm start 2>/dev/null 1>/dev/null&

คุณสามารถใช้ตลอดไปเพื่อเริ่มเซิร์ฟเวอร์

forever start -c "npm start" ./ 

PM2 ยังรองรับ npm start

pm2 start npm -- start

2
ขอบคุณมันทำงานได้อย่างสมบูรณ์แบบ pm2 start npm -- start
yadavr

13

ฉันแค่ใช้daemon npm module:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

เมื่อเร็ว ๆ นี้ฉันยังใช้mon (1)จากTJ Holowaychukเพื่อเริ่มและจัดการแอปแบบง่าย ๆ


12

ฉันใช้หัวหน้างานเพื่อการพัฒนา มันใช้งานได้ เมื่อใดก็ตามที่คุณทำการเปลี่ยนแปลงกับ. js file Supervisor จะรีสตาร์ทแอปของคุณโดยอัตโนมัติเมื่อโหลดการเปลี่ยนแปลงเหล่านั้น

นี่คือลิงค์ไปยังหน้า Github

ติดตั้ง:

sudo npm install supervisor -g

คุณสามารถทำให้มันดูส่วนขยายอื่น ๆ ด้วย -e คำสั่งอื่นที่ฉันใช้บ่อยคือ -i เพื่อข้ามโฟลเดอร์บางโฟลเดอร์

คุณสามารถใช้ nohup และผู้ควบคุมดูแลเพื่อให้แอปโหนดของคุณทำงานในพื้นหลังแม้หลังจากคุณออกจากระบบ

sudo nohup หัวหน้างาน myapp.js &


1
ฉันคิดว่าผู้ฝึกปฏิบัติเป็นตัวเลือกที่ดีกว่าโมดูล daemon ส่วนใหญ่โดยเฉพาะอย่างยิ่งใช้ร่วมกับ webhook เพื่อเช็คเอาท์อัปเดต
เลนคอลลินส์

ฉันสองนี้ หากคุณเปลี่ยนไฟล์ PHP คุณจะรีสตาร์ทเซิร์ฟเวอร์ Apache หรือ Nginx หรือไม่ ไม่อย่างแน่นอน. ถ้าเช่นนั้นทำไมต้องรีสตาร์ทเซิร์ฟเวอร์ Node.js ทั้งหมดแม้เพียงแค่เปลี่ยนรหัสหนึ่งบรรทัด แม้ว่านี่อาจไม่ใช่วิธีที่ดีที่สุด แต่ให้เช่ากับหัวหน้างานคุณไม่จำเป็นต้องกังวลเกี่ยวกับกระบวนการรีสตาร์ท (จริง ๆ แล้วการรีสตาร์ทยังคงเกิดขึ้น)
Zhang Buzz

7

Node.js เป็นบริการพื้นหลังในWINDOWS XP

การติดตั้ง:

  1. ติดตั้ง WGET http://gnuwin32.sourceforge.net/packages/wget.htmผ่านทางโปรแกรมติดตั้ง
  2. ติดตั้ง GIT http://code.google.com/p/msysgit/downloads/listผ่านทางโปรแกรมติดตั้ง
  3. ติดตั้ง NSSM http://nssm.cc/download/?page=downloadผ่านการคัดลอก nnsm.exe ไปยังโฟลเดอร์% windir% / system32
  4. สร้าง c: \ node \ helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. เปิดคอนโซลคำสั่งและพิมพ์ดังต่อไปนี้ (setx เฉพาะเมื่อติดตั้ง Resource Kit)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. Goodie batch Goodie คือการสร้าง c: \ node \ ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

การจัดการบริการ:

  • ตอนนี้บริการต่างๆสามารถเข้าถึงได้ผ่านทาง Start-> Run-> services.msc หรือผ่านทาง Start-> Run-> MSCONFIG-> Services (และทำเครื่องหมาย 'Hide All Microsoft Services')
  • สคริปต์จะนำหน้าทุกโหนดที่ทำผ่านชุดสคริปต์ด้วย 'node-'
  • ในทำนองเดียวกันพวกเขาสามารถพบได้ในรีจิสทรี: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "

7

คำตอบที่ได้รับการยอมรับอาจเป็นคำตอบที่ดีที่สุดสำหรับการผลิต แต่สำหรับการแฮ็คอย่างรวดเร็วในการทำงาน dev ฉันพบสิ่งนี้:

nodejs scriptname.js & ใช้งานไม่ได้เนื่องจาก nodejs ดูเหมือนจะฮุบ & & ดังนั้นสิ่งที่ไม่ให้ฉันใช้ terminal โดยไม่ต้อง scriptname.js กำลังจะตาย

แต่ฉันใส่nodejs scriptname.jsในไฟล์. sh และใช้ nohup sh startscriptname.sh &งานได้

ไม่ใช่สิ่งที่ใช้ในการผลิตแน่นอน แต่มันแก้ปัญหา "ฉันต้องการใช้เทอร์มินัลของฉันต่อไปและไม่ต้องการเริ่มต้น 5 เทอร์มินัลที่แตกต่างกัน"


4

หากคุณใช้งาน nodejs ในเซิร์ฟเวอร์ linux ฉันคิดว่านี่เป็นวิธีที่ดีที่สุด

สร้างสคริปต์บริการและคัดลอกไปยัง /etc/init/nodejs.conf

start service: sudo service nodejs start

หยุดบริการ: sudo service nodejs หยุด

สคริปต์บริการ

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

4

อัปเดตมิถุนายน 2560:
โซลูชันสำหรับ Linux: (Red hat) ความคิดเห็นก่อนหน้านี้ใช้ไม่ได้สำหรับฉัน สิ่งนี้ใช้ได้กับฉันใน Amazon Web Service - Red Hat 7 หวังว่าจะได้ผลกับคนที่อยู่ข้างนอก

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add

น่าสนใจมากฉันแค่อยากรู้iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080ว่ามันทำอะไร คุณช่วยให้รายละเอียดเพิ่มเติมหน่อยได้ไหม ฉันไม่แน่ใจ แต่ฉันคิดว่ามันเปลี่ยนเส้นทางการรับส่งข้อมูล80ไปยัง8080โหนดเซิร์ฟเวอร์ที่รับฟังใช่ไหม
Shakiba Moshiri

3

ใช้nssm ทางออกที่ดีที่สุดสำหรับ windows เพียงดาวน์โหลดnssm , เปิด cmd ไปยังไดเรกทอรี nssm และพิมพ์

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

สิ่งนี้จะติดตั้งบริการ windows ใหม่ซึ่งจะแสดงอยู่ที่services.mscจากที่นั่นคุณสามารถเริ่มหรือหยุดบริการบริการนี้จะเริ่มโดยอัตโนมัติและคุณสามารถกำหนดค่าให้เริ่มต้นใหม่หากล้มเหลว


2

ออกรอบตัวเลือกต่างๆที่แนะนำที่นี่เป็นอีกหนึ่งคือdaemonคำสั่งใน GNU / Linux ซึ่งคุณสามารถอ่านข้อมูลเกี่ยวกับที่นี่: http://libslack.org/daemon/manpages/daemon.1.html (ขออภัยหากสิ่งนี้ถูกกล่าวถึงแล้วในหนึ่งในความคิดเห็นด้านบน)



1

มีใครสังเกตเห็นความผิดพลาดเล็กน้อยของตำแหน่ง "2> & 1" หรือไม่

2>&1 >> file

ควรจะเป็น

>> file 2>&1

1

ฉันใช้ tmux สำหรับสภาพแวดล้อมการพัฒนาหลายหน้าต่าง / บานหน้าต่างบนโฮสต์ระยะไกล มันง่ายมากที่จะแยกออกและทำให้กระบวนการทำงานในพื้นหลัง ดูที่tmux


1

สำหรับผู้ที่ใช้โมดูลdaemon npm เวอร์ชันใหม่กว่า- คุณต้องส่งไฟล์ descriptors แทนสตริง:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

0

PM2 เป็นผู้จัดการกระบวนการผลิตสำหรับแอปพลิเคชัน Node.js ที่มี load balancer ในตัว จะช่วยให้คุณสามารถใช้งานแอปพลิเคชั่นได้ตลอดไปเพื่อโหลดซ้ำโดยไม่ต้องหยุดทำงานและเพื่ออำนวยความสะดวกในการดูแลระบบทั่วไป https://github.com/Unitech/pm2


ปัญหาการใช้หน่วยความจำร้ายแรง! ไปเพื่อ phusion + nginx
Rizwan Patel

0

ฉันประหลาดใจที่ไม่มีใครพูดถึงGuvnor

ฉันได้ลองตลอดไป, pm2 เป็นต้น แต่เมื่อพูดถึงการควบคุมที่แข็งแกร่งและการวัดประสิทธิภาพบนเว็บฉันได้พบว่าGuvnorนั้นดีที่สุด นอกจากนี้ยังเป็นโอเพนซอร์สอย่างเต็มรูปแบบ

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข: อย่างไรก็ตามฉันไม่แน่ใจว่ามันทำงานบน windows ฉันใช้มันบน linux เท่านั้น


4
ดูเหมือนว่าจะค้างเมื่อปี 2560 ความล้มเหลวในการสร้าง ไม่มีรหัสในปีที่ผ่านมา น่าสงสัย
azatar

0

เนื่องจากฉันไม่มีตัวเลือกนี้ในรายการคำตอบที่ให้ฉันต้องการเพิ่มตัวเลือกที่มีสิทธิ์ตั้งแต่ปีพ. ศ. 2563: นักเทียบท่าหรือแพลตฟอร์มคอนเทนเนอร์เทียบเท่า นอกจากนี้เพื่อให้มั่นใจว่าแอปพลิเคชันของคุณทำงานในสภาพแวดล้อมที่มั่นคงมีประโยชน์ด้านความปลอดภัยเพิ่มเติมเช่นเดียวกับการพกพาที่ดีขึ้น

มีการสนับสนุนนักเทียบท่าสำหรับ Windows, macOS และส่วนใหญ่ / การกระจาย Linux ที่สำคัญ การติดตั้งนักเทียบท่าบนแพลตฟอร์มที่รองรับนั้นค่อนข้างตรงไปตรงมาและมีเอกสารครบถ้วน การตั้งค่าแอปพลิเคชัน Node.js นั้นง่ายเหมือนการวางไว้ในคอนเทนเนอร์และเรียกใช้คอนเทนเนอร์นั้นในขณะที่ตรวจสอบให้แน่ใจว่ามีการเริ่มต้นใหม่หลังจากปิดเครื่อง

สร้างภาพคอนเทนเนอร์

สมมติว่าแอปพลิเคชันของคุณมีอยู่ใน/ home / me / my-appบนเซิร์ฟเวอร์นั้นให้สร้างไฟล์ข้อความDockerfileในโฟลเดอร์/ home / me / my-app ที่มีเนื้อหาคล้ายกับแอพนี้:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

สร้างภาพโดยใช้คำสั่งดังนี้:

docker build -t myapp-as-a-service /home/me

หมายเหตุ:พารามิเตอร์สุดท้ายคือการเลือกโฟลเดอร์ที่มี Dockerfile นั้นแทนที่จะเป็น Dockerfile นั้นเอง คุณอาจเลือกที่แตกต่างกันอย่างใดอย่างหนึ่งโดยใช้ตัวเลือก-f

เริ่มคอนเทนเนอร์

ใช้คำสั่งนี้เพื่อเริ่มคอนเทนเนอร์:

docker run -d --restart always -p 80:3000 myapp-as-a-service

คำสั่งนี้สมมติว่าแอปของคุณกำลังฟังพอร์ต 3000 และคุณต้องการให้แอปนี้เปิดที่พอร์ต 80 ของโฮสต์ของคุณ

นี่เป็นตัวอย่างที่ จำกัด อย่างแน่นอน แต่มันเป็นจุดเริ่มต้นที่ดี


0

หากคุณใช้ pm2 คุณสามารถใช้พร้อมกับautorestartตั้งค่าเป็นfalse:

ระบบนิเวศ $ pm2

สิ่งนี้จะสร้างตัวอย่างecosystem.config.js:

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$ pm2 เริ่มระบบนิเวศ. config.js


-1

คำตอบนี้ค่อนข้างช้าสำหรับงานปาร์ตี้ แต่ฉันพบว่าทางออกที่ดีที่สุดคือการเขียนเชลล์สคริปต์ที่ใช้ทั้งคำสั่งscreen -dmSและnohup

screen -dmS newScreenName nohup node myserver.js >> logfile.log

ฉันยังเพิ่ม>> logfileบิตในตอนท้ายเพื่อให้ฉันสามารถบันทึกconsole.log()คำสั่งโหนดได้อย่างง่ายดาย

ทำไมฉันถึงใช้เชลล์สคริปต์ ฉันยังเพิ่มในคำสั่ง if ที่ตรวจสอบเพื่อดูว่าnode myserver.jsกระบวนการทำงานอยู่แล้ว

ด้วยวิธีนี้ฉันสามารถสร้างตัวเลือกบรรทัดคำสั่งเดียวที่ทั้งสองช่วยให้ฉันทำงานต่อไปของเซิร์ฟเวอร์และเริ่มใหม่เมื่อฉันทำการเปลี่ยนแปลงซึ่งเป็นประโยชน์อย่างมากสำหรับการพัฒนา


2
ฉันพบปัญหานี้แล้วและค่อนข้างใหม่สำหรับ Linux คุณจะทำอย่างไรโดยไม่ใช้หน้าจอหรือไม่มีการเร่งความเร็ว
Craig Norton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.