Thứ ba, 30/06/2020 | 00:00 GMT+7

Cách thiết lập ứng dụng Node.js để sản xuất trên Ubuntu 20.04

Node.js là một môi trường thời gian chạy JavaScript open-souce để xây dựng các ứng dụng mạng và phía server . Nền tảng này chạy trên Linux, macOS, FreeBSD và Windows. Mặc dù bạn có thể chạy các ứng dụng Node.js bằng dòng lệnh, nhưng hướng dẫn này sẽ tập trung vào việc chạy chúng như một dịch vụ. Điều này nghĩa là chúng sẽ khởi động lại khi khởi động lại hoặc bị lỗi và an toàn để sử dụng trong môi trường production .

Trong hướng dẫn này, bạn sẽ cài đặt môi trường Node.js sẵn sàng production trên một server Ubuntu 20.04 duy nhất. Server này sẽ chạy ứng dụng Node.js do PM2 quản lý và cung cấp cho user quyền truy cập an toàn vào ứng dụng thông qua Reverse Proxy Nginx. Server Nginx sẽ cung cấp HTTPS bằng certificate miễn phí do Let's Encrypt cung cấp.

Yêu cầu

Hướng dẫn này giả định bạn có những điều sau đây:

Khi bạn đã hoàn thành các yêu cầu , bạn sẽ có một server phục vụ trang giữ chỗ mặc định cho domain của bạn tại https:// example.com / .

Bước 1 - Cài đặt Node.js

Hãy bắt đầu bằng cách cài đặt bản phát hành LTS mới nhất của Node.js, sử dụng repository NodeSource .

Đầu tiên, hãy cài đặt NodeSource PPA để có quyền truy cập vào nội dung của nó. Đảm bảo rằng bạn đang ở trong folder chính và sử dụng curl để truy xuất lệnh cài đặt cho version LTS mới nhất của Node.js từ repository của nó.

  • cd ~
  • curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh

Bạn có thể kiểm tra nội dung của tập lệnh này bằng nano hoặc editor bạn muốn :

  • nano nodesource_setup.sh

Khi bạn kiểm tra xong tập lệnh, hãy chạy nó trong sudo :

  • sudo bash nodesource_setup.sh

PPA sẽ được thêm vào cấu hình của bạn và bộ nhớ cache gói local của bạn sẽ được cập nhật tự động. Sau khi chạy tập lệnh cài đặt từ Nodesource, bạn có thể cài đặt gói Node.js:

  • sudo apt install nodejs

Để kiểm tra version Node.js bạn đã cài đặt sau các bước đầu tiên này, hãy nhập:

  • nodejs -v
Output
v14.4.0

Lưu ý: Khi cài đặt từ NodeSource PPA, file thực thi Node.js được gọi là nodejs , thay vì node .

Gói nodejs chứa mã binary nodejs cũng như npm , một trình quản lý gói cho các module Node, vì vậy bạn không cần phải cài đặt npm riêng lẻ.

npm sử dụng file cấu hình trong folder chính của bạn để theo dõi các bản cập nhật. Nó sẽ được tạo lần đầu tiên bạn chạy npm . Thực thi lệnh này để xác minh npm được cài đặt và để tạo file cấu hình:

  • npm -v
Output
6.14.5

Để một số gói npm hoạt động (ví dụ: những gói yêu cầu biên dịch mã từ nguồn), bạn cần cài đặt gói build-essential :

  • sudo apt install build-essential

Đến đây bạn có các công cụ cần thiết để làm việc với các gói npm yêu cầu biên dịch mã từ nguồn.

Với node.js đã được cài đặt, hãy chuyển sang viết ứng dụng Node.js.

Bước 2 - Tạo ứng dụng Node.js

Hãy viết một ứng dụng Hello World trả về “Hello World” cho bất kỳ yêu cầu HTTP nào. Ứng dụng mẫu này sẽ giúp bạn cài đặt Node.js. Bạn có thể thay thế nó bằng ứng dụng của riêng mình - chỉ cần đảm bảo bạn sửa đổi ứng dụng của bạn để lắng nghe các địa chỉ IP và cổng thích hợp.

Đầu tiên, hãy tạo một ứng dụng mẫu có tên hello.js :

  • cd ~
  • nano hello.js

Chèn mã sau vào file :

~ / hello.js
const http = require('http');  const hostname = 'localhost'; const port = 3000;  const server = http.createServer((req, res) => {   res.statusCode = 200;   res.setHeader('Content-Type', 'text/plain');   res.end('Hello World!\n'); });  server.listen(port, hostname, () => {   console.log(`Server running at http://${hostname}:${port}/`); }); 

Lưu file và thoát khỏi editor .

Ứng dụng Node.js này lắng nghe trên địa chỉ được chỉ định ( localhost ) và cổng ( 3000 ), và trả về “Hello World!” với mã thành công 200 HTTP. Vì ta đang lắng nghe trên localhost , các client từ xa sẽ không thể kết nối với ứng dụng của ta .

Để kiểm tra ứng dụng của bạn, hãy nhập:

  • node hello.js

Bạn sẽ nhận được kết quả sau:

Output
Server running at http://localhost:3000/

Lưu ý: Chạy ứng dụng Node.js theo cách này sẽ chặn các lệnh bổ sung cho đến khi ứng dụng bị tắt bằng cách nhấn CTRL+C

Để kiểm tra ứng dụng, hãy mở một phiên terminal khác trên server của bạn và kết nối với localhost bằng curl :

  • curl http://localhost:3000

Nếu bạn nhận được kết quả kết quả sau, ứng dụng đang hoạt động bình thường và đang nghe đúng địa chỉ và cổng:

Output
Hello World!

Nếu bạn không nhận được kết quả mong đợi, hãy đảm bảo ứng dụng Node.js của bạn đang chạy và được cấu hình để lắng nghe trên địa chỉ và cổng thích hợp.

Khi bạn chắc chắn rằng nó đang hoạt động, hãy tắt ứng dụng (nếu bạn chưa có) bằng cách nhấn CTRL+C

Bước 3 - Cài đặt PM2

Tiếp theo, hãy cài đặt PM2, một trình quản lý tiến trình cho các ứng dụng Node.js. PM2 làm cho nó có thể daemonize các ứng dụng để chúng sẽ chạy trong nền như một dịch vụ.

Sử dụng npm để cài đặt version mới nhất của PM2 trên server của bạn:

  • sudo npm install pm2@latest -g

Tùy chọn -g yêu cầu npm cài đặt module trên phạm vi global , để nó có sẵn trên toàn hệ thống.

Đầu tiên, hãy sử dụng lệnh pm2 start để chạy ứng dụng của bạn, hello.js , trong nền:

  • pm2 start hello.js

Điều này cũng thêm ứng dụng của bạn vào danh sách tiến trình của PM2, được xuất ra mỗi khi bạn khởi động ứng dụng:

Output
... [PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/hello.js in fork_mode (1 instance) [PM2] Done. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

Như đã nêu ở trên, PM2 tự động gán App name (dựa trên tên file , không có phần mở rộng .js ) và id PM2. PM2 cũng duy trì các thông tin khác, chẳng hạn như PID của quá trình, trạng thái hiện tại và mức sử dụng bộ nhớ.

Các ứng dụng đang chạy dưới PM2 sẽ tự động khởi động lại nếu ứng dụng gặp sự cố hoặc bị dừng , nhưng ta có thể thực hiện thêm một bước để ứng dụng khởi động khi server khởi động hệ thống bằng lệnh con startup . Lệnh con này tạo và cấu hình tập lệnh khởi động để chạy PM2 và các tiến trình được quản lý của nó khi khởi động server :

  • pm2 startup systemd

Dòng cuối cùng của kết quả kết quả sẽ bao gồm một lệnh chạy với các quyền của user siêu cấp để đặt PM2 bắt đầu khi server khởi động :

Output
[PM2] Init System found: systemd sammy [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Chạy lệnh từ kết quả , với tên user của bạn thay cho sammy :

  • sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Như một bước bổ sung, ta có thể lưu danh sách tiến trình PM2 và các môi trường tương ứng:

  • pm2 save

Đến đây bạn đã tạo một đơn vị systemd chạy pm2 cho user của bạn khi khởi động. Phiên bản pm2 này, lần lượt, chạy hello.js .

Bắt đầu dịch vụ với systemctl :

  • sudo systemctl start pm2-sammy

Nếu tại thời điểm này bạn gặp lỗi, bạn có thể cần phải khởi động lại, điều này bạn có thể đạt được bằng sudo reboot .

Kiểm tra trạng thái của đơn vị systemd:

  • systemctl status pm2-sammy

Để biết tổng quan chi tiết về systemd, vui lòng xem lại Systemd Essentials: Làm việc với Dịch vụ, Đơn vị và Tạp chí .

Ngoài những lệnh mà ta đã đề cập, PM2 cung cấp nhiều lệnh con cho phép bạn quản lý hoặc tra cứu thông tin về các ứng dụng của bạn .

Dừng ứng dụng bằng lệnh này (chỉ định App name hoặc id App name PM2):

  • pm2 stop app_name_or_id

Khởi động lại ứng dụng:

  • pm2 restart app_name_or_id

Liệt kê các ứng dụng hiện do PM2 quản lý:

  • pm2 list

Nhận thông tin về một ứng dụng cụ thể bằng cách sử App name của nó:

  • pm2 info app_name

Màn trình PM2 có thể được kéo lên với monit subcommand. Điều này hiển thị trạng thái ứng dụng, CPU và sử dụng bộ nhớ:

  • pm2 monit

Lưu ý việc chạy pm2 mà không có bất kỳ đối số nào cũng sẽ hiển thị trang trợ giúp với cách sử dụng ví dụ.

Bây giờ ứng dụng Node.js của bạn đang chạy và được quản lý bởi PM2, hãy cài đặt Reverse Proxy .

Bước 4 - Cài đặt Nginx làm server Reverse Proxy

Ứng dụng của bạn đang chạy và nghe trên localhost , nhưng bạn cần cài đặt một cách để user của bạn có thể truy cập nó. Ta sẽ cài đặt web server Nginx làm Reverse Proxy cho mục đích này.

Trong hướng dẫn yêu cầu , bạn cài đặt cấu hình Nginx của bạn trong file /etc/nginx/sites-available/ example.com . Mở file này để chỉnh sửa:

  • sudo nano /etc/nginx/sites-available/example.com

Trong khối server , bạn phải có một location / khối hiện có. Thay thế nội dung của khối đó bằng cấu hình sau. Nếu ứng dụng của bạn được cài đặt để nghe trên một cổng khác, hãy cập nhật phần được đánh dấu thành số cổng chính xác:

/etc/nginx/sites-available/example.com
server { ...     location / {         proxy_pass http://localhost:3000;         proxy_http_version 1.1;         proxy_set_header Upgrade $http_upgrade;         proxy_set_header Connection 'upgrade';         proxy_set_header Host $host;         proxy_cache_bypass $http_upgrade;     } ... } 

Điều này cấu hình server để phản hồi các yêu cầu tại root của nó. Giả sử server của ta có tại example.com , truy cập https:// example.com / qua trình duyệt web sẽ gửi yêu cầu đến hello.js , lắng nghe trên cổng 3000 tại localhost .

Bạn có thể thêm các khối location bổ sung vào cùng một khối server để cung cấp quyền truy cập vào các ứng dụng khác trên cùng một server . Ví dụ: nếu bạn cũng đang chạy một ứng dụng Node.js khác trên cổng 3001 , bạn có thể thêm khối vị trí này để cho phép truy cập vào nó qua https:// example.com / app2 :

/etc/nginx/sites-available/example.com - Tùy chọn
server { ...     location /app2 {         proxy_pass http://localhost:3001;         proxy_http_version 1.1;         proxy_set_header Upgrade $http_upgrade;         proxy_set_header Connection 'upgrade';         proxy_set_header Host $host;         proxy_cache_bypass $http_upgrade;     } ... } 

Khi bạn đã hoàn tất việc thêm các khối vị trí cho các ứng dụng của bạn , hãy lưu file và thoát khỏi editor .

Đảm bảo rằng bạn không mắc phải bất kỳ lỗi cú pháp nào bằng lệnh :

  • sudo nginx -t

Khởi động lại Nginx:

  • sudo systemctl restart nginx

Giả sử rằng ứng dụng Node.js của bạn đang chạy và ứng dụng cũng như cấu hình Nginx của bạn là chính xác, bây giờ bạn có thể truy cập ứng dụng của bạn thông qua Reverse Proxy Nginx. Hãy dùng thử bằng cách truy cập URL của server của bạn (địa chỉ IP công khai hoặc domain của nó).

Kết luận

Xin chúc mừng! Đến đây bạn có ứng dụng Node.js của bạn đang chạy sau Reverse Proxy Nginx trên server Ubuntu 20.04. Cài đặt Reverse Proxy này đủ linh hoạt để cung cấp cho user của bạn quyền truy cập vào các ứng dụng khác hoặc nội dung web tĩnh mà bạn muốn chia sẻ.


Tags:

Các tin liên quan

Cách cài đặt và cấu hình Zabbix để giám sát an toàn server từ xa trên Ubuntu 20.04
2020-06-30
Cách cài đặt WordPress trên Ubuntu 20.04 với LAMP
2020-06-30
Cài đặt Elasticsearch, Logstash và Kibana (Elastic Stack) trên Ubuntu 20.04
2020-06-23
Cách cài đặt TensorFlow trên Ubuntu 20.04
2020-06-23
Cách tạo người dùng mới hỗ trợ Sudo trên Ubuntu 20.04 [Quickstart]
2020-06-22
Cách cài đặt Prosody trên Ubuntu 18.04
2020-06-15
Cách tạo nhóm lưu trữ dự phòng bằng GlusterFS trên Ubuntu 20.04
2020-06-15
Cách tạo lưu trữ dự phòng bằng GlusterFS trên Ubuntu 18.04
2020-06-12
Cách cài đặt và sử dụng TimescaleDB trên Ubuntu 20.04
2020-06-09
Cách thiết lập trang web phát triển Jekyll trên Ubuntu 20.04
2020-06-05