2012-06-18 35 views
55

Chúng tôi hiện đang phát triển một trang web (TYPO3 theo Apache) cho một khách hàng được hỗ trợ bởi ứng dụng node.js/socket.io cung cấp bản cập nhật thời gian thực cho nội dung được phân phát từ CMS.Thiết lập Node.js để dễ triển khai và cập nhật

Vì đây là dự án node.js đầu tiên của chúng tôi, tôi không có bất kỳ phương pháp hay nhất nào để thực hiện khi cài đặt hoàn hảo nên tôi đã dành thời gian nghiên cứu kỹ thuật triển khai.

Một vài câu hỏi vẫn cho tôi để đạt được một thiết lập tốt đó:

  1. là dễ dàng cho khách hàng để triển khai. Điều này rất quan trọng vì trang web của chúng tôi sẽ được tích hợp trong cài đặt TYPO3 'sống', phục vụ nhiều trang web và đang chạy trên các máy chủ không được quản lý bởi khách hàng nhưng tổ chức khác (tập trung) thực hiện cuộc gọi hỗ trợ và thay đổi máy chủ quá trình chậm.

  2. Nên dễ cập nhật. Như đã đề cập yêu cầu khởi động lại và thực hiện thay đổi máy chủ là một quá trình chậm, do đó, việc cài đặt nút nên khởi động lại/cập nhật khi nhận được các thay đổi được đẩy lên phần cài đặt trực tiếp bằng cách sử dụng git.

Deployment

Các general consensus có vẻ là để sử dụng forever khi nói đến việc triển khai các ứng dụng nút để giữ cho chúng chạy. Tôi đã thử nghiệm forever và có vẻ như hoạt động tốt khi được cài đặt bởi npm install forever -g (toàn cầu). Điều này sẽ yêu cầu hỗ trợ bên ngoài để cài đặt trên toàn cầu trên môi trường sống mặc dù, vì vậy tôi muốn có nó chạy từ thư mục node_modules của ứng dụng, nhưng tôi đã không thể tạo một trình bao bọc vững chắc để làm như vậy.

Ngoài ra, forever hoạt động tốt, nhưng nó phải được bắt đầu theo cách thủ công. Điều gì sẽ là cách tiếp cận tốt nhất để đảm bảo rằng nó được bắt đầu trên máy chủ khởi động và tiếp tục chạy?

  • Một đoạn mã đơn giản init.d?
  • Viết trình bao bọc cơ quan giám sát?
  • Tác vụ lên lịch TYPO3 kiểm tra trạng thái forever?

phát triển nhanh/Restart vào cập nhật

Chúng tôi hiện vẫn đang trong giai đoạn phát triển của dự án và mỗi khi tôi thay đổi các ứng dụng Node.js tôi tự khởi động lại node hoặc forever. Điều này làm việc, nhưng là xa lý tưởng. Có một số npm module nhỏ hơn mà rà soát để sửa đổi tập tin và khởi động lại node khi có thay đổi được phát hiện, như:

Có ai có kinh nghiệm với bất kỳ điều nào trong số này không?

Cập nhật: Tại sao bạn không sử dụng Cluster?

Cluster module cung cấp chức năng tương tự thông qua cơ chế reload, nhưng doesn't work with Node 0.5+. Các core Cluster module (Node 0.6+) mà thay thế nó không có tất cả các tính năng này nhưng chỉ cung cấp phân cụm. Mà lần lượt doesn't play well with socket.io. Ít nhất not without using Redis (đó là một vấn đề đối với chúng tôi, bởi vì chúng tôi không thể buộc một dịch vụ prereq khác cho khách hàng).

-

Rõ ràng là tôi đang cố gắng để tìm ra giải pháp ổn định nhất mà kết hợp một update-restarter với forever trước khi bàn giao dự án cho khách hàng và tôi thực sự hy vọng bất cứ ai đã tạo ra một sự kết hợp đã được chứng minh của kỹ thuật.

+0

và cho bất kỳ ai khác nghĩ về Cluster: nó chưa được cập nhật trong ba năm qua. – oligofren

Trả lời

63

Kết hợp tất cả kiến ​​thức được thu thập (Cảm ơn Julian Knight cho ý tưởng) và các phương pháp được kiểm tra trong tuần qua, tôi đã quyết định giải quyết cho giải pháp triển khai được mô tả bên dưới (Tôi nghĩ mình sẽ chia sẻ để giúp người khác với những câu hỏi tương tự):

Auto-khởi động lại về lỗi script nạp lại tự động trên kịch bản thay đổi được xử lý bởi forever, vì nó cũng bao gồm một kịch bản đồng hồ, miễn là Vô hạn được sinh ra từ bên trong một Node.js kịch bản.

Để làm như vậy, tôi đã thêm một server.js để khởi động kịch bản app.js chúng tôi thực sự muốn chạy:

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); 

này sẽ giám sát tất cả các file trong thư mục ứng dụng cho thay đổi và khởi động lại tập lệnh đang chạy trong forever ngay sau khi một thay đổi. Bởi vì các bản ghi và pidfile là trong thư mục con của ứng dụng, những phải được bỏ qua từ tập tin xem, hoặc kịch bản sẽ khởi động lại vòng lặp:

.foreverignore

pids/** 
logs/** 

Để làm điều này tất cả bắt đầu vào khởi động hệ thống và cho phép chúng tôi dễ dàng kiểm soát dịch vụ bằng cách sử dụng start node-appstop node-app chúng tôi sử dụng Ubuntu's Upstart. tôi đã kết hợp hai ví dụ (thisthis một) thành một mà không được công việc khá tốt:

/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 <[email protected]>" 
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 

Như Kevin wisely mentions in his article đó là khôn ngoan khi chạy nút dưới dạng gốc, vì vậy chúng tôi sẽ thay đổi thành exec sudo -u www-data /usr/local/bin/node khi chúng tôi chuyển sang máy chủ mới vào tuần tới.

Vì vậy, forever được bắt đầu tự động bởi node server.js được khởi chạy bởi upstart và giám sát các sự cố và thay đổi tệp, giữ toàn bộ quá trình thiết lập chạy miễn là chúng tôi muốn.

Tôi hy vọng điều này sẽ giúp mọi người.

+0

Tôi đã thử điều này và tôi không thể làm cho nó hoạt động, bạn có thể giúp tôi không? http://stackoverflow.com/questions/15639828/nodejs-and-forever-monitoring-and-restarting-app – alexandernst

+2

Tôi đã sử dụng cùng một tập lệnh khởi động này và khi sử dụng Upstart trên Amazon Linux (v 0.6.5) tập lệnh mới nổi sẽ treo , đặc biệt đáng chú ý với 'sudo start node-app'. Tôi đã phải loại bỏ 'mong đợi ngã ba' bởi vì quá trình nút của tôi đã không ngã ba, vì vậy Upstart đã chờ đợi một SIGCHLD mà sẽ không bao giờ đến. Câu trả lời tuyệt vời mặc dù, cảm ơn rất nhiều! – clay

5

Bạn có thể sử dụng tốt hơn, để sử dụng trong sản xuất, để xem một số thứ như Cluster. Bạn có thể không muốn các tính năng của cụm nhưng nó cũng bao gồm các tính năng sản xuất khác như khởi động lại thời gian ngừng hoạt động, ghi nhật ký, công nhân, v.v.

Như bạn nói, Forever là OK để thử nghiệm nhưng thực sự không có gì để sản xuất sử dụng.

tôi dường như mơ hồ nhớ rằng cụm hoặc một cái gì đó tương tự có thể được áp dụng vào Node bản thân đến v0.7

+0

Nghe có vẻ như giải pháp hoàn hảo, nhưng tiếc là nó sẽ không hoạt động. [Các mô-đun lõi lõi mà tàu với Node 0.6+] (http://nodejs.org/api/cluster.html) là xương trần khá và không đi kèm với tất cả các tính năng ưa thích mà chúng tôi đang _actually_ quan tâm. Hơn nữa, [module 'cũ'] (https://github.com/LearnBoost/cluster) không [làm việc với Node 0.5+] (https://github.com/kriszyp/multi-node/issues/14). Quá tệ, nhưng đây không phải là giải pháp. Cảm ơn rất nhiều vì đã gợi ý! –

+0

Doh! Rất tiếc, tôi chưa đặt bất kỳ Node.js nào vào sản xuất nên tôi đã bỏ lỡ điều này. Một trong những lý do tôi chưa cam kết với Node là thiếu sự trưởng thành rõ ràng của nó. Hy vọng rằng 0,7 sẽ đi một số cách để sửa chữa này, nhưng có một sự thiếu hụt lớn về tài liệu mà cũng cần cắm. –

7

Kể từ khi câu trả lời cuối cùng của tôi là dành cho tương lai! Dưới đây là một số liên kết khác để hỗ trợ:

Có làm chưa dường như là một câu trả lời hoàn hảo nhưng có rất nhiều người chạy các phiên bản Node sản xuất. Hy vọng rằng điều này sẽ chỉ cho bạn đi đúng hướng.

+0

Cảm ơn bạn rất nhiều vì đã giúp bạn giải quyết vấn đề này! Liên kết đầu tiên của bạn giúp tôi đi đúng hướng với giải pháp 'upstart' mà tôi đã đi đến cuối cùng (xem câu trả lời của riêng tôi cho giải pháp kết hợp). Rất nhiều đánh giá cao nghiên cứu của bạn! –

+1

Đừng lo lắng, xin lỗi tôi không thể trả lời trực tiếp hơn. Xin vui lòng đánh dấu câu trả lời của riêng bạn là * Câu trả lời * mặc dù, bạn được khuyến khích để làm điều đó, nó là hoàn toàn chấp nhận được. –

Các vấn đề liên quan