Thứ năm, 29/12/2016 | 00:00 GMT+7

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

Node.js là một môi trường thời gian chạy JavaScript open-souce để dễ dàng 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, OS X, FreeBSD và Windows. Các ứng dụng Node.js có thể được chạy bằng dòng lệnh, nhưng ta sẽ tập trung vào việc chạy chúng như một dịch vụ để chúng sẽ tự động khởi động lại khi khởi động lại hoặc bị lỗi và được dùng an toàn trong môi trường production .

Trong hướng dẫn này, ta sẽ đề cập đến việc cài đặt môi trường Node.js sẵn sàng production trên một server Debian 8 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.

Yêu cầu

Hướng dẫn này giả định bạn có server Debian 8, được cấu hình với user không phải root có quyền sudo , như được mô tả trong hướng dẫn cài đặt server ban đầu cho Debian 8 .

Nó cũng giả định bạn có một domain , trỏ đến địa chỉ IP công cộng của server .

Hãy bắt đầu bằng cách cài đặt node.js trên server của bạn.

Cài đặt Node.js

Ta sẽ cài đặt version LTS mới nhất của Node.js, sử dụng repository NodeSource .

Trước tiên, bạn cần 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 6.x:

  • cd ~
  • curl -sL https://deb.nodesource.com/setup_6.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

Và chạy script dưới 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ừ nodeource, bạn có thể cài đặt gói Node.js theo cách tương tự như bạn đã làm ở trên:

  • sudo apt-get install nodejs

Gói nodejs chứa binary nodejs cũng như npm , vì vậy bạn không cần cài đặt npm riêng lẻ. Tuy nhiên, để một số gói npm hoạt động (chẳng hạn như 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-get install build-essential

Node.js hiện đã được cài đặt và sẵn sàng chạy ứng dụng! Hãy viết một ứng dụng Node.js.

Tạo ứng dụng Node.js

Ta sẽ viết một ứng dụng Hello World chỉ trả về “Hello World” cho bất kỳ yêu cầu HTTP nào. Đây là ứng dụng mẫu sẽ giúp bạn cài đặt Node.js, bạn có thể thay thế ứng dụng này 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.

Hello World Code

Đầu tiên, hãy tạo và mở ứng dụng Node.js của bạn để chỉnh sửa. Đối với hướng dẫn này, ta sẽ sử dụng nano để chỉnh sửa một ứng dụng mẫu có tên hello.js :

  • cd ~
  • nano hello.js

Chèn mã sau vào file . Nếu bạn muốn, bạn có thể thay thế cổng được đánh dấu, 8080 , ở cả hai vị trí (hãy đảm bảo sử dụng cổng không phải administrator , tức là 1024 trở lên):

xin chào.js
#!/usr/bin/env nodejs var http = require('http'); http.createServer(function (req, res) {   res.writeHead(200, {'Content-Type': 'text/plain'});   res.end('Hello World\n'); }).listen(8080, 'localhost'); console.log('Server running at http://localhost:8080/'); 

Bây giờ lưu và thoát.

Ứng dụng Node.js này chỉ cần lắng nghe trên địa chỉ được chỉ định ( localhost ) và cổng ( 8080 ), 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 .

Ứng dụng thử nghiệm

Để cho phép ta kiểm tra ứng dụng, hãy đánh dấu file thực thi hello.js :

  • chmod +x ./hello.js

Và chạy nó như vậy:

  • ./hello.js
Output
Server running at http://localhost:8080/

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:8080

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 thích hợp:

Output
Hello World

Nếu bạn không thấy kết quả thích hợp, 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.

Cài đặt PM2

Bây giờ ta sẽ cài đặt PM2, là một trình quản lý tiến trình cho các ứng dụng Node.js. PM2 cung cấp một cách dễ dàng để quản lý và daemonize các ứng dụng (chạy chúng ở chế độ nền như một dịch vụ).

Ta sẽ sử dụng npm , một trình quản lý gói cho các module Node cài đặt với Node.js, để cài đặt PM2 trên server của ta . Sử dụng lệnh này để cài đặt PM2:

  • sudo npm install -g pm2

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.

Quản lý ứng dụng với PM2

PM2 rất đơn giản và dễ sử dụng. Ta sẽ trình bày một vài cách sử dụng cơ bản của PM2.

Bắt đầu ứng dụng

Điều đầu tiên bạn cần làm là 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 [PM2] PM2 Successfully daemonized [PM2] Starting hello.js in fork_mode (1 instance) [PM2] Done. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ │ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app

Như bạn thấy , PM2 tự động gán tên Ứng dụng (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 bị treo hoặc bị dừng , nhưng cần thực hiện thêm một bước để ứng dụng chạy khi khởi động hệ thống (khởi động hoặc khởi động lại). May mắn là PM2 cung cấp một cách dễ dàng để thực hiện việc này, lệnh con startup .

Lệnh con startup 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 . Bạn cũng phải chỉ định nền tảng bạn đang chạy, đó là ubuntu , trong trường hợp của ta :

  • 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 mà bạn phải chạy với các quyền của user siêu cấp:

Output
[PM2] You have to run this command as root. Execute the following command: sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Chạy lệnh đã được tạo (tương tự như kết quả được đánh dấu ở trên, nhưng với tên user của bạn thay vì sammy ) để cài đặt PM2 để bắt đầu khởi động (sử dụng lệnh từ kết quả của bạn ):

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

Điều này sẽ 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ạn có thể kiểm tra trạng thái của đơn vị systemd với systemctl :

  • systemctl status pm2

Để 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í .

Sử dụng PM2 khác (Tùy chọn)

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 . Lưu ý việc chạy pm2 mà không có bất kỳ đối số nào sẽ hiển thị trang trợ giúp, bao gồm cả cách sử dụng ví dụ, trình bày cách sử dụng PM2 chi tiết hơn phần này của hướng dẫ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 bằng lệnh này (chỉ định App name hoặc id App name PM2):

  • pm2 restart app_name_or_id

Danh sách các ứng dụng hiện do PM2 quản lý cũng có thể được tra cứu bằng lệnh con list :

  • pm2 list

Có thể tìm thấy thêm thông tin về một ứng dụng cụ thể bằng cách sử dụng lệnh con info (chỉ định tên hoặc id Ứng dụng PM2):

  • pm2 info example

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

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 .

Cài đặt Nginx làm server Reverse Proxy

Bây giờ ứng dụng của bạn đang chạy và đang nghe trên localhost , bạn cần cài đặt một cách để user của bạn có thể truy cập vào nó. Ta sẽ cài đặt web server Nginx làm Reverse Proxy cho mục đích này. Hướng dẫn này sẽ cài đặt một server Nginx từ đầu. Nếu bạn đã có cài đặt server Nginx, bạn chỉ có thể sao chép khối location vào khối server mà bạn chọn (đảm bảo vị trí không xung đột với bất kỳ nội dung hiện có nào trên web server của bạn).

Trước tiên, hãy cài đặt Nginx bằng apt-get:

  • sudo apt-get install nginx

Bây giờ hãy mở file cấu hình khối server mặc định để chỉnh sửa:

  • sudo nano /etc/nginx/sites-available/default

Xóa mọi thứ trong file và chèn cấu hình sau. Đảm bảo thay thế domain của bạn cho chỉ thị server_name . Ngoài ra, hãy thay đổi cổng ( 8080 ) nếu ứng dụng của bạn được đặt để nghe trên một cổng khác:

/ etc / nginx / sites-available / default
server {     listen 80;      server_name example.com;      location / {         proxy_pass http://localhost:8080;         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ó sẵn tại example.com , việc truy cập http://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 8080 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 8081 , bạn có thể thêm khối vị trí này để cho phép truy cập vào nó qua http://example.com/app2 :

Cấu hình Nginx - Vị trí bổ sung
    location /app2 {         proxy_pass http://localhost:8081;         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 và thoát.

Đả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

Tiếp theo, khởi động lại Nginx:

  • sudo systemctl restart nginx

Tiếp theo, cho phép lưu lượng truy cập vào Nginx thông qua firewall , nếu bạn đã bật nó.

Nếu bạn đang sử dụng ufw , bạn có thể sử dụng lệnh sau:

  • sudo ufw allow 'Nginx Full'

Với ufw , bạn luôn có thể kiểm tra trạng thái bằng lệnh sau:

  • sudo ufw status

Nếu bạn đang sử dụng IPTables thay vào đó, bạn có thể cho phép lưu lượng truy cập vào Nginx bằng cách sử dụng lệnh sau:

  • sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Bạn luôn có thể kiểm tra trạng thái IPTables của bạn bằng cách chạy lệnh sau:

  • sudo iptables -S

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ó).

Từ đây, bạn nên tiếp tục bảo mật cài đặt của bạn bằng cách đọc Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8 .

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 8. 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ẻ. Chúc may mắn với sự phát triển Node.js của bạn!


Tags:

Các tin liên quan