วิธีที่ดีที่สุดในการปรับใช้ Node.js คืออะไร
ฉันมี Dreamhost VPS (นั่นคือสิ่งที่พวกเขาเรียกว่าVM ) และฉันสามารถติดตั้ง Node.js และตั้งค่าพร็อกซีได้ มันใช้งานได้ดีตราบใดที่ฉันรักษาการเชื่อมต่อ SSH ที่ฉันเริ่มโหนดด้วยการเปิด
วิธีที่ดีที่สุดในการปรับใช้ Node.js คืออะไร
ฉันมี Dreamhost VPS (นั่นคือสิ่งที่พวกเขาเรียกว่าVM ) และฉันสามารถติดตั้ง Node.js และตั้งค่าพร็อกซีได้ มันใช้งานได้ดีตราบใดที่ฉันรักษาการเชื่อมต่อ SSH ที่ฉันเริ่มโหนดด้วยการเปิด
คำตอบ:
คำตอบในปี 2559 : การกระจาย Linux เกือบทุกเครื่องมาพร้อมกับ 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=nobody
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
โฟลเดอร์
บอก systemd systemctl daemon-reload
เกี่ยวกับบริการใหม่ที่มี
systemctl start myapp
เริ่มต้นด้วย
systemctl enable myapp
เปิดใช้งานได้เพื่อให้ทำงานในการบูตด้วย
ดูบันทึกด้วย journalctl -u myapp
สิ่งนี้นำมาจากวิธีที่เราปรับใช้แอปโหนดบน Linux รุ่น 2018ซึ่งรวมถึงคำสั่งเพื่อสร้าง AWS / DigitalOcean / Azure CloudConfig เพื่อสร้างเซิร์ฟเวอร์ Linux / โหนด (รวมถึง.service
ไฟล์)
Failed to issue method call: Unit name ... is not valid.
?
/etc/systemd/system
คุณอาจต้องเรียกใช้systemctl daemon-reload
(โดยปกติ systemd จะแจ้งให้คุณทราบหากจำเป็น) TBH นี่เป็นคำถามที่ดีที่สุดในการแยกคำถาม
/etc/systemd/system
คุณสามารถใช้systemctl enable /full/path/to/myapp.service
ซึ่งสร้าง symlink ไว้/etc/systemd/system
สำหรับคุณ
node
ถูกเรียกโดย/var/www/myapp/app.js
ตัวมันเอง ใน Unix หากคุณสร้างไฟล์ที่ปฏิบัติการได้และบรรทัดแรกเริ่มต้นด้วย#!/some/file
ไฟล์จะถูกตีความด้วยไบนารีนั้น Google 'Unix ล่าม' เพื่อทราบข้อมูลเพิ่มเติม
ใช้ตลอดไป มันรันโปรแกรม Node.js ในกระบวนการที่แยกต่างหากและเริ่มต้นใหม่หากมีการตาย
การใช้งาน:
forever start example.js
เพื่อเริ่มกระบวนการforever list
เพื่อดูรายการกระบวนการทั้งหมดที่เริ่มโดยตลอดไปforever stop example.js
เพื่อหยุดกระบวนการหรือforever stop 0
หยุดกระบวนการด้วยดัชนี 0 (ดังที่แสดงโดยforever list
)forever stop 0
มีข้อผิดพลาดและสิ่งต่าง ๆ เพียงแค่ตกไปจากที่นั่น ฉันพยายามทำสิ่งนี้โดยไม่ต้องรูทผู้ใช้ของตัวเองเพื่อที่ฉันจะได้ทำความสะอาดได้ง่ายขึ้นเมื่อฉันพบทางออกที่ถูกต้อง นั่นอาจเป็นปัญหาของฉัน ฉันจะดูมันอีกบางส่วน
ฉันเขียนเกี่ยวกับวิธีการปรับใช้ของฉันที่นี่: การปรับใช้แอป node.js
ในระยะสั้น:
pm2ทำเทคนิค
คุณสมบัติคือ: การตรวจสอบ, การโหลดรหัสร้อน, ตัวปรับสมดุลโหลดในตัว, สคริปต์เริ่มต้นอัตโนมัติ, และกระบวนการคืนชีพ / การถ่ายโอนข้อมูล
คุณสามารถใช้monit
, forever
, upstart
หรือsystemd
เพื่อเริ่มต้นเซิร์ฟเวอร์ของคุณ
คุณสามารถใช้ Varnish หรือ HAProxy แทน Nginx (Nginx เป็นที่รู้จักกันว่าจะไม่ทำงานกับ websockets)
ในฐานะที่เป็นวิธีที่รวดเร็วและสกปรกที่คุณสามารถใช้nohup node your_app.js &
เพื่อป้องกันไม่ให้ยุติแอปของคุณกับเซิร์ฟเวอร์ของคุณ แต่forever
, monit
และโซลูชั่นที่นำเสนออื่น ๆ จะดีกว่า
ฉันสร้างสคริปต์ Upstart ในปัจจุบันสำหรับแอปของฉัน:
description "YOUR APP NAME"
author "Capy - http://ecapy.com"
env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"
######################################################
start on runlevel [2345]
stop on runlevel [016]
respawn
respawn limit 99 5
pre-start script
mkdir -p $PID_PATH
mkdir -p /var/log/node
end script
script
export NODE_ENV=$SERVER_ENV
exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script
post-start script
echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script
กำหนดทั้งหมดก่อน ######### สร้างไฟล์ใน /etc/init/your-service.conf และวางไว้ที่นั่น
จากนั้นคุณสามารถ:
start your-service
stop your-service
restart your-service
status your-service
ฉันได้เขียนคำแนะนำที่ครอบคลุมเกี่ยวกับการปรับใช้ Node.js ด้วยไฟล์ตัวอย่าง:
บทช่วยสอน: วิธีปรับใช้แอปพลิเคชัน Node.js ด้วยตัวอย่าง
มันครอบคลุมสิ่งที่ต้องการ http-พร็อกซี่, SSLและSocket.IO
นี่คือบทความอีกต่อไปในการแก้ปัญหานี้ด้วย systemd: http://savanne.be/articles/deploying-node-js-with-systemd/
สิ่งที่ควรทราบ:
ทุกสิ่งเหล่านี้สามารถทำได้อย่างง่ายดายด้วย systemd
หากคุณมีสิทธิ์เข้าถึงรูทคุณควรตั้งค่าดีมอนเพื่อให้ทำงานได้อย่างปลอดภัยและมีเสียงในพื้นหลัง คุณสามารถอ่านวิธีการทำเพียงแค่ว่าสำหรับDebianและUbuntuในบล็อกโพสต์เรียก Node.js เป็นบริการบน Ubuntu
ตลอดกาลจะทำเคล็ดลับ
@ เควิน: คุณควรจะสามารถฆ่ากระบวนการได้ดี ฉันจะตรวจสอบเอกสารอีกเล็กน้อย หากคุณสามารถทำให้เกิดข้อผิดพลาดได้จะเป็นการดีถ้าคุณโพสต์เป็นปัญหาใน GitHub
คู่มือที่ยอดเยี่ยมและมีรายละเอียดสำหรับการปรับใช้แอพ Node.js ด้วย Capistrano, Upstart และ Nginx
ดังที่ Box9 กล่าวว่าForeverเป็นตัวเลือกที่ดีสำหรับรหัสการผลิต แต่ก็เป็นไปได้ที่กระบวนการจะดำเนินต่อไปแม้ว่าการเชื่อมต่อSSHจะถูกปิดจากไคลเอนต์
ในขณะที่ไม่จำเป็นต้องเป็นความคิดที่ดีสำหรับการผลิตสิ่งนี้มีประโยชน์มากเมื่ออยู่ในช่วงกลางของการดีบักที่ยาวนานหรือเพื่อติดตามเอาต์พุตคอนโซลของกระบวนการที่มีความยาวหรือเมื่อใดก็ตามที่มีประโยชน์ในการตัดการเชื่อมต่อ SSH ของคุณ เพื่อเชื่อมต่อใหม่ในภายหลัง (เช่นเริ่มแอปพลิเคชัน Node.js ที่บ้านและเชื่อมต่อกับคอนโซลอีกครั้งในที่ทำงานเพื่อตรวจสอบว่าเกิดอะไรขึ้น)
สมมติว่าเซิร์ฟเวอร์ของคุณเป็นกล่อง * ระวังคุณสามารถใช้คำสั่งหน้าจอจากเชลล์เพื่อให้กระบวนการทำงานต่อไปแม้ว่าไคลเอ็นต์ SSH จะปิด คุณสามารถดาวน์โหลด / ติดตั้งหน้าจอจากเว็บหากยังไม่ได้ติดตั้ง (มองหาแพ็คเกจสำหรับการแจกจ่ายของคุณหาก Linux หรือใช้MacPortsถ้า OS X)
มันทำงานได้ดังต่อไปนี้:
คุณสามารถมีเซสชันหลายหน้าจอที่ทำงานพร้อมกันเช่นนี้หากคุณต้องการและคุณสามารถเชื่อมต่อกับมันจากลูกค้าใด ๆ อ่านเอกสารออนไลน์สำหรับตัวเลือกทั้งหมด
Forever เป็นตัวเลือกที่ดีในการทำให้แอปทำงานอยู่ (และสามารถติดตั้งเป็นโมดูลซึ่งดีมาก)
แต่สำหรับการ 'ปรับใช้' ที่จริงจังกว่า - สิ่งต่าง ๆ เช่นการจัดการระยะไกลของการปรับใช้การรีสตาร์ทการเรียกใช้คำสั่งและอื่น ๆ - ฉันจะใช้ capistrano กับส่วนขยายโหนด
https://paastor.comเป็นบริการใหม่ที่ปรับใช้กับคุณไปยัง VPS หรือเซิร์ฟเวอร์อื่น ๆ มี CLI ที่จะผลักดันรหัส Paastor มีเทียร์ฟรีอย่างน้อยก็ทำตอนโพสต์นี้
ในกรณีของคุณคุณสามารถใช้daemon พุ่งพรวด สำหรับการแก้ปัญหาการใช้งานที่สมบูรณ์ผมอาจแนะนำCapistrano สองคำแนะนำที่มีประโยชน์มีวิธีการติดตั้ง Node.js envและวิธีการปรับใช้ผ่าน Capistrano + พุ่งพรวด