Tôi đang sử dụng mô-đun mãi mãi của nút để giữ cho máy chủ nút của tôi chạy. Tuy nhiên, mãi mãi chấm dứt khi có một hệ thống khởi động lại. Có cách nào để tôi có thể tự động khởi động máy chủ nút (mãi mãi) khi hệ thống khởi động lại không?
Tôi đang sử dụng mô-đun mãi mãi của nút để giữ cho máy chủ nút của tôi chạy. Tuy nhiên, mãi mãi chấm dứt khi có một hệ thống khởi động lại. Có cách nào để tôi có thể tự động khởi động máy chủ nút (mãi mãi) khi hệ thống khởi động lại không?
Câu trả lời:
Tôi sẽ đề nghị sử dụng crontab. Thật dễ dàng để sử dụng.
Để bắt đầu chỉnh sửa, hãy chạy phần sau thay thế "người kiểm tra" bằng người dùng thời gian chạy mong muốn của bạn cho quy trình nút. Nếu bạn chọn một người dùng khác ngoài chính mình, bạn sẽ phải chạy nó với sudo.
$ crontab -u testuser -e
Nếu bạn chưa bao giờ làm điều này trước đây, nó sẽ hỏi bạn muốn chỉnh sửa với trình soạn thảo nào. Tôi thích vim, nhưng sẽ giới thiệu nano để dễ sử dụng.
Khi ở trong trình chỉnh sửa, thêm dòng sau:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
Lưu các tập tin. Bạn sẽ nhận được một số thông tin phản hồi rằng cron đã được cài đặt.
Để xác nhận thêm về việc cài đặt cron, hãy thực hiện như sau (một lần nữa thay thế "người kiểm tra" bằng tên người dùng mục tiêu của bạn) để liệt kê các crons hiện được cài đặt:
$ crontab -u testuser -l
Lưu ý rằng theo tôi, bạn nên luôn luôn sử dụng các đường dẫn đầy đủ khi thực hiện các nhị phân trong cron. Ngoài ra, nếu đường dẫn đến tập lệnh mãi mãi của bạn không chính xác, hãy chạy which forever
để có được đường dẫn đầy đủ.
Cho rằng forever
các cuộc gọi đó node
, bạn cũng có thể muốn cung cấp đường dẫn đầy đủ đến node
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
@reboot
cron's chạy trên cron deamon bắt đầu. Thêm vào đó, tôi chưa bao giờ gặp phải một tình huống có thể gợi ý rằng cron của tôi được đặt ở chế độ @reboot
không chạy khi khởi động hệ thống. Cách bạn tắt nó là không liên quan cho việc này.
/home
chưa được gắn kết, vì vậy điều này sẽ không hoạt động nếu mã của bạn tồn tại /home
.
@reboot varname=value ...
Bạn có thể sử dụng dịch vụ mãi mãi để làm điều này.
npm install -g forever-service
forever-service install test
Điều này sẽ cung cấp app.js trong thư mục hiện tại dưới dạng dịch vụ mãi mãi. Dịch vụ sẽ tự động khởi động lại mỗi khi hệ thống được khởi động lại. Ngoài ra khi dừng lại, nó sẽ cố gắng dừng lại duyên dáng. Kịch bản này cũng cung cấp kịch bản logrotate.
Github url: https://github.com/zapty/forver-service
LƯU Ý: Tôi là tác giả của dịch vụ mãi mãi.
forever-service install test
, test
sẽ là tên của dịch vụ , nhưng không phải là tên của tệp .js chương trình / nút thực tế để chạy. Theo mặc định, nó giả sử tên của chương trình là app.js
, nhưng bạn có thể ghi đè lên nó bằng --script
cờ, như sau : forever-service install test --script main.js
. (Chưa được kiểm tra, vì vậy vui lòng sửa cho tôi nếu có bất kỳ chi tiết cú pháp nào sai.)
Trường hợp này là hợp lệ cho Debian.
Thêm vào đây /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
thay thế tên người dùng của bạn. {{app path}}
thay thế đường dẫn ứng dụng của bạn. Ví dụ,/var/www/test/app.js
/etc/rc.local
chứ không phải/etc/init.d/rc.local
/etc/rc.local
thực hiện thủ thuật cho tôi:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Cài đặt PM2 trên toàn cầu bằng NPM
npm install pm2 -g
Bắt đầu kịch bản của bạn với pm2
pm2 start app.js
tạo một kịch bản khởi động hoạt động
pm2 startup
LƯU Ý: khởi động pm2 là để khởi động PM2 khi hệ thống khởi động lại. PM2 một khi đã bắt đầu, khởi động lại tất cả các quy trình mà nó đã quản lý trước khi hệ thống ngừng hoạt động.
Trong trường hợp bạn muốn tắt tự động khởi động, chỉ cần sử dụng pm2 unstartup
Nếu bạn muốn tập lệnh khởi động được thực thi dưới một người dùng khác, chỉ cần sử dụng -u <username>
tùy chọn và--hp <user_home>:
Một phương pháp thay thế crontab lấy cảm hứng từ đây câu trả lời và này bài đăng blog.
1. Tạo tệp bash script (thay đổi bob thành người dùng mong muốn).
vi /home/bob/node_server_init.sh
2. Sao chép và dán tệp này vào trong tệp bạn vừa tạo.
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
Hãy chắc chắn để chỉnh sửa các đường dẫn ở trên theo cấu hình của bạn!
3. Hãy chắc chắn rằng tập lệnh bash có thể được thực thi.
chmod 700 /home/bob/node_server_init.sh
4. Kiểm tra tập lệnh bash.
sh /home/bob/node_server_init.sh
5. Thay thế "bob" bằng người dùng thời gian chạy cho nút.
crontab -u bob -e
6. Sao chép và dán (thay đổi bob cho người dùng mong muốn).
@reboot /bin/sh /home/bob/node_server_init.sh
Lưu crontab.
Bạn đã làm cho đến cuối cùng, giải thưởng của bạn là một khởi động lại (để kiểm tra) :)
Trả lời sao chép từ câu hỏi đính kèm .
Bạn có thể sử dụng PM2 , đây là trình quản lý quy trình sản xuất cho các ứng dụng Node.js với bộ cân bằng tải tích hợp.
Cài đặt PM2
$ npm install pm2 -g
Bắt đầu một ứng dụng
$ pm2 start app.js
Nếu bạn sử dụng express thì bạn có thể bắt đầu ứng dụng của mình như
pm2 start ./bin/www --name="app"
Liệt kê tất cả các quy trình đang chạy:
$ pm2 list
Nó sẽ liệt kê tất cả quá trình. Sau đó, bạn có thể dừng / khởi động lại dịch vụ của mình bằng cách sử dụng ID hoặc Tên của ứng dụng bằng lệnh sau.
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
Để hiển thị nhật ký
$ pm2 logs ['all'|app_name|app_id]
$pm2 startup
Sau đó, bạn sẽ thấy pm2 yêu cầu tự chạy một lệnh, sao chép và chạy lệnh đó. Sau đó, $pm2 save
Bây giờ app.js của bạn sẽ tồn tại trong quá trình khởi động lại hệ thống
Bạn cần tạo một tập lệnh shell trong thư mục /etc/init.d cho điều đó. Sẽ khá phức tạp nếu bạn chưa bao giờ thực hiện nó nhưng có rất nhiều thông tin trên web về các tập lệnh init.d.
Đây là một tập lệnh mẫu mà tôi đã tạo để chạy một trang CoffeeScript mãi mãi:
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
Tôi phải đảm bảo rằng thư mục và PATH được đặt rõ ràng hoặc có sẵn cho người dùng root vì các tập lệnh init.d được chạy dưới dạng root.
Sử dụng PM2
Đó là tùy chọn tốt nhất để chạy máy chủ sản xuất máy chủ
Những lợi thế của việc chạy ứng dụng của bạn theo cách này là gì?
PM2 sẽ tự động khởi động lại ứng dụng của bạn nếu nó gặp sự cố.
PM2 sẽ giữ một bản ghi các trường hợp ngoại lệ chưa được xử lý của bạn - trong trường hợp này, trong một tệp tại /home/safeuser/.pm2/logs/app-err.log.
Với một lệnh, PM2 có thể đảm bảo rằng mọi ứng dụng mà nó quản lý khởi động lại khi máy chủ khởi động lại. Về cơ bản, ứng dụng nút của bạn sẽ bắt đầu như một dịch vụ.
Mãi mãi không được thực hiện để có được các ứng dụng nút chạy như các dịch vụ. Cách tiếp cận đúng là tạo một mục / etc / inittab (hệ thống linux cũ) hoặc mới bắt đầu (hệ thống linux mới hơn).
Dưới đây là một số tài liệu về cách thiết lập tính năng này như một sự khởi đầu: https://github.com/cvee/node-upstart
crontab
không hoạt động với tôi trên CentOS x86 6.5. @reboot dường như không hoạt động.
Cuối cùng tôi đã có giải pháp này:
Biên tập: /etc/rc.local
sudo vi /etc/rc.local
Thêm dòng này vào cuối tập tin. Thay đổi USER_NAME
và PATH_TO_PROJECT
của riêng bạn. NODE_ENV=production
có nghĩa là ứng dụng chạy trong chế độ sản xuất. Bạn có thể thêm nhiều dòng nếu bạn cần chạy nhiều hơn một ứng dụng node.js.
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
Không được đặt NODE_ENV
trong một dòng riêng biệt, ứng dụng của bạn sẽ vẫn chạy trong chế độ phát triển, vì mãi mãi không nhận được NODE_ENV
.
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
Lưu và thoát vi (nhấn ESC : w q return
). Bạn có thể thử khởi động lại máy chủ của bạn. Sau khi máy chủ của bạn khởi động lại, ứng dụng node.js của bạn sẽ tự động chạy, ngay cả khi bạn không đăng nhập vào bất kỳ tài khoản nào từ xa thông qua ssh.
Bạn nên thiết lập NODE_ENV
môi trường trong vỏ của bạn. NODE_ENV
sẽ được đặt tự động khi tài khoản của bạn USER_NAME
đăng nhập.
echo export NODE_ENV=production >> ~/.bash_profile
Vì vậy, bạn có thể chạy các lệnh như mãi mãi dừng / bắt đầu /PATH_TO_PROJECT/app.js
qua ssh mà không cần thiết lập NODE_ENV
lại.
Tôi đã viết một kịch bản thực hiện chính xác điều này:
https://github.com/chovy/node-startup
Tôi đã không cố gắng mãi mãi, nhưng bạn có thể tùy chỉnh lệnh mà nó chạy, vì vậy nó sẽ được chuyển thẳng:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
Tôi đã thử rất nhiều câu trả lời ở trên. Không ai trong số họ làm việc cho tôi. Ứng dụng của tôi được cài đặt trong /home
và với tư cách là người dùng, không phải là root. Điều này có thể có nghĩa là khi các kịch bản bắt đầu được đề cập ở trên chạy, /home
chưa được gắn kết, vì vậy ứng dụng chưa được khởi động.
Sau đó, tôi tìm thấy các hướng dẫn của Digital Ocean:
Sử dụng PM2 như được giải thích là rất đơn giản và hoạt động hoàn hảo: Các máy chủ ảo của tôi gặp hai sự cố vật lý kể từ khi - thời gian chết chỉ khoảng một phút.
Vấn đề với RC.local là các lệnh được truy cập dưới dạng root khác với việc đăng nhập với tư cách người dùng và sử dụng sudo.
Tôi đã giải quyết vấn đề này bằng cách thêm tập lệnh .sh với các lệnh khởi động tôi muốn etc / profile.d. Mọi tệp .sh trong profile.d sẽ tự động tải và mọi lệnh sẽ được xử lý như thể bạn đã sử dụng sudo thông thường.
Nhược điểm duy nhất của việc này là người dùng được chỉ định cần phải đăng nhập cho những thứ để bắt đầu mà trong tình huống của tôi luôn luôn như vậy.
hoàn thành ví dụ crontab (nằm ở / etc / crontab) ..
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;