Cách thiết lập ứng dụng Node.js để sản xuất trên Ubuntu 18.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 18.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:
- Cài đặt server Ubuntu 18.04, như được mô tả trong hướng dẫn cài đặt server ban đầu cho Ubuntu 18.04 . Bạn nên có một user không phải root có quyền sudo và firewall hoạt động.
- Tên domain trỏ đến IP công cộng của server của bạn . Hướng dẫn này sẽ sử dụng domain example.com xuyên suốt.
- Đã cài đặt Nginx, như được đề cập trong Cách cài đặt Nginx trên Ubuntu 18.04 .
- Nginx được cấu hình với SSL bằng certificate Let's Encrypt. Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04 sẽ hướng dẫn bạn quy trình.
 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  của bạn  và sử dụng curl để truy xuất  lệnh cài đặt  cho các repository  Node.js 8.x:
- cd ~ 
- curl -sL https://deb.nodesource.com/setup_8.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 
Outputv8.11.3 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 
Output5.6.0 Để 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 :
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ẽ thấy kết quả sau:
OutputServer 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 thấy kết quả sau, ứng dụng đang hoạt động bình thường và đang nghe trên địa chỉ và cổng chính xác:
OutputHello World! Nếu bạn không thấy 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. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐ │ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤ │ hello    │ 0  │ fork │ 1338 │ online │ 0       │ 0s     │ 0%  │ 23.0 MB   │ sammy │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘  Use `pm2 show <id|name>` to get more details about an app  Như bạn thấy , 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 [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 
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, hãy xem 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:
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 :
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 18.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ẻ.
Các tin liên quan
Cách cài đặt và cấu hình Nextcloud trên Ubuntu 18.042018-07-05
Cách thiết lập firewall với UFW trên Ubuntu 18.04
2018-07-05
Cách thiết lập NFS Mount trên Ubuntu 18.04
2018-07-05
Cách cài đặt và cấu hình ownCloud trên Ubuntu 18.04
2018-07-05
Cách thêm không gian swap trên Ubuntu 18.04
2018-07-05
Triển khai các ứng dụng React với Webhooks và Slack trên Ubuntu 16.04
2018-06-20
Cách đảm bảo chất lượng mã bằng SonarQube trên Ubuntu 16.04
2018-06-14
Cách cài đặt Webmin trên Ubuntu 18.04
2018-05-17
Cách thiết lập chia sẻ Samba cho tổ chức nhỏ trên Ubuntu 16.04
2018-05-11
Cách tự động hóa triển khai Elixir-Phoenix với Distillery và edeliver trên Ubuntu 16.04
2018-05-03
 

