Cách thiết lập ứng dụng Node.js để sản xuất trên Debian 9
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à các ứng dụ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 Debian 9 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, sử dụ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 Debian 9, như được mô tả trong hướng dẫn cài đặt server ban đầu cho Debian 9 . 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 Debian 9 .
- 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 Debian 9 sẽ hướng dẫn bạn quy trình nà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 .
Để cài đặt NodeSource PPA và truy cập nội dung của nó, trước tiên bạn cần cập nhật index gói của bạn và cài đặt curl
:
- sudo apt update
- sudo apt install curl
Đảm bảo rằng bạn đang ở trong folder chính của bạn , sau đó 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 trình soạn thảo văn bản ưa thích của bạ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.4
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
cho biết npm
cài đặt module trên phạm vi global , vì vậy 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 siêu user để đặ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 Debian 9. 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