[英]Node.js setup for easy deployment and updating
我們目前正在為一個客戶開發一個網站(Apache下的TYPO3),該網站由node.js / socket.io應用程序提供支持,該應用程序為CMS提供的內容提供實時更新。
由於這是我們的第一個node.js項目,因此我在“完美設置”方面沒有任何最佳實踐,因此我花了一些時間研究部署技術。
我仍然有幾個問題可以實現一個良好的設置:
易於部署客戶 。 這一點非常重要,因為我們的網站將整合到他們的“實時”TYPO3安裝中,該安裝服務於大量網站,並且運行在不是由客戶管理的服務器上,而是另一個(集中式)組織,它支持呼叫和服務器更改。進程緩慢。
應該很容易更新。 如上所述,請求重新啟動並進行服務器更改是一個緩慢的過程,因此理想情況下,節點安裝應該在收到使用git
推送到live installion的更改時重新啟動/更新。
部署
在部署節點應用程序以使其運行時, 普遍的共識似乎是forever
使用。 我已經forever
測試forever
,並且在npm install forever -g
(global) npm install forever -g
時似乎工作正常。 這需要外部幫助來全局安裝在實時環境中,所以我更喜歡從應用程序的node_modules
目錄運行它,但是我無法創建一個可靠的包裝器來執行此操作。
此外, forever
工作正常,但必須手動啟動。 什么是確保它在服務器啟動時啟動並保持運行的最佳方法?
init.d
腳本? forever
檢查狀態? 快速開發/重新啟動更新
我們目前仍處於項目的開發階段,每次我對node.js應用程序進行更改時,我都會手動重啟node
或forever
。 這有效,但遠非理想。 有幾個較小的npm
模塊檢查文件修改並在檢測到更改時重新啟動node
,例如:
有沒有人有這些經驗?
更新:你為什么不只使用群集?
Cluster模塊通過重新加載機制提供類似的功能,但不適用於Node 0.5+ 。 替換它的核心群集模塊(節點0.6+)沒有所有這些功能,只提供群集。 而這反過來又不適合socket.io 。 至少沒有使用Redis (這對我們來說是一個問題,因為我們不能強迫客戶使用另一個先決條件服務)。
-
顯然,我正在嘗試找到最穩定的解決方案,在將項目交給客戶之前將更新重啟器與forever
結合起來,我真的希望有人能夠生成經過驗證的技術組合。
結合所有收集的知識(非常感謝Julian Knight的想法)和過去一周測試的方法,我決定采用下面描述的部署解決方案(我認為我很樂意分享以幫助其他人提出類似的問題):
腳本錯誤的自動重啟和腳本更改的自動重新加載是永遠處理的,因為它還包括腳本監視,只要Forever是從node.js腳本中生成的。
為此,我添加了一個server.js
來啟動我們實際想要運行的app.js
腳本:
server.js
var forever = require('forever'),
child = new(forever.Monitor)('app.js', {
'silent': false,
'pidFile': 'pids/app.pid',
'watch': true,
'watchDirectory': '.', // Top-level directory to watch from.
'watchIgnoreDotFiles': true, // whether to ignore dot files
'watchIgnorePatterns': [], // array of glob patterns to ignore, merged with contents of watchDirectory + '/.foreverignore' file
'logFile': 'logs/forever.log', // Path to log output from forever process (when daemonized)
'outFile': 'logs/forever.out', // Path to log output from child stdout
'errFile': 'logs/forever.err'
});
child.start();
forever.startServer(child);
這種手表在應用程序目錄中的所有文件更改並重新啟動在運行該腳本forever
只要一個變化。 由於日志和pidfile位於應用程序的子目錄中,因此必須從文件監視中忽略這些日志,否則腳本將循環重新啟動:
.foreverignore
pids/**
logs/**
為了使這一切始於系統啟動並使我們能夠使用start node-app
和stop node-app
輕松控制服務,我們使用Ubuntu的Upstart 。 我把兩個例子( 這個和這一個)組合成一個很好地完成工作的例子:
/etc/init/node-app.conf
# This is an upstart (http://upstart.ubuntu.com/) script
# to run the node.js server on system boot and make it
# manageable with commands such as
# 'start node-app' and 'stop node-app'
#
# This script is to be placed in /etc/init to work with upstart.
#
# Internally the 'initctl' command is used to manage:
# initctl help
# initctl status node-app
# initctl reload node-app
# initctl start node-app
description "node.js forever server for node-app"
author "Remco Overdijk <remco@maxserv.nl>"
version "1.0"
expect fork
# 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
env HOME=/home/user/node-app-dir
script
# Not sure why $HOME is needed, but we found that it is:
export HOME=$HOME
chdir $HOME
exec /usr/local/bin/node server.js > logs/node.log &
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
正如凱文明智地在他的文章中提到的那樣以root身份運行節點是不明智的,所以當我們下周遷移到新服務器時,我們將把它改為exec sudo -u www-data /usr/local/bin/node
。
因此, forever
由node server.js
自動啟動,它由upstart
啟動,並監視崩潰和文件更改,保持整個設置運行,只要我們想要。
我希望這可以幫助任何人。
因為我的最后一個答案是為了將來! 以下是一些其他輔助鏈接:
似乎還沒有一個完美的答案,但有很多人在運行生產節點實例。 希望這會指出你正確的方向。
對於生產用途,您可能會更好地關注像Cluster這樣的東西。 您可能不需要群集功能,但它還包括其他生產功能,例如零停機重啟,日志記錄,工作人員等。
正如您所說,Forever可以進行測試,但實際上並沒有生產使用所需的功能。
我似乎依稀記得,群集或類似的東西可能會被采納到Node本身來v0.7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.