Cách tốt nhất để triển khai Node.js là gì?
Tôi có một Dreamhost VPS (đó là cái mà họ gọi là VM ) và tôi đã có thể cài đặt Node.js và thiết lập proxy. Điều này hoạt động rất tốt miễn là tôi giữ kết nối SSH mà tôi đã bắt đầu mở nút.
Cách tốt nhất để triển khai Node.js là gì?
Tôi có một Dreamhost VPS (đó là cái mà họ gọi là VM ) và tôi đã có thể cài đặt Node.js và thiết lập proxy. Điều này hoạt động rất tốt miễn là tôi giữ kết nối SSH mà tôi đã bắt đầu mở nút.
Câu trả lời:
Câu trả lời năm 2016 : gần như mọi bản phân phối Linux đều đi kèm với systemd, có nghĩa là mãi mãi, monit, PM2, v.v. không còn cần thiết nữa - HĐH của bạn đã xử lý các tác vụ này .
Tạo một myapp.service
tệp (rõ ràng thay thế 'myapp' bằng tên ứng dụng của bạn):
[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
Lưu ý nếu bạn chưa quen với Unix: /var/www/myapp/app.js
nên có #!/usr/bin/env node
ngay dòng đầu tiên.
Sao chép tập tin dịch vụ của bạn vào /etc/systemd/system
thư mục.
Nói với systemd về dịch vụ mới với systemctl daemon-reload
.
Bắt đầu với systemctl start myapp
.
Cho phép nó chạy khi khởi động với systemctl enable myapp
.
Xem nhật ký với journalctl -u myapp
Điều này được lấy từ Cách chúng tôi triển khai các ứng dụng nút trên Linux, phiên bản 2018 , cũng bao gồm các lệnh để tạo AWS / DigitalOcean / Azure CloudConfig để xây dựng máy chủ Linux / nút (bao gồm cả .service
tệp).
Failed to issue method call: Unit name ... is not valid.
?
/etc/systemd/system
bạn có thể cần chạy systemctl daemon-reload
(systemd thường sẽ cho bạn biết nếu điều này là cần thiết). TBH này được hỏi tốt nhất là một câu hỏi riêng biệt.
/etc/systemd/system
, bạn chỉ có thể sử dụng systemctl enable /full/path/to/myapp.service
, điều này tạo ra một liên kết tượng trưng /etc/systemd/system
cho bạn.
node
được gọi bằng /var/www/myapp/app.js
chính nó. Trong Unix, nếu bạn tạo một tệp thực thi và dòng đầu tiên bắt đầu với #!/some/file
tệp sẽ được diễn giải với tệp nhị phân đó. Google 'phiên dịch Unix' để biết thêm.
Sử dụng mãi mãi . Nó chạy các chương trình Node.js trong các quy trình riêng biệt và khởi động lại chúng nếu có chết.
Sử dụng:
forever start example.js
để bắt đầu một quá trình.forever list
để xem danh sách tất cả các quy trình bắt đầu mãi mãiforever stop example.js
để dừng quá trình hoặc forever stop 0
dừng quá trình với chỉ số 0 (như được hiển thị bởi forever list
).forever stop 0
có một lỗi và mọi thứ chỉ rơi ra từ đó. Tôi đã cố gắng làm điều này mà không cần root trên chính người dùng của mình để tôi có thể dọn dẹp dễ dàng một khi tôi tìm được giải pháp phù hợp. Đó có thể là vấn đề của tôi. Tôi sẽ xem xét thêm một số.
Tôi đã viết về phương thức triển khai của mình ở đây: Triển khai các ứng dụng node.js
Nói ngắn gọn:
pm2 thực hiện các thủ thuật.
Các tính năng là: Giám sát, tải lại mã nóng, cân bằng tải tích hợp, tập lệnh khởi động tự động và quá trình hồi sinh / kết xuất.
Bạn có thể sử dụng monit
, forever
, upstart
hoặc systemd
để bắt đầu máy chủ của bạn.
Bạn có thể sử dụng Varnish hoặc HAProxy thay vì Nginx (Nginx được biết là không hoạt động với websockets).
Là một giải pháp nhanh chóng và bẩn thỉu, bạn có thể sử dụng nohup node your_app.js &
để ngăn chặn ứng dụng của mình chấm dứt với máy chủ của mình, nhưng forever
, monit
và các giải pháp được đề xuất khác là tốt hơn.
Tôi đã tạo một tập lệnh Upstart hiện đang được sử dụng cho các ứng dụng của mình:
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
Tùy chỉnh tất cả trước khi #########, tạo một tệp trong /etc/init/your-service.conf và dán nó vào đó.
Sau đó bạn có thể:
start your-service
stop your-service
restart your-service
status your-service
Tôi đã viết một hướng dẫn khá toàn diện để triển khai Node.js, với các tệp ví dụ:
Hướng dẫn: Cách triển khai các ứng dụng Node.js, với các ví dụ
Đây là một bài viết dài hơn về việc giải quyết vấn đề này với systemd: http://savanne.be/articles/deploying-node-js-with-systemd/
Một số điều cần lưu ý:
Tất cả những điều này được thực hiện dễ dàng với systemd.
Nếu bạn có quyền truy cập root, tốt hơn bạn nên thiết lập một daemon để nó chạy an toàn và âm thanh trong nền. Bạn có thể đọc cách làm điều đó đối với Debian và Ubuntu trong bài đăng trên blog Chạy Node.js dưới dạng Dịch vụ trên Ubuntu .
Mãi mãi sẽ làm nên chuyện.
@Kevin: Bạn sẽ có thể giết quá trình tốt. Tôi sẽ kiểm tra lại tài liệu một chút. Nếu bạn có thể tái tạo lỗi, sẽ rất tuyệt nếu đăng nó thành một vấn đề trên GitHub.
Hãy thử điều này: http : //www.tĩ-ebay.de/the-teams/mobile-de/blog/deploying-node-appluggest-with-capistrano-github-nginx-and-upstart.html
Hướng dẫn tuyệt vời và chi tiết để triển khai các ứng dụng Node.js với Capistrano, Upstart và Nginx
Như Box9 đã nói, Mãi mãi là một lựa chọn tốt cho mã sản xuất. Nhưng cũng có thể tiếp tục quá trình ngay cả khi kết nối SSH bị đóng khỏi máy khách.
Mặc dù không nhất thiết là một ý tưởng tốt cho sản xuất, nhưng điều này rất tiện lợi khi ở giữa các phiên gỡ lỗi dài hoặc theo dõi đầu ra của bàn điều khiển của các quy trình dài hoặc bất cứ khi nào hữu ích để ngắt kết nối SSH của bạn, nhưng giữ cho thiết bị đầu cuối tồn tại trong máy chủ để kết nối lại sau (như khởi động ứng dụng Node.js tại nhà và kết nối lại với bàn điều khiển sau này tại nơi làm việc để kiểm tra xem mọi thứ đang diễn ra như thế nào).
Giả sử rằng máy chủ của bạn là hộp * nix, bạn có thể sử dụng lệnh màn hình từ trình bao để duy trì quá trình chạy ngay cả khi máy khách SSH bị đóng. Bạn có thể tải xuống / cài đặt màn hình từ web nếu chưa được cài đặt (tìm gói cho bản phân phối của bạn nếu Linux hoặc sử dụng MacPorts nếu OS X).
Nó hoạt động như sau:
Bạn có thể có nhiều phiên màn hình chạy đồng thời như thế này nếu bạn cần và bạn có thể kết nối với bất kỳ phiên nào từ bất kỳ máy khách nào. Đọc tài liệu trực tuyến cho tất cả các tùy chọn.
Mãi mãi là một lựa chọn tốt để duy trì các ứng dụng chạy (và npm có thể cài đặt như một mô-đun tốt đẹp).
Nhưng đối với 'triển khai' nghiêm trọng hơn - những thứ như quản lý từ xa về triển khai, khởi động lại, chạy các lệnh, v.v. - Tôi sẽ sử dụng capistrano với phần mở rộng nút.
https://paastor.com là một dịch vụ tương đối mới triển khai cho bạn, đến VPS hoặc máy chủ khác. Có một CLI để đẩy mã. Paastor có một cấp miễn phí, ít nhất là nó đã làm tại thời điểm đăng bài này.
Trong trường hợp của bạn, bạn có thể sử dụng trình nền mới bắt đầu . Đối với một giải pháp triển khai hoàn chỉnh, tôi có thể đề xuất capistrano . Hai hướng dẫn hữu ích là Cách thiết lập Node.js env và Cách triển khai qua capistrano + mới bắt đầu .
Hãy thử nút-triển khai-máy chủ . Nó là một bộ công cụ phức tạp để triển khai một ứng dụng lên các máy chủ riêng của bạn. Nó được viết bằng Node.js và sử dụng npm để cài đặt.