Thứ sáu, 10/01/2014 | 00:00 GMT+7

Cách sử dụng PM2 để thiết lập môi trường sản xuất Node.js trên VPS Ubuntu

Hướng dẫn này nhằm mục đích giúp bạn cài đặt server Ubuntu để chạy các ứng dụng Node.js, bao gồm các ứng dụng dựa trên Express, Geddy hoặc Sails. Những hướng dẫn này sẽ giúp bạn tránh một số lỗi bảo mật, cũng như mang lại một số lợi ích đáng ngạc nhiên như:


  • Bạn sẽ không chạy ứng dụng của bạn dưới dạng root; do đó, ứng dụng của bạn sẽ an toàn hơn.

  • Bạn sẽ sử dụng cổng 80 để chạy ứng dụng của bạn , thường chỉ user root mới có thể truy cập được. (Bạn có thể chạy ứng dụng của bạn bằng URL tùy chỉnh, chẳng hạn như http://mysite.com - nhưng bạn sẽ không phải chỉ định cổng.)

  • Ứng dụng của bạn sẽ khởi động lại nếu nó bị treo và nó sẽ lưu lại log các trường hợp ngoại lệ chưa được khắc phục.

  • Ứng dụng của bạn sẽ khởi động lại khi server khởi động - tức là nó sẽ chạy như một dịch vụ.

Những hướng dẫn này giả định người đọc chỉ có kiến thức cơ bản về Linux. Bạn có thể bỏ qua thông tin mà bạn không cần, nhưng làm theo các bước chặt chẽ có thể mang lại một số lợi ích.

Tạo một account an toàn để chạy mã của bạn


Khi lần đầu tiên cài đặt server DigitalOcean của bạn , bạn đã nhận được hướng dẫn đăng nhập bằng account root . Các hướng dẫn trông giống như sau:

Để đăng nhập vào server của bạn, bạn cần mở cửa sổ dòng lệnh, copy paste chuỗi sau:

ssh root@192.241.xxx.xxx 

Xin lưu ý, '192.241.xxx.xxx' sẽ khác với bạn. Chỉ cần làm theo hướng dẫn bạn nhận được từ DigitalOcean khi server ảo của bạn được cài đặt và đăng nhập bằng ssh.

Như hầu hết ta đều hiểu, nếu bạn chạy mã của bạn bằng account root và nếu một bên thù địch xâm phạm mã, bên đó có thể có toàn quyền kiểm soát VPS của bạn.

Để tránh điều này, hãy cài đặt một account an toàn vẫn có thể thực hiện các hoạt động root nếu ta cung cấp password thích hợp. Đối với mục đích của hướng dẫn này, hãy gọi user an toàn của ta là “safeuser” - bạn có thể đặt tên nó là bất cứ thứ gì bạn thích. Bây giờ, hãy đăng nhập với quyền user root và làm theo các bước sau:

  • Tạo user với một folder trong /home/safeuser/ :
useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser 
  • Tạo password cho user safeuser - bạn cần nhập hai lần sau khi nhập lệnh sau:
passwd safeuser 
  • Cấp cho user quyền an toàn để sử dụng các lệnh cấp root :
usermod -aG sudo username 

Đăng nhập với quyền là user an toàn


Đăng xuất khỏi phiên root DigitalOcean của bạn bằng cách nhấn ctrl-D.

Xin lưu ý lệnh đăng nhập với quyền user an toàn là lệnh giống như lệnh bạn đã sử dụng trước đây, nhưng tên user đã thay đổi. Khi bạn đã đăng nhập với quyền user an toàn, mỗi khi bạn muốn chạy một lệnh có quyền root, bạn sẽ phải tiếp tục lệnh với từ sudo . Từ dòng lệnh trên máy của bạn, hãy đăng nhập bằng lệnh xuất hiện bên dưới.

ssh safeuser@192.241.xxx.xxx 

Cài đặt GIT


Một bạn đã đăng nhập, hãy cài đặt GIT ( ta sẽ sử dụng GIT để cài đặt Node.js.). Nếu, vì bất kỳ lý do gì, bạn không quen với GIT, nó là một công cụ tuyệt đẹp sẽ trở thành một phần quan trọng trong cuộc sống của bạn. Đọc sách GIT nếu bạn muốn biết thêm. Cài đặt nó trên Ubuntu rất dễ dàng:

sudo apt-get install git 

Từ sudo cho biết bạn muốn chạy lệnh này với quyền root. Bạn sẽ được yêu cầu nhập password của bạn - tức là password user an toàn. Khi bạn cung cấp password của bạn , lệnh sẽ chạy.

Cài đặt Node.JS mới nhất


Xin lưu ý v0.10.24 là version Node mới nhất tính đến thời điểm viết bài này. Nếu có version mới hơn, vui lòng sử dụng số version đó để thay thế.

Nhập các lệnh sau, từng dòng một và xem điều kỳ diệu khi server nhỏ của bạn download , biên dịch và cài đặt Node.js:

sudo apt-get install build-essential sudo apt-get install curl openssl libssl-dev git clone https://github.com/joyent/node.git cd node git checkout v0.10.24 ./configure make sudo make install 

Khi bạn gõ sudo make, rất nhiều thứ sẽ xảy ra. Kiên nhẫn.

Khi quá trình thực hiện cài đặt kết thúc, hãy đảm bảo tất cả đều diễn ra tốt đẹp bằng lệnh :

node -v 

Nếu mọi việc suôn sẻ, bạn sẽ thấy: v0.10.24.

Cấp quyền cho user an toàn để sử dụng cổng 80


Lưu ý , ta KHÔNG muốn chạy các ứng dụng của bạn với quyền là user root, nhưng có một trở ngại: user an toàn của bạn không có quyền sử dụng cổng HTTP mặc định (80) . Mục tiêu của bạn là có thể xuất bản một trang web mà khách truy cập có thể sử dụng bằng cách chuyển đến một URL dễ sử dụng như http://mysite.com .

Thật không may, trừ khi bạn đăng nhập bằng quyền root, thông thường bạn sẽ phải sử dụng một URL như http://mysite.com:3000 - hãy lưu ý số cổng.

Rất nhiều người gặp khó khăn ở đây, nhưng giải pháp rất dễ dàng. Có một vài lựa chọn nhưng đây là lựa chọn tôi thích. Nhập các lệnh sau:

sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep /usr/local/bin/node 

Bây giờ, khi bạn nói với một ứng dụng Node rằng bạn muốn nó chạy trên cổng 80, nó sẽ không phàn nàn.

Sử dụng NPM để cài đặt một gói được gọi là PM2.


NPM là trình quản lý gói mà bạn sẽ sử dụng để cài đặt các khung và thư viện để sử dụng với các ứng dụng Node.js của bạn . NPM đã được cài đặt với Node.js. PM2 là một công cụ nhỏ sẽ giải quyết được hai vấn đề cho bạn:

  1. Nó sẽ duy trì trang web bằng cách khởi động lại ứng dụng nếu nó bị lỗi. Những sự cố này KHÔNG nên xảy ra, nhưng bạn nên biết rằng PM2 đã hỗ trợ bạn. (Một số người có thể biết đến Forever.js, một công cụ khác được sử dụng để giữ cho các trang web dựa trên nút hoạt động - tôi nghĩ bạn sẽ thấy rằng PM2 có rất nhiều thứ để cung cấp.)

  2. Nó sẽ giúp bạn bằng cách khởi động lại ứng dụng nút của bạn như một dịch vụ mỗi khi bạn khởi động lại server . Một số người sử dụng biết những cách khác để làm điều này, nhưng pm2 làm cho nó dễ dàng hơn và nó có thêm một số tính linh hoạt.

Cài đặt PM2 bằng lệnh thr sau tại dòng lệnh:

sudo npm install pm2 -g 

Tạo một ứng dụng nút đơn giản


Đây là nơi bạn có thể kiểm tra môi trường của bạn đảm bảo mọi thứ đang hoạt động như bình thường. Trong ví dụ này, tôi sẽ sử dụng địa chỉ IP, nhưng mục tiêu của bạn nên sử dụng domain . Xem các hướng dẫn sau: Cách cài đặt tên server lưu trữ với DigitalOcean

Đầu tiên, hãy tạo một ứng dụng nút đơn giản chỉ để thử nghiệm. Tại dòng lệnh, gõ:

nano app.js 

Sau đó nhập các dòng mã sau vào trình soạn thảo nano:

var http = require('http'); var server = http.createServer(function (request, response) {   response.writeHead(200, {"Content-Type": "text/plain"});   response.end("Hello World\n"); }); server.listen(80); console.log("Server running at http://127.0.0.1:80/"); 

Nhấn ctrl-X để thoát - khi nano hỏi bạn có muốn lưu không, hãy trả lời có.

Đến đây bạn có một ứng dụng dựa trên nút được gọi là app.js mà bạn có thể sử dụng để kiểm tra môi trường của bạn .

Bạn có thể chạy app.js tại dòng lệnh bằng lệnh : node app.js

Làm điều đó và bạn có thể xem văn bản chào thế giới của bạn bằng cách sử dụng trình duyệt và nhập địa chỉ IP của bạn làm URL. Bạn có thể làm gián đoạn việc thực thi bằng cách nhấn crtl-C. Đây KHÔNG phải là cách ta muốn chạy ứng dụng của bạn . Có rất nhiều cách tốt hơn. Ta sẽ sử dụng PM2 để chạy nó thay vì sử dụng Node trực tiếp.

Chạy ứng dụng của bạn bằng PM2 và đảm bảo ứng dụng node.js của bạn tự động khởi động khi server của bạn khởi động lại


Có một số lợi ích to lớn cho bạn nếu bạn chạy ứng dụng của bạn bằng pm2. Thay vì chạy ứng dụng của bạn như trên, hãy chạy ứng dụng bằng lệnh sau:
pm2 start app.js

Bạn sẽ thấy báo cáo này:

Img

Ưu điểm 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ó bị treo.

  • PM2 sẽ lưu giữ log về các ngoại lệ chưa được khắc phục của bạn - trong trường hợp này, trong một file tại /home/safeuser/.pm2/logs/app-err.log.

  • Với một lệnh, PM2 có thể đảm bảo bất kỳ ứng dụng nào mà nó quản lý sẽ khởi động lại khi server 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ụ.

Chạy lệnh này để chạy ứng dụng của bạn dưới dạng dịch vụ bằng lệnh như sau:

sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser 

Xin lưu ý, bạn có thể không sử dụng safeuser làm tên user - hãy sử dụng tên tương ứng với cài đặt của bạn. Bạn sẽ thấy báo cáo sau:

Adding system startup for /etc/init.d/pm2-init.sh ...    /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh    /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh 

Bây giờ mục tiêu đã nêu của ta đã đạt được!

  • Bạn không chạy dưới quyền root; do đó, ứng dụng của bạn an toàn hơn.

  • Bạn đang sử dụng cổng 80, cổng này thường chỉ được dùng bởi user root .

  • Ứng dụng của bạn sẽ khởi động lại nếu nó bị treo và nó sẽ lưu log về các trường hợp ngoại lệ không được khắc phục.

  • Ứng dụng của bạn sẽ khởi động lại khi server khởi động.

Chúc vui vẻ! Đây là một cài đặt khá mạnh mẽ để bắt đầu.

* Sau khi suy nghĩ: * Bạn có thể nhận thấy một folder file có tên là nút trong folder user an toàn. Nó đã được sử dụng trong khi cài đặt, nhưng bạn không cần nó nữa. Bạn có thể xóa nó bằng lệnh như sau:

rm -rf /home/safuser/node 

Còn rất nhiều điều để tìm hiểu về nút, nhưng hướng dẫn này sẽ đưa bạn đi đúng hướng. Để tìm hiểu thêm về pm2, hãy truy cập repo pm2

Làm rõ quan trọng : Có một tập lệnh khởi động để khởi động các ứng dụng Node của bạn, nhưng bạn sẽ tránh được nhiều nhầm lẫn nếu bạn hiểu cách hoạt động của nó. Tập lệnh được gọi là 'pm2-init.sh.' Nó nằm trong folder 'etc / init.d /', nhưng nó KHÔNG khởi động app.js. Thay vào đó, nó khởi động các chương trình đang chạy dưới PM2 vào lần cuối cùng server tắt.

Cái này quan trọng. Nếu ứng dụng nút của bạn không hiển thị trong danh sách khi bạn nhập danh sách pm2, thì ứng dụng của bạn sẽ không khởi động lại khi server khởi động lại. Làm theo hướng dẫn thích hợp để khởi động ứng dụng của bạn bằng pm2 đảm bảo rằng chúng sẽ khởi động lại: pm2 start app.js

Bởi Jim Cassidy


Tags:

Các tin liên quan

Cách sử dụng psad để phát hiện nỗ lực xâm nhập mạng trên VPS Ubuntu
2014-01-10
Cách sử dụng Makefiles để tự động hóa các tác vụ lặp đi lặp lại trên Ubuntu VPS
2014-01-07
Cách thiết lập CouchDB với ElasticSearch trên VPS Ubuntu 13.10
2013-12-30
Cách sử dụng Celery với RabbitMQ để xếp hàng các tác vụ trên Ubuntu VPS
2013-12-19
Cách thiết lập một Honeypot Pháo binh trên VPS Ubuntu
2013-12-04
Cách triển khai Bộ sao chép trong MongoDB trên VPS Ubuntu
2013-12-03
Cách tạo một cụm Sharded trong MongoDB bằng VPS Ubuntu 12.04
2013-12-02
Cách sử dụng ApacheBench để thực hiện kiểm tra tải trên VPS Ubuntu 13.10
2013-11-25
Cách cài đặt control panel Ajenti trên Ubuntu 13.04
2013-11-12
Cách thiết lập và cài đặt Django CMS trên VPS Debian 7 hoặc Ubuntu 13
2013-11-12