Cài đặt Node.js Application for Production trên Ubuntu 16.04
Node.js là một môi trường 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ể 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 production environment(môi-trường-sản-phẩm).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 (sản-xuất) trên một server Ubuntu 16.04 . 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 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
Giả định bạn có những thứ sau đây:
- Server Ubuntu 16.04, đượ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 Ubuntu 16.04 . - Domain đã trỏ đến IP công khai của server. Hướng dẫn này sẽ sử dụng example.com xuyên suốt.
- Đã cài đặt Nginx, có trong Cách cài đặt Nginx trên Ubuntu 16.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 16.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 web tại https://example.com/.
Hãy bắt đầu bằng cách cài đặt Node.js trên server.
Cài đặt Node.js xxx
Ta sẽ cài đặt bản phát hành 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 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 kho lưu trữ 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 quen dùng):
- 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à cache gói local của bạn sẽ được cập nhật tự động. Sau khi chạy 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ư đã làm ở trên:
- sudo apt-get install nodejs
Gói nodejs
chứa binary (nhị-phân) nodejs
cũng như npm
, vì vậy bạn không cần phải 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 một ứng dụng! Hãy viết một ứng dụng Node.js.
Lưu ý: Khi cài đặt từ NodeSource PPA, file thực thi Node.js được gọi là nodejs
, thay vì node
.
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à một ứ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, 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 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 admin, tức là 1024 trở lên):
#!/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 nên các client từ xa sẽ không thể kết nối vào.
Ứng dụng thử nghiệm
Để kiểm tra ứng dụng của bạn, hãy đánh dấu file thực thi hello.js
:
- chmod +x ./hello.js
Và chạy nó như vậy:
- ./hello.js
Server running at http://localhost:8080/
Lưu ý: Tắt ứng dụng 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 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 lắng nghe địa chỉ và cổng thích hợp:
Hello World
Nếu bạn không thấy kết quả phù 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 tắt) 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à đa dạng hóa các ứng dụng (chạy chúng trong 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 . 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.
Khởi động ứng du ngj
Đ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
Lệnh trên cũng thêm ứng dụng 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:
[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, trạng thái hiện tại và mức sử dụng bộ nhớ của ứng dụng.
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 phải thực hiện thêm một bước để ứng dụng chạy khi khởi động hệ thống. 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:
- 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 superuser:
[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute 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 đã được tạo (tương tự như kết quả được đánh dấu ở trên, nhưng với tên user thay vì sammy
) để cài đặt PM2 bắt đầu khi khởi động (sử dụng lệnh từ kết quả của riêng bạn):
- sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Điều này sẽ tạo một Unit systemd chạy pm2
cho user khi khởi động. Version pm2
này, đến lượt nó, chạy hello.js
. Bạn có thể kiểm tra trạng thái của unit systemd với systemctl
:
- systemctl status pm2-sammy
Để biết tổng quan chi tiết về systemd, hãy xem Systemd Essentials: Working with Services, Units, and the Journal .
Sử dụng PM2 thêm (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.
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 tra cứu bằng lệnh con list
:
- pm2 list
Có thể tìm thêm thông tin về ứ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
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 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 để user truy cập vào 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, ta cài đặt cấu hình Nginx của bạn trong file /etc/nginx/sites-available/default
. Mở file để chỉnh sửa:
- sudo nano /etc/nginx/sites-available/default
Trong khối server
bạn có một khối location /
. 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 đặt để nghe trên một cổng khác với 8080, hãy cập nhật phần thành số cổng chính xác.
. . .
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ó sẵn 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 8080
tại localhost .
Bạn có thể thêm các khối location
bổ sung vào cùng một server block để cung cấp quyền truy cập vào các ứng dụng khác trên cùng 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
:
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 đã 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 không có 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
Khi ứng dụng Node.js của bạn đang chạy ổn với Nginx, bạn có thể truy cập ứng dụng của bạn thông qua Reverse Proxy Nginx. Hãy thử bằng cách truy cập URL của server (đị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 16.04. Cài đặt Reverse Proxy này đủ linh hoạt để cung cấp cho user 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!
Các tin trước
Cài đặt Nginx Server Blocks (Virtual Hosts) trên Ubuntu 16.04 2016-05-19 Cài đặt OpenVPN Server trên Ubuntu 16.04 2016-05-04 Cài đặt JAVA với Apt-Get trên Ubuntu 16.04 2016-04-23 Cài đặt Linux, Apache, MySQL, PHP (LAMP) trên Ubuntu 16.04 2016-04-21 Cài đặt đăng nhập với ssh và key authentication trên Ubuntu 16.4 2016-04-21 Sử dụng UFW căn bản, các luật firewall phổ biến 2015-08-20 Nâng cấp lên Mysql 5.7 2015-04-20 Cấu hình xác thực bằng ssh-key trên server Linux 2014-10-20 Toàn tập làm việc với Openssl và chứng chỉ số 2014-09-12 Cài đặt Nginx trên CentOS 7 2014-07-22